1+ name : LAVA Job Render
2+ description : >
3+ Resolves flash_files + rootfs presigned URLs, writes cloudData.json +
4+ metadata.json, renders a LAVA job definition with BOOT_METHOD=flasher
5+ and --video_pre-merge tests, then patches device_type to correct lavaname.
6+
7+ inputs :
8+ docker_image :
9+ description : Docker image to use for rendering
10+ required : true
11+ machine :
12+ description : Target machine name (e.g. qcs9100-ride-sx)
13+ required : true
14+ lavaname :
15+ description : LAVA device-type name (e.g. qcs9100-ride)
16+ required : true
17+ presigned_urls_file :
18+ description : Absolute path to presigned_urls.json from the build job
19+ required : true
20+
21+ runs :
22+ using : " composite"
23+ steps :
24+
25+ - name : Extract presigned URLs for this machine
26+ id : get_urls
27+ shell : bash
28+ env :
29+ MACHINE : ${{ inputs.machine }}
30+ PRESIGNED_FILE : ${{ inputs.presigned_urls_file }}
31+ run : |
32+ set -euo pipefail
33+
34+ flash_key="${MACHINE}_flash_files.tar"
35+ rootfs_key="${MACHINE}_rootfs.img"
36+
37+ if [ ! -f "$PRESIGNED_FILE" ]; then
38+ echo "❌ presigned_urls.json not found at: $PRESIGNED_FILE"
39+ exit 1
40+ fi
41+
42+ echo "=== presigned_urls.json keys ==="
43+ jq -r 'keys[]' "$PRESIGNED_FILE"
44+
45+ flash_url="$(jq -r --arg key "$flash_key" '.[$key] // empty' "$PRESIGNED_FILE")"
46+ rootfs_url="$(jq -r --arg key "$rootfs_key" '.[$key] // empty' "$PRESIGNED_FILE")"
47+
48+ if [ -z "$flash_url" ]; then
49+ echo "❌ No presigned URL found for key: $flash_key"
50+ exit 1
51+ fi
52+
53+ if [ -z "$rootfs_url" ]; then
54+ echo "❌ No presigned URL found for key: $rootfs_key"
55+ exit 1
56+ fi
57+
58+ echo "✅ Resolved flash_url for: $flash_key"
59+ echo "✅ Resolved rootfs_url for: $rootfs_key"
60+ echo "flash_url=$flash_url" >> "$GITHUB_OUTPUT"
61+ echo "rootfs_url=$rootfs_url" >> "$GITHUB_OUTPUT"
62+
63+ - name : Write synthetic cloudData.json and metadata.json
64+ id : write_json
65+ shell : bash
66+ env :
67+ MACHINE : ${{ inputs.machine }}
68+ LAVA_NAME : ${{ inputs.lavaname }}
69+ FLASH_URL : ${{ steps.get_urls.outputs.flash_url }}
70+ ROOTFS_URL : ${{ steps.get_urls.outputs.rootfs_url }}
71+ WORKSPACE : ${{ github.workspace }}
72+ run : |
73+ set -euo pipefail
74+
75+ JOB_RENDER_DIR="$(dirname "$WORKSPACE")/job_render"
76+
77+ if [ ! -d "$JOB_RENDER_DIR" ]; then
78+ echo "❌ job_render directory not found at: $JOB_RENDER_DIR"
79+ ls -la "$(dirname "$WORKSPACE")"
80+ exit 1
81+ fi
82+
83+ DATA_DIR="$JOB_RENDER_DIR/data"
84+ mkdir -p "$DATA_DIR"
85+
86+ case "$MACHINE" in
87+ qcs9100-ride-sx) DTB_NAME="qcs9100-ride-r3" ;;
88+ qcs8300-ride-sx) DTB_NAME="qcs8300-ride" ;;
89+ rb3gen2-core-kit) DTB_NAME="qcs6490-rb3gen2" ;;
90+ qcs615-ride) DTB_NAME="qcs615-ride" ;;
91+ sm8750-mtp) DTB_NAME="sm8750-mtp" ;;
92+ kaanapali-mtp) DTB_NAME="kaanapali-mtp" ;;
93+ *) DTB_NAME="$MACHINE" ;;
94+ esac
95+
96+ echo "dtb_name=$DTB_NAME" >> "$GITHUB_OUTPUT"
97+ echo "job_render_dir=$JOB_RENDER_DIR" >> "$GITHUB_OUTPUT"
98+
99+ echo "📝 Writing cloudData.json (machine=$MACHINE lavaname=$LAVA_NAME dtb=$DTB_NAME)"
100+
101+ jq -n \
102+ --arg machine "$MACHINE" \
103+ --arg lavaname "$LAVA_NAME" \
104+ --arg flash_url "$FLASH_URL" \
105+ --arg rootfs_url "$ROOTFS_URL" \
106+ '{
107+ "id": ("ci-" + $machine),
108+ "kind": "kbuild",
109+ "name": ("ci-build-" + $machine),
110+ "path": ["checkout", ("ci-build-" + $machine)],
111+ "group": ("ci-build-" + $machine),
112+ "parent": "",
113+ "state": "done",
114+ "result": "pass",
115+ "artifacts": {
116+ "metadata": "",
117+ "kernel": "",
118+ "vmlinux": "",
119+ "modules": "",
120+ "ramdisk": "",
121+ "firmware": "",
122+ "dtb": "",
123+ "flash_image": $flash_url,
124+ "rootfs_image": $rootfs_url
125+ },
126+ "data": {
127+ "kernel_revision": {
128+ "tree": "qcom-next",
129+ "url": "",
130+ "branch": "main",
131+ "commit": "",
132+ "describe":"",
133+ "version": {
134+ "version": 0,
135+ "patchlevel": 0,
136+ "sublevel": null,
137+ "extra": "",
138+ "name": null
139+ },
140+ "patchset": null,
141+ "commit_tags": [],
142+ "commit_message": "",
143+ "tip_of_branch": true
144+ },
145+ "arch": "arm64",
146+ "defconfig": "defconfig",
147+ "compiler": "gcc-12",
148+ "error_code": null,
149+ "error_msg": null,
150+ "fragments": [],
151+ "config_full": "defconfig",
152+ "platform": $lavaname,
153+ "runtime": "lava",
154+ "job_id": ("ci-" + $machine),
155+ "job_context": "github-actions",
156+ "kernel_type": "image",
157+ "regression": null
158+ },
159+ "debug": {},
160+ "jobfilter": null,
161+ "platform_filter":[],
162+ "owner": "production",
163+ "submitter": "service:pipeline"
164+ }' > "$DATA_DIR/cloudData.json"
165+
166+ echo "✅ cloudData.json written"
167+
168+ echo "📝 Writing metadata.json (DTB key: dtbs/qcom/${DTB_NAME}.dtb)"
169+ jq -n \
170+ --arg dtb_key "dtbs/qcom/${DTB_NAME}.dtb" \
171+ '{
172+ "build": {
173+ "arch": "arm64",
174+ "compiler": "gcc-12",
175+ "defconfig": "defconfig",
176+ "fragments": [],
177+ "config_full": "defconfig",
178+ "result": "pass"
179+ },
180+ "artifacts": {
181+ ($dtb_key): ""
182+ }
183+ }' > "$DATA_DIR/metadata.json"
184+
185+ echo "✅ metadata.json written"
186+
187+ - name : Render LAVA job definition
188+ shell : bash
189+ env :
190+ DOCKER_IMAGE : ${{ inputs.docker_image }}
191+ MACHINE : ${{ inputs.machine }}
192+ LAVA_NAME : ${{ inputs.lavaname }}
193+ TARGET_DTB : ${{ steps.write_json.outputs.dtb_name }}
194+ WORKSPACE : ${{ github.workspace }}
195+ run : |
196+ set -euo pipefail
197+
198+ JOB_RENDER_DIR="$(dirname "$WORKSPACE")/job_render"
199+ RENDERS_DIR="$JOB_RENDER_DIR/renders"
200+ mkdir -p "$RENDERS_DIR"
201+
202+ echo "🔧 Rendering LAVA job: machine=$MACHINE lavaname=$LAVA_NAME dtb=$TARGET_DTB"
203+
204+ docker run -i --rm \
205+ --workdir="$JOB_RENDER_DIR" \
206+ -v "$(dirname "$JOB_RENDER_DIR"):$(dirname "$JOB_RENDER_DIR")" \
207+ -e MACHINE="$MACHINE" \
208+ -e TARGET="$MACHINE" \
209+ -e LAVA_NAME="$LAVA_NAME" \
210+ -e TARGET_DTB="$TARGET_DTB" \
211+ -e BOOT_METHOD="flasher" \
212+ "$DOCKER_IMAGE" \
213+ bash -c '
214+ set -euo pipefail
215+ export BOOT_METHOD=flasher
216+ python3 lava_Job_definition_generator.py \
217+ --localjson ./data/cloudData.json \
218+ --meta-qcom \
219+ --video_pre-merge
220+ '
221+
222+ echo "✅ LAVA job definition rendered"
223+
224+ - name : Patch device_type in rendered YAML
225+ shell : bash
226+ env :
227+ MACHINE : ${{ inputs.machine }}
228+ LAVA_NAME : ${{ inputs.lavaname }}
229+ WORKSPACE : ${{ github.workspace }}
230+ run : |
231+ set -euo pipefail
232+
233+ JOB_RENDER_DIR="$(dirname "$WORKSPACE")/job_render"
234+ YAML="$JOB_RENDER_DIR/renders/lava_job_definition.yaml"
235+
236+ if [ ! -f "$YAML" ]; then
237+ echo "❌ Rendered YAML not found: $YAML"
238+ exit 1
239+ fi
240+
241+ echo "🔧 Patching device_type: $MACHINE → $LAVA_NAME"
242+ sudo chown "$(id -u):$(id -g)" "$YAML" || true
243+ sed -i "s|^device_type:.*|device_type: ${LAVA_NAME}|" "$YAML"
244+
245+ echo "✅ device_type patched"
246+ echo "=== Rendered YAML ==="
247+ cat "$YAML"
0 commit comments