Skip to content

Commit dc21555

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 630b678 commit dc21555

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
@@ -16,6 +16,7 @@ giga.build.zephyr_target=arduino_giga_r1//m7
1616
giga.build.zephyr_args=--shield arduino_giga_display_shield
1717
giga.build.zephyr_hals=hal_stm32 hal_infineon
1818
giga.build.variant=arduino_giga_r1_stm32h747xx_m7
19+
giga.build.artifact=zephyr_main
1920
giga.build.mcu=cortex-m7
2021
giga.build.fpu=-mfpu=fpv5-d16
2122
giga.build.architecture=cortex-m7
@@ -77,6 +78,7 @@ nano33ble.menu.debug.true.build.zsk_args.debug=-debug
7778
nano33ble.build.zephyr_target=arduino_nano_33_ble//sense
7879
nano33ble.build.zephyr_args=
7980
nano33ble.build.zephyr_hals=hal_nordic
81+
nano33ble.build.artifact=zephyr_main
8082
nano33ble.build.variant=arduino_nano_33_ble_nrf52840_sense
8183
nano33ble.build.mcu=cortex-m4
8284
nano33ble.build.fpu=-mfpu=fpv4-sp-d16
@@ -125,7 +127,7 @@ nano33ble.debug.cortex-debug.custom.request=attach
125127

126128
##############################################################################################################
127129

128-
ek_ra8d1.name=EK_RA8D1
130+
ek_ra8d1.name=Renesas RA8D1 EK
129131
ek_ra8d1.build.core=arduino
130132
ek_ra8d1.build.crossprefix=arm-zephyr-eabi-
131133
ek_ra8d1.build.compiler_path={runtime.tools.arm-zephyr-eabi-0.16.8.path}/bin/
@@ -179,7 +181,7 @@ ek_ra8d1.bootloader.target=R7FA8D1AH
179181

180182
##############################################################################################################
181183

182-
frdm_mcxn947.name=MCXN947
184+
frdm_mcxn947.name=NXP FRDM MCXN947
183185
frdm_mcxn947.build.core=arduino
184186
frdm_mcxn947.build.crossprefix=arm-zephyr-eabi-
185187
frdm_mcxn947.build.compiler_path={runtime.tools.arm-zephyr-eabi-0.16.8.path}/bin/
@@ -240,6 +242,7 @@ portentah7.menu.debug.true.build.zsk_args.debug=-debug
240242
241243
portentah7.build.zephyr_args=
242244
portentah7.build.zephyr_hals=hal_stm32 hal_infineon
245+
portentah7.build.artifact=zephyr_main
243246
portentah7.build.variant=arduino_portenta_h7_stm32h747xx_m7
244247
portentah7.build.mcu=cortex-m7
245248
portentah7.build.fpu=-mfpu=fpv5-d16
@@ -290,7 +293,7 @@ portentah7.debug.svd_file={runtime.platform.path}/svd/STM32H747_CM7.svd
290293

291294
##############################################################################################################
292295

293-
frdm_rw612.name=RW612
296+
frdm_rw612.name=NXP FRDM RW612
294297
frdm_rw612.build.core=arduino
295298
frdm_rw612.build.crossprefix=arm-zephyr-eabi-
296299
frdm_rw612.build.compiler_path={runtime.tools.arm-zephyr-eabi-0.16.8.path}/bin/
@@ -350,6 +353,7 @@ niclasense.menu.debug.true.build.zsk_args.debug=-debug
350353
niclasense.build.zephyr_target=arduino_nicla_sense_me
351354
niclasense.build.zephyr_args=
352355
niclasense.build.zephyr_hals=hal_nordic
356+
niclasense.build.artifact=zephyr_main
353357
niclasense.build.variant=arduino_nicla_sense_me_nrf52832
354358
niclasense.build.mcu=cortex-m4
355359
niclasense.build.fpu=-mfpu=fpv4-sp-d16
@@ -404,7 +408,7 @@ niclasense.debug.cortex-debug.custom.request=attach
404408

405409
##########################################################################################
406410

407-
portentac33.name=Portenta C33
411+
portentac33.name=Arduino Portenta C33
408412
portentac33.build.core=arduino
409413
portentac33.build.crossprefix=arm-zephyr-eabi-
410414
portentac33.build.compiler_path={runtime.tools.arm-zephyr-eabi-0.16.8.path}/bin/
@@ -421,6 +425,7 @@ portentac33.menu.link_mode.static.upload.extension=bin-zsk.bin
421425
portentac33.build.zephyr_target=arduino_portenta_c33
422426
portentac33.build.zephyr_args=
423427
portentac33.build.zephyr_hals=hal_renesas nanopb
428+
portentac33.build.artifact=zephyr_main
424429
portentac33.build.variant=arduino_portenta_c33_r7fa6m5bh3cfc
425430
portentac33.build.mcu=cortex-m33
426431
portentac33.build.fpu=-mfpu=fpv5-sp-d16
@@ -472,6 +477,7 @@ opta.menu.debug.true.build.zsk_args.debug=-debug
472477
opta.build.zephyr_target=arduino_opta//m7
473478
opta.build.zephyr_args=
474479
opta.build.zephyr_hals=hal_stm32 hal_infineon
480+
opta.build.artifact=zephyr_main
475481
opta.build.variant=arduino_opta_stm32h747xx_m7
476482
opta.build.mcu=cortex-m7
477483
opta.build.fpu=-mfpu=fpv5-d16
@@ -535,6 +541,8 @@ unoq.menu.link_mode.static.upload.extension=bin-zsk.bin
535541
unoq.build.zephyr_target=arduino_uno_q
536542
unoq.build.zephyr_args=
537543
unoq.build.variant=arduino_uno_q_stm32u585xx
544+
unoq.build.artifact=zephyr_unoq
545+
unoq.build.subarch=zephyr
538546
unoq.build.mcu=cortex-m33
539547
unoq.build.fpu=-mfpu=fpv5-sp-d16
540548
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.3-rc.2"
49+
}
50+
]
51+
}

0 commit comments

Comments
 (0)