Skip to content

Commit 439fb76

Browse files
committed
ci/package_core: multi-artifact support
Add a new "board.build.artifact" option to boards.txt to specify which artifact a board belongs to. If not specified, the board will automatically be added to "zephyr_contrib". The artifact names collected from boards.txt (plus the auto "zephyr" package, which includes all boards) are used to build and package each artifact in the GitHub Actions workflow; in particular, the FQBN of each board will depend on its artifact's "architecture" field. The test action is also updated to test each artifact on the appropriate boards. Individual package JSON files are in the extra/artifacts directory, along with common include/exclude files for packaging. Signed-off-by: Luca Burelli <[email protected]>
1 parent 6617195 commit 439fb76

File tree

13 files changed

+267
-171
lines changed

13 files changed

+267
-171
lines changed

.github/workflows/package_core.yml

Lines changed: 96 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,16 @@ on:
77
jobs:
88

99
package-core:
10-
name: Build and package core
10+
name: Build and package cores
1111
runs-on: ubuntu-latest
1212
env:
1313
CCACHE_IGNOREOPTIONS: -specs=*
1414
outputs:
1515
CORE_TAG: ${{ env.CORE_TAG }}
1616
CORE_HASH: ${{ env.CORE_HASH }}
1717
ALL_BOARD_DATA: ${{ env.ALL_BOARD_DATA }}
18+
ARTIFACTS: ${{ env.ARTIFACTS }}
19+
SUB_ARCHES: ${{ env.SUB_ARCHES }}
1820
steps:
1921
- name: Install OS dependencies
2022
working-directory: /opt
@@ -54,32 +56,54 @@ jobs:
5456
run: |
5557
./extra/build_all.sh -f
5658
57-
- name: Package core
59+
- name: Package cores
5860
run: |
59-
PACKAGE=zephyr
60-
CORE_ARTIFACT=ArduinoCore-$PACKAGE-${CORE_HASH}
61-
./extra/package_core.sh ${CORE_TAG} distrib/${CORE_ARTIFACT}.tar.bz2
61+
jq -cr '.[]' <<< ${ARTIFACTS} | while read -r artifact; do
62+
ARTIFACT_NAME=ArduinoCore-${artifact}-${CORE_HASH}
63+
./extra/package_core.sh ${artifact} ${CORE_TAG} distrib/${ARTIFACT_NAME}.tar.bz2
64+
done
6265
63-
- name: Archive core
66+
- name: Archive cores
6467
uses: actions/upload-artifact@v4
6568
with:
66-
name: ArduinoCore-zephyr-${{ env.CORE_HASH }}
69+
name: ArduinoCore-archives-${{ env.CORE_HASH }}
6770
path: distrib/*.tar.bz2
6871

72+
split-core:
73+
name: Split off ${{ matrix.artifact }}
74+
runs-on: ubuntu-latest
75+
needs: package-core
76+
env:
77+
ALL_CORES_ARTIFACT: ArduinoCore-archives-${{ needs.package-core.outputs.CORE_HASH }}
78+
CORE_ARTIFACT: ArduinoCore-${{ matrix.artifact }}-${{ needs.package-core.outputs.CORE_HASH }}
79+
strategy:
80+
matrix:
81+
artifact: ${{ fromJSON( needs.package-core.outputs.ARTIFACTS ) }}
82+
steps:
83+
- uses: actions/download-artifact@v4
84+
with:
85+
name: ${{ env.ALL_CORES_ARTIFACT }}
86+
87+
- uses: actions/upload-artifact@v4
88+
with:
89+
name: ${{ env.CORE_ARTIFACT }}
90+
path: ${{ env.CORE_ARTIFACT }}.tar.bz2
91+
6992
test-core:
70-
name: Test on ${{ matrix.board }}
93+
name: Test ${{ matrix.subarch }}:${{ matrix.board }}
7194
runs-on: ubuntu-latest
7295
needs:
7396
- package-core
97+
- split-core
7498
strategy:
7599
matrix:
76100
include:
77101
${{ fromJSON( needs.package-core.outputs.ALL_BOARD_DATA ) }}
78102
fail-fast: false
79103
env:
80-
PLAT: arduino:zephyr
81-
FQBN: arduino:zephyr:${{ matrix.board }}
82-
CORE_ARTIFACT: ArduinoCore-zephyr-${{ needs.package-core.outputs.CORE_HASH }}
104+
PLAT: arduino:${{ matrix.subarch }}
105+
FQBN: arduino:${{ matrix.subarch }}:${{ matrix.board }}
106+
CORE_ARTIFACT: ArduinoCore-${{ matrix.artifact }}-${{ needs.package-core.outputs.CORE_HASH }}
83107
steps:
84108
- uses: actions/download-artifact@v4
85109
with:
@@ -127,7 +151,7 @@ jobs:
127151
repo: context.repo.repo,
128152
run_id: context.runId
129153
});
130-
const job_name = `Test on ${{ matrix.board }}`
154+
const job_name = `Test ${{ matrix.subarch }}:${{ matrix.board }}`
131155
return workflow_run.jobs.find((job) => job.name === job_name).id;
132156
133157
- name: Prepare log
@@ -159,37 +183,41 @@ jobs:
159183
merge-multiple: true
160184

161185
- run: |
162-
echo "### Core test results:" >> "$GITHUB_STEP_SUMMARY"
163-
jq -c '.[]' <<< "$ALL_BOARD_DATA" | while read -r BOARD_DATA; do
164-
BOARD=$(echo $BOARD_DATA | jq -cr '.board')
165-
VARIANT=$(echo $BOARD_DATA | jq -cr '.variant')
166-
FQBN="arduino:zephyr:$BOARD"
167-
REPORT_FILE="$(echo $FQBN | tr ':' '-').json"
168-
if [ ! -f $REPORT_FILE ]; then
169-
echo "* :x: $BOARD (`$VARIANT`) - No report found?" >> "$GITHUB_STEP_SUMMARY"
170-
else
171-
REPORT=$(jq -cr '.boards[0].sketches[0]' $REPORT_FILE)
172-
JOB_ID=$(echo $REPORT | jq -cr '.job_id')
173-
JOB_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}/job/${JOB_ID}#step:5:2"
174-
if ! $(echo $REPORT | jq -cr '.compilation_success') ; then
175-
echo "* :x: [$BOARD]($JOB_URL) (\`$VARIANT\`) - Build failed" >> "$GITHUB_STEP_SUMMARY"
186+
ARTIFACTS=$(jq -cr 'map(.artifact) | unique | .[]' <<< ${ALL_BOARD_DATA}) # this avoids the 'zephyr' artifact
187+
for artifact in $ARTIFACTS ; do
188+
echo "### \`$artifact\` test results:" >> "$GITHUB_STEP_SUMMARY"
189+
jq -c "map(select(.artifact == \"$artifact\")) | .[]" <<< ${ALL_BOARD_DATA} | while read -r BOARD_DATA; do
190+
BOARD=$(echo $BOARD_DATA | jq -cr '.board')
191+
VARIANT=$(echo $BOARD_DATA | jq -cr '.variant')
192+
SUBARCH=$(echo $BOARD_DATA | jq -cr '.subarch')
193+
FQBN="arduino:$SUBARCH:$BOARD"
194+
REPORT_FILE="$(echo $FQBN | tr ':' '-').json"
195+
if [ ! -f $REPORT_FILE ]; then
196+
echo "* :x: $BOARD (\`$VARIANT\`) - No report found?" >> "$GITHUB_STEP_SUMMARY"
176197
else
177-
WARNINGS=$(echo $REPORT | jq -cr '.warnings.current.absolute // 0')
178-
if [ $WARNINGS -eq 0 ]; then
179-
echo "* :white_check_mark: $BOARD (\`$VARIANT\`) - Build successful" >> "$GITHUB_STEP_SUMMARY"
198+
REPORT=$(jq -cr '.boards[0].sketches[0]' $REPORT_FILE)
199+
JOB_ID=$(echo $REPORT | jq -cr '.job_id')
200+
JOB_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}/job/${JOB_ID}#step:5:2"
201+
if ! $(echo $REPORT | jq -cr '.compilation_success') ; then
202+
echo "* :x: [$BOARD]($JOB_URL) (\`$VARIANT\`) - Build failed" >> "$GITHUB_STEP_SUMMARY"
180203
else
181-
echo >> "$GITHUB_STEP_SUMMARY"
182-
echo "<details><summary>&nbsp;&nbsp; :warning: <a href=\"$JOB_URL\">$BOARD</a> (<tt>$VARIANT</tt>) - $WARNINGS warnings:</summary>" >> "$GITHUB_STEP_SUMMARY"
183-
echo >> "$GITHUB_STEP_SUMMARY"
184-
echo "\`\`\`" >> "$GITHUB_STEP_SUMMARY"
185-
echo $REPORT | jq -cr '.warnings_log[]' >> "$GITHUB_STEP_SUMMARY"
186-
echo "\`\`\`" >> "$GITHUB_STEP_SUMMARY"
187-
echo >> "$GITHUB_STEP_SUMMARY"
188-
echo "</details>" >> "$GITHUB_STEP_SUMMARY"
189-
echo >> "$GITHUB_STEP_SUMMARY"
204+
WARNINGS=$(echo $REPORT | jq -cr '.warnings.current.absolute // 0')
205+
if [ $WARNINGS -eq 0 ]; then
206+
echo "* :white_check_mark: $BOARD (\`$VARIANT\`) - Build successful" >> "$GITHUB_STEP_SUMMARY"
207+
else
208+
echo >> "$GITHUB_STEP_SUMMARY"
209+
echo "<details><summary>&nbsp;&nbsp; :warning: <a href=\"$JOB_URL\">$BOARD</a> (<tt>$VARIANT</tt>) - $WARNINGS warnings:</summary>" >> "$GITHUB_STEP_SUMMARY"
210+
echo >> "$GITHUB_STEP_SUMMARY"
211+
echo "\`\`\`" >> "$GITHUB_STEP_SUMMARY"
212+
echo $REPORT | jq -cr '.warnings_log[]' >> "$GITHUB_STEP_SUMMARY"
213+
echo "\`\`\`" >> "$GITHUB_STEP_SUMMARY"
214+
echo >> "$GITHUB_STEP_SUMMARY"
215+
echo "</details>" >> "$GITHUB_STEP_SUMMARY"
216+
echo >> "$GITHUB_STEP_SUMMARY"
217+
fi
190218
fi
191219
fi
192-
fi
220+
done
193221
done
194222
195223
- name: Clean up intermediate artifacts
@@ -220,11 +248,11 @@ jobs:
220248
id-token: write
221249
contents: read
222250
env:
223-
CORE_ARTIFACT: ArduinoCore-zephyr-${{ needs.package-core.outputs.CORE_HASH }}
251+
ALL_CORES_ARTIFACT: ArduinoCore-archives-${{ needs.package-core.outputs.CORE_HASH }}
224252
steps:
225253
- uses: actions/download-artifact@v4
226254
with:
227-
name: ${{ env.CORE_ARTIFACT }}
255+
name: ${{ env.ALL_CORES_ARTIFACT }}
228256

229257
- name: Configure AWS credentials
230258
uses: aws-actions/configure-aws-credentials@v4
@@ -236,37 +264,52 @@ jobs:
236264
run: aws s3 cp ArduinoCore-*.tar.bz2 s3://${{ secrets.S3_BUCKET }}/
237265

238266
publish-json:
239-
name: Publish json
267+
name: Publish jsons
240268
runs-on: ubuntu-latest
241269
if: ${{ github.event_name == 'push' && github.repository == 'arduino/ArduinoCore-zephyr' }}
242270
needs:
243271
- package-core
244272
- test-core
245273
env:
246-
CORE_ARTIFACT: ArduinoCore-zephyr-${{ needs.package-core.outputs.CORE_HASH }}
274+
ALL_CORES_ARTIFACT: ArduinoCore-archives-${{ needs.package-core.outputs.CORE_HASH }}
247275
CORE_TAG: ${{ needs.package-core.outputs.CORE_TAG }}
276+
CORE_HASH: ${{ needs.package-core.outputs.CORE_HASH }}
277+
ARTIFACTS: ${{ needs.package-core.outputs.ARTIFACTS }}
248278
steps:
249279
- uses: actions/checkout@v4
250280
with:
251281
fetch-depth: 0
252282
persist-credentials: false
253-
sparse-checkout: |
254-
extra/gen_package_index_json.sh
255-
extra/zephyr-core-template.json
283+
fetch-tags: true
256284

257285
- uses: actions/download-artifact@v4
258286
with:
259-
name: ${{ env.CORE_ARTIFACT }}
287+
name: ${{ env.ALL_CORES_ARTIFACT }}
260288

261-
- name: Prepare package index snippet
289+
- name: Prepare package index snippets
262290
run: |
263-
PACKAGE=zephyr
264-
ARTIFACT_FILE=ArduinoCore-${PACKAGE}-${CORE_HASH}.tar.bz2
265-
PACKAGE_JSON=ArduinoCore-${PACKAGE}-${CORE_TAG}.json
266-
./extra/gen_package_index_json.sh ${CORE_TAG} ${ARTIFACT_FILE} > ${PACKAGE_JSON}
291+
jq -cr '.[]' <<< ${ARTIFACTS} | while read -r artifact; do
292+
ARTIFACT_FILE=ArduinoCore-${artifact}-${CORE_HASH}.tar.bz2
293+
PACKAGE_JSON=ArduinoCore-${artifact}-${CORE_TAG}.json
294+
./extra/gen_package_index_json.sh ${artifact} ${ARTIFACT_FILE} ${PACKAGE_JSON}
295+
done
267296
268-
- name: Archive package index snippet
297+
- name: Archive package index snippets
269298
uses: actions/upload-artifact@v4
270299
with:
271300
name: ArduinoCore-zephyr-${{ env.CORE_TAG }}-jsons
272301
path: ArduinoCore-*-${{ env.CORE_TAG }}.json
302+
303+
cleanup-artifacts:
304+
runs-on: ubuntu-latest
305+
needs:
306+
- package-core
307+
- publish-core
308+
- publish-json
309+
if: ${{ !cancelled() }}
310+
steps:
311+
- name: Clean up intermediate artifacts
312+
uses: geekyeggo/[email protected]
313+
with:
314+
name: ArduinoCore-archives-${{ needs.package-core.outputs.CORE_HASH }}
315+
failOnError: false

boards.txt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ giga.build.zephyr_target=arduino_giga_r1//m7
1717
giga.build.zephyr_args=--shield arduino_giga_display_shield
1818
giga.build.zephyr_hals=hal_stm32 hal_infineon
1919
giga.build.variant=arduino_giga_r1_stm32h747xx_m7
20+
giga.build.artifact=zephyr_main
2021
giga.build.mcu=cortex-m7
2122
giga.build.fpu=-mfpu=fpv5-d16
2223
giga.build.architecture=cortex-m7
@@ -78,6 +79,7 @@ nano33ble.menu.debug.true.build.zsk_args.debug=-debug
7879
nano33ble.build.zephyr_target=arduino_nano_33_ble//sense
7980
nano33ble.build.zephyr_args=
8081
nano33ble.build.zephyr_hals=hal_nordic
82+
nano33ble.build.artifact=zephyr_main
8183
nano33ble.build.variant=arduino_nano_33_ble_nrf52840_sense
8284
nano33ble.build.mcu=cortex-m4
8385
nano33ble.build.fpu=-mfpu=fpv4-sp-d16
@@ -126,7 +128,7 @@ nano33ble.debug.cortex-debug.custom.request=attach
126128

127129
##############################################################################################################
128130

129-
ek_ra8d1.name=EK_RA8D1
131+
ek_ra8d1.name=Renesas RA8D1 EK
130132
ek_ra8d1.build.core=arduino
131133
ek_ra8d1.build.crossprefix=arm-zephyr-eabi-
132134
ek_ra8d1.build.compiler_path={runtime.tools.arm-zephyr-eabi-0.16.8.path}/bin/
@@ -180,7 +182,7 @@ ek_ra8d1.bootloader.target=R7FA8D1AH
180182

181183
##############################################################################################################
182184

183-
frdm_mcxn947.name=MCXN947
185+
frdm_mcxn947.name=NXP FRDM MCXN947
184186
frdm_mcxn947.build.core=arduino
185187
frdm_mcxn947.build.crossprefix=arm-zephyr-eabi-
186188
frdm_mcxn947.build.compiler_path={runtime.tools.arm-zephyr-eabi-0.16.8.path}/bin/
@@ -241,6 +243,7 @@ portentah7.menu.debug.true.build.zsk_args.debug=-debug
241243
242244
portentah7.build.zephyr_args=
243245
portentah7.build.zephyr_hals=hal_stm32 hal_infineon
246+
portentah7.build.artifact=zephyr_main
244247
portentah7.build.variant=arduino_portenta_h7_stm32h747xx_m7
245248
portentah7.build.mcu=cortex-m7
246249
portentah7.build.fpu=-mfpu=fpv5-d16
@@ -291,7 +294,7 @@ portentah7.debug.svd_file={runtime.platform.path}/svd/STM32H747_CM7.svd
291294

292295
##############################################################################################################
293296

294-
frdm_rw612.name=RW612
297+
frdm_rw612.name=NXP FRDM RW612
295298
frdm_rw612.build.core=arduino
296299
frdm_rw612.build.crossprefix=arm-zephyr-eabi-
297300
frdm_rw612.build.compiler_path={runtime.tools.arm-zephyr-eabi-0.16.8.path}/bin/
@@ -351,6 +354,7 @@ niclasense.menu.debug.true.build.zsk_args.debug=-debug
351354
niclasense.build.zephyr_target=arduino_nicla_sense_me
352355
niclasense.build.zephyr_args=
353356
niclasense.build.zephyr_hals=hal_nordic
357+
niclasense.build.artifact=zephyr_main
354358
niclasense.build.variant=arduino_nicla_sense_me_nrf52832
355359
niclasense.build.mcu=cortex-m4
356360
niclasense.build.fpu=-mfpu=fpv4-sp-d16
@@ -405,7 +409,7 @@ niclasense.debug.cortex-debug.custom.request=attach
405409

406410
##########################################################################################
407411

408-
portentac33.name=Portenta C33
412+
portentac33.name=Arduino Portenta C33
409413
portentac33.build.core=arduino
410414
portentac33.build.crossprefix=arm-zephyr-eabi-
411415
portentac33.build.compiler_path={runtime.tools.arm-zephyr-eabi-0.16.8.path}/bin/
@@ -422,6 +426,7 @@ portentac33.menu.link_mode.static.upload.extension=bin-zsk.bin
422426
portentac33.build.zephyr_target=arduino_portenta_c33
423427
portentac33.build.zephyr_args=
424428
portentac33.build.zephyr_hals=hal_renesas nanopb
429+
portentac33.build.artifact=zephyr_main
425430
portentac33.build.variant=arduino_portenta_c33_r7fa6m5bh3cfc
426431
portentac33.build.mcu=cortex-m33
427432
portentac33.build.fpu=-mfpu=fpv5-sp-d16
@@ -473,6 +478,7 @@ opta.menu.debug.true.build.zsk_args.debug=-debug
473478
opta.build.zephyr_target=arduino_opta//m7
474479
opta.build.zephyr_args=
475480
opta.build.zephyr_hals=hal_stm32 hal_infineon
481+
opta.build.artifact=zephyr_main
476482
opta.build.variant=arduino_opta_stm32h747xx_m7
477483
opta.build.mcu=cortex-m7
478484
opta.build.fpu=-mfpu=fpv5-d16
@@ -541,6 +547,8 @@ unoq.menu.flash_mode.ram.openocd_cfg=flash_sketch_ram.cfg
541547
unoq.build.zephyr_target=arduino_uno_q
542548
unoq.build.zephyr_args=
543549
unoq.build.variant=arduino_uno_q_stm32u585xx
550+
unoq.build.artifact=zephyr_unoq
551+
unoq.build.subarch=zephyr
544552
unoq.build.mcu=cortex-m33
545553
unoq.build.fpu=-mfpu=fpv5-sp-d16
546554
unoq.build.architecture=cortex-m33
File renamed without changes.

extra/package_core.inc renamed to extra/artifacts/_common.inc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
# are automatically added by package_core.sh depending on the information
66
# in 'boards.txt', so they should not be included here.
77

8-
boards.txt
9-
# platform.txt is added by package_core.sh
8+
# boards.txt and platform.txt are added by package_core.sh
109
programmers.txt
1110
LICENSE
1211
README.md

extra/artifacts/_common.json

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
{
2+
"name": "",
3+
"architecture": "",
4+
"version": "",
5+
"category": "",
6+
"url": "",
7+
"archiveFileName": "",
8+
"checksum": "",
9+
"size": "",
10+
"help": {
11+
"online": "https://www.arduino.cc/en/Reference/HomePage"
12+
},
13+
"boards": [],
14+
"toolsDependencies": [
15+
{
16+
"packager": "zephyr",
17+
"name": "arm-zephyr-eabi",
18+
"version": "0.16.8"
19+
},
20+
{
21+
"packager": "arduino",
22+
"name": "dfu-util",
23+
"version": "0.11.0-arduino5"
24+
},
25+
{
26+
"packager": "arduino",
27+
"name": "bossac",
28+
"version": "1.9.1-arduino2"
29+
},
30+
{
31+
"packager": "arduino",
32+
"name": "zephyr-sketch-tool",
33+
"version": "0.1.0"
34+
},
35+
{
36+
"packager": "arduino",
37+
"name": "sync-zephyr-artifacts",
38+
"version": "0.1.0"
39+
},
40+
{
41+
"packager": "arduino",
42+
"name": "adb",
43+
"version": "32.0.0"
44+
},
45+
{
46+
"packager": "arduino",
47+
"name": "remoteocd",
48+
"version": "0.0.4-rc.4"
49+
}
50+
]
51+
}

0 commit comments

Comments
 (0)