Skip to content

Commit 1fc608b

Browse files
committed
ci/package_core: use matrix for building board binaries
Convert the sequential building and packaging of all board binaries into a matrix job, allowing parallel execution. This makes the workflow more efficient and independent of the number of supported boards. Signed-off-by: Luca Burelli <l.burelli@arduino.cc>
1 parent 8fc5c56 commit 1fc608b

File tree

1 file changed

+73
-43
lines changed

1 file changed

+73
-43
lines changed

.github/workflows/package_core.yml

Lines changed: 73 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -45,21 +45,33 @@ jobs:
4545
echo "SUB_ARCHES=$(jq -c 'map(.subarch) | unique' <<< ${ALL_BOARD_DATA})" >> "$GITHUB_ENV"
4646
4747
(cd && tar cphf - .cmake work zephyr-sdk-* | zstd > build-env.tar.zstd)
48+
tar cphf - cores/arduino/api | zstd > arduino-api.tar.zstd
4849
4950
- name: Archive build environment
5051
uses: actions/upload-artifact@v4
5152
with:
5253
name: build-env
5354
path: ~/build-env.tar.zstd
5455

55-
package-core:
56-
name: Build and package cores
56+
- name: Archive API snapshot
57+
uses: actions/upload-artifact@v4
58+
with:
59+
name: arduino-api
60+
path: arduino-api.tar.zstd
61+
62+
build-board:
63+
name: Build loader for ${{ matrix.board }}
5764
runs-on: ubuntu-latest
5865
needs:
5966
- build-env
6067
env:
6168
CCACHE_IGNOREOPTIONS: -specs=*
62-
CORE_TAG: ${{ needs.build-env.outputs.CORE_TAG }}
69+
OUTPUT_ARTIFACT: binaries-${{ matrix.board }}-${{ needs.build-env.outputs.CORE_HASH }}
70+
strategy:
71+
matrix:
72+
include:
73+
${{ fromJSON( needs.build-env.outputs.ALL_BOARD_DATA ) }}
74+
fail-fast: false
6375
steps:
6476
- uses: actions/download-artifact@v4
6577
with:
@@ -75,53 +87,86 @@ jobs:
7587
with:
7688
verbose: 1
7789

78-
- name: Build variants
90+
- name: Build loader
7991
shell: bash
8092
run: |
81-
./extra/build_all.sh -f
93+
./extra/build.sh ${{ matrix.board }}
8294
83-
- name: Package cores
95+
- name: Package board binaries
8496
run: |
85-
jq -cr '.[]' <<< ${ARTIFACTS} | while read -r artifact; do
86-
ARTIFACT_NAME=ArduinoCore-${artifact}-${CORE_HASH}
87-
./extra/package_core.sh ${artifact} ${CORE_TAG} distrib/${ARTIFACT_NAME}.tar.bz2
88-
done
97+
tar chf - firmwares/*${{ matrix.variant }}* variants/${{ matrix.variant }}/ | zstd > ${OUTPUT_ARTIFACT}.tar.zstd
8998
90-
- name: Archive cores
99+
- name: Archive board binaries
91100
uses: actions/upload-artifact@v4
92101
with:
93-
name: ArduinoCore-archives-${{ env.CORE_HASH }}
94-
path: distrib/*.tar.bz2
102+
name: ${{ env.OUTPUT_ARTIFACT }}
103+
path: ${{ env.OUTPUT_ARTIFACT }}.tar.zstd
95104

96-
split-core:
97-
name: Split off ${{ matrix.artifact }}
105+
package-core:
106+
name: Package ${{ matrix.artifact }}
98107
runs-on: ubuntu-latest
99108
needs:
100109
- build-env
101-
- package-core
110+
- build-board
102111
env:
103-
ALL_CORES_ARTIFACT: ArduinoCore-archives-${{ needs.build-env.outputs.CORE_HASH }}
104112
CORE_ARTIFACT: ArduinoCore-${{ matrix.artifact }}-${{ needs.build-env.outputs.CORE_HASH }}
113+
CORE_TAG: ${{ needs.build-env.outputs.CORE_TAG }}
105114
strategy:
106115
matrix:
107116
artifact: ${{ fromJSON( needs.build-env.outputs.ARTIFACTS ) }}
108117
steps:
118+
- uses: actions/checkout@v4
119+
with:
120+
submodules: 'recursive'
121+
fetch-depth: 0
122+
persist-credentials: false
123+
fetch-tags: true
124+
109125
- uses: actions/download-artifact@v4
110126
with:
111-
name: ${{ env.ALL_CORES_ARTIFACT }}
127+
path: .
128+
name: arduino-api
129+
130+
- uses: actions/download-artifact@v4
131+
with:
132+
path: .
133+
pattern: binaries-*
134+
merge-multiple: true
135+
136+
- name: Package core
137+
run: |
138+
rm -f cores/arduino/api # remove broken symlink
139+
tar --use-compress-program=unzstd -xpf arduino-api.tar.zstd
140+
for f in binaries-*.tar.zstd ; do
141+
tar --use-compress-program=unzstd -xpf $f
142+
done
143+
./extra/package_core.sh ${{ matrix.artifact }} ${CORE_TAG} distrib/${CORE_ARTIFACT}.tar.bz2
112144
113145
- uses: actions/upload-artifact@v4
114146
with:
115147
name: ${{ env.CORE_ARTIFACT }}
116-
path: ${{ env.CORE_ARTIFACT }}.tar.bz2
148+
path: distrib/${{ env.CORE_ARTIFACT }}.tar.bz2
149+
150+
cleanup-build:
151+
name: Clean up intermediates
152+
runs-on: ubuntu-latest
153+
needs:
154+
- package-core
155+
steps:
156+
- uses: geekyeggo/delete-artifact@v5.1.0
157+
with:
158+
name: |
159+
arduino-api
160+
binaries-*
161+
build-env
162+
failOnError: false
117163

118164
test-core:
119165
name: Test ${{ matrix.subarch }}:${{ matrix.board }}
120166
runs-on: ubuntu-latest
121167
needs:
122168
- build-env
123169
- package-core
124-
- split-core
125170
strategy:
126171
matrix:
127172
include:
@@ -277,12 +322,12 @@ jobs:
277322
permissions:
278323
id-token: write
279324
contents: read
280-
env:
281-
ALL_CORES_ARTIFACT: ArduinoCore-archives-${{ needs.build-env.outputs.CORE_HASH }}
282325
steps:
283326
- uses: actions/download-artifact@v4
284327
with:
285-
name: ${{ env.ALL_CORES_ARTIFACT }}
328+
path: .
329+
pattern: ArduinoCore-*
330+
merge-multiple: true
286331

287332
- name: Configure AWS credentials
288333
uses: aws-actions/configure-aws-credentials@v4
@@ -296,16 +341,14 @@ jobs:
296341
aws s3 cp $f s3://${{ secrets.S3_BUCKET }}/
297342
done
298343
299-
publish-json:
300-
name: Publish jsons
344+
prepare-json:
345+
name: Prepare jsons
301346
runs-on: ubuntu-latest
302-
if: ${{ github.repository == 'arduino/ArduinoCore-zephyr' }}
303347
needs:
304348
- build-env
305349
- package-core
306350
- test-core
307351
env:
308-
ALL_CORES_ARTIFACT: ArduinoCore-archives-${{ needs.build-env.outputs.CORE_HASH }}
309352
CORE_TAG: ${{ needs.build-env.outputs.CORE_TAG }}
310353
CORE_HASH: ${{ needs.build-env.outputs.CORE_HASH }}
311354
ARTIFACTS: ${{ needs.build-env.outputs.ARTIFACTS }}
@@ -318,7 +361,9 @@ jobs:
318361

319362
- uses: actions/download-artifact@v4
320363
with:
321-
name: ${{ env.ALL_CORES_ARTIFACT }}
364+
path: .
365+
pattern: ArduinoCore-*
366+
merge-multiple: true
322367

323368
- name: Prepare package index snippets
324369
run: |
@@ -333,18 +378,3 @@ jobs:
333378
with:
334379
name: ArduinoCore-zephyr-${{ env.CORE_TAG }}-jsons
335380
path: ArduinoCore-*-${{ env.CORE_TAG }}.json
336-
337-
cleanup-artifacts:
338-
runs-on: ubuntu-latest
339-
needs:
340-
- build-env
341-
- package-core
342-
- publish-core
343-
- publish-json
344-
if: ${{ !cancelled() }}
345-
steps:
346-
- name: Clean up intermediate artifacts
347-
uses: geekyeggo/delete-artifact@v5.1.0
348-
with:
349-
name: ArduinoCore-archives-${{ needs.build-env.outputs.CORE_HASH }}
350-
failOnError: false

0 commit comments

Comments
 (0)