55 - pull_request
66
77jobs :
8- build-env :
9- name : Prepare build environment
10- runs-on : ubuntu-latest
11- outputs :
12- CORE_TAG : ${{ env.CORE_TAG }}
13- CORE_HASH : ${{ env.CORE_HASH }}
14- ALL_BOARD_DATA : ${{ env.ALL_BOARD_DATA }}
15- ARTIFACTS : ${{ env.ARTIFACTS }}
16- SUB_ARCHES : ${{ env.SUB_ARCHES }}
17- steps :
18-
19- - name : Install OS dependencies
20- working-directory : /opt
21- run : |
22- sudo apt-get remove --purge man-db -y # skips the mandb triggers
23- sudo apt-get update
24- sudo apt-get install -y --no-install-recommends git cmake wget python3-pip ninja-build
25-
26- - uses : actions/checkout@v4
27- with :
28- submodules : ' recursive'
29- fetch-depth : 0
30- persist-credentials : false
31- fetch-tags : true
32-
33- - name : Initialize Zephyr environment
34- run : |
35- yes | ./extra/bootstrap.sh -o=--filter=tree:0
36- echo "CORE_HASH=$(git describe --always)" >> "$GITHUB_ENV"
37- echo "ALL_BOARD_DATA=$(extra/get_board_details.sh | jq -c 'sort_by(.variant)')" >> "$GITHUB_ENV"
38- echo "## Building \`$(extra/get_core_version.sh)\`" >> "$GITHUB_STEP_SUMMARY"
39-
40- - name : Map output packages
41- # needs the above env vars to be usable
42- run : |
43- echo "CORE_TAG=$(git describe --tags --exact-match 2>/dev/null || echo $CORE_HASH)" >> "$GITHUB_ENV"
44- echo "ARTIFACTS=$(jq -c '["zephyr"] + (map(.artifact) | unique)' <<< ${ALL_BOARD_DATA})" >> "$GITHUB_ENV"
45- echo "SUB_ARCHES=$(jq -c 'map(.subarch) | unique' <<< ${ALL_BOARD_DATA})" >> "$GITHUB_ENV"
46-
47- (cd && tar cphf - .cmake work zephyr-sdk-* | zstd > build-env.tar.zstd)
48- tar cphf - cores/arduino/api | zstd > arduino-api.tar.zstd
49-
50- - name : Archive build environment
51- uses : actions/upload-artifact@v4
52- with :
53- name : build-env
54- path : ~/build-env.tar.zstd
55-
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 }}
64- runs-on : ubuntu-latest
65- needs :
66- - build-env
67- env :
68- CCACHE_IGNOREOPTIONS : -specs=*
69- ARTIFACT_TAG : ${{ needs.build-env.outputs.CORE_HASH }}-${{ matrix.board }}
70- strategy :
71- matrix :
72- include :
73- ${{ fromJSON( needs.build-env.outputs.ALL_BOARD_DATA ) }}
74- fail-fast : false
75- steps :
76- - uses : actions/download-artifact@v4
77- with :
78- path : /home/runner
79- name : build-env
80-
81- - name : Restore build environment
82- run : |
83- sudo apt-get remove --purge man-db -y # skips the mandb triggers
84- sudo apt-get update
85- sudo apt-get install -y --no-install-recommends git cmake wget python3-pip ninja-build ccache
86- (cd ~ && tar --use-compress-program=unzstd -xpf build-env.tar.zstd && rm build-env.tar.zstd)
87-
88- - name : ccache
89- uses : hendrikmuhs/ccache-action@v1.2
90- with :
91- verbose : 1
92- key : ${{ github.job }}-${{ matrix.board }}
93-
94- - name : Build loader
95- shell : bash
96- run : |
97- REPORT=reports/zephyr-${{ matrix.variant }}
98- mkdir -p reports
99- if ! ./extra/build.sh ${{ matrix.board }} 1> >(tee $REPORT.stdout) 2> >(tee $REPORT.stderr) ; then
100- echo "### :x: ${{ matrix.board }} (\`${{ matrix.variant }}\`) build errors" > $GITHUB_STEP_SUMMARY
101- echo >> $GITHUB_STEP_SUMMARY
102- echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
103- cat $REPORT.stderr >> $GITHUB_STEP_SUMMARY
104- echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
105- exit 1
106- fi
107-
108- # look for warnings (errors are a happy path!)
109- grep -i "warning:" $REPORT.stdout > $REPORT.warnings || true
110-
111- # extract the memory usage table (from the header to the first non-% line)
112- cat $REPORT.stdout | sed -n '/^Memory region/,/^[^%]*$/p' | head -n -1 \
113- | awk 'BEGIN {split("B KB MB GB", u); for(i in u) m[u[i]]=1024^(i-1)} /:/ {print "[\"" $1 "\"," $2*m[$3] "," $4*m[$5] "]"}' \
114- | sort | jq -s > $REPORT.meminfo
115-
116- - name : Get build job ID
117- id : job_id
118- if : ${{ success() || failure() }}
119- uses : actions/github-script@main
120- with :
121- script : |
122- const { data: workflow_run } = await github.rest.actions.listJobsForWorkflowRun({
123- owner: context.repo.owner,
124- repo: context.repo.repo,
125- run_id: context.runId
126- });
127- const job_name = `Build loader for ${{ matrix.board }}`
128- return workflow_run.jobs.find((job) => job.name === job_name).id;
129-
130- - name : Package board artifacts
131- if : ${{ !cancelled() }}
132- run : |
133- # Add job ID report
134- echo ${{ steps.job_id.outputs.result }} > $REPORT.jobid
135- echo "REPORT_FILES<<EOF" >> $GITHUB_ENV
136- ls reports/* >> $GITHUB_ENV
137- echo "EOF" >> $GITHUB_ENV
138-
139- # Archive built binaries (and build dir on failure)
140- [ "${{ job.status }}" == "failure" ] && FULL_BUILD_DIR="build/${{ matrix.variant }}/"
141- tar chf - \
142- firmwares/*${{ matrix.variant }}* \
143- variants/${{ matrix.variant }}/ \
144- ${FULL_BUILD_DIR} \
145- | zstd > binaries-${ARTIFACT_TAG}.tar.zstd
146-
147- - name : Archive board binaries
148- if : ${{ !cancelled() }}
149- uses : actions/upload-artifact@v4
150- with :
151- name : ${{ format('{0}binaries-{1}', (job.status == 'failure') && 'failed-' || '', env.ARTIFACT_TAG) }}
152- path : binaries-${{ env.ARTIFACT_TAG }}.tar.zstd
153-
154- - name : Archive build reports
155- if : ${{ !cancelled() }}
156- uses : actions/upload-artifact@v4
157- with :
158- name : build-report-${{ env.ARTIFACT_TAG }}
159- path : ${{ env.REPORT_FILES }}
160-
161- package-core :
162- name : Package ${{ matrix.artifact }}
163- runs-on : ubuntu-latest
164- needs :
165- - build-env
166- - build-board
167- env :
168- ALL_BOARD_DATA : ${{ needs.build-env.outputs.ALL_BOARD_DATA }}
169- CORE_ARTIFACT : ArduinoCore-${{ matrix.artifact }}-${{ needs.build-env.outputs.CORE_HASH }}
170- CORE_TAG : ${{ needs.build-env.outputs.CORE_TAG }}
171- strategy :
172- matrix :
173- artifact : ${{ fromJSON( needs.build-env.outputs.ARTIFACTS ) }}
174- fail-fast : false
175- if : ${{ !cancelled() && needs.build-env.result == 'success' }}
176- steps :
177- - uses : actions/checkout@v4
178- with :
179- submodules : ' recursive'
180- fetch-depth : 0
181- persist-credentials : false
182- fetch-tags : true
183-
184- - uses : actions/download-artifact@v4
185- with :
186- path : .
187- name : arduino-api
188-
189- - uses : actions/download-artifact@v4
190- with :
191- path : .
192- pattern : binaries-*
193- merge-multiple : true
194-
195- - name : Package core
196- run : |
197- rm -f cores/arduino/api # remove broken symlink
198- tar --use-compress-program=unzstd -xpf arduino-api.tar.zstd
199- for f in binaries-*.tar.zstd ; do
200- tar --use-compress-program=unzstd -xpf $f
201- done
202- ./extra/package_core.sh ${{ matrix.artifact }} ${CORE_TAG} distrib/${CORE_ARTIFACT}.tar.bz2
203-
204- - uses : actions/upload-artifact@v4
205- if : ${{ success() || failure() }}
206- with :
207- name : ${{ env.CORE_ARTIFACT }}
208- path : distrib/${{ env.CORE_ARTIFACT }}.tar.bz2
209-
210- cleanup-build :
211- name : Clean up intermediates
212- runs-on : ubuntu-latest
213- needs :
214- - package-core
215- steps :
216- - uses : geekyeggo/delete-artifact@v5.1.0
217- with :
218- name : |
219- arduino-api
220- binaries-*
221- build-env
222- failOnError : false
223-
224- test-core :
225- name : Test ${{ matrix.subarch }}:${{ matrix.board }}
226- runs-on : ubuntu-latest
227- needs :
228- - build-env
229- - package-core
230- strategy :
231- matrix :
232- include :
233- ${{ fromJSON( needs.build-env.outputs.ALL_BOARD_DATA ) }}
234- fail-fast : false
235- env :
236- PLAT : arduino:${{ matrix.subarch }}
237- FQBN : arduino:${{ matrix.subarch }}:${{ matrix.board }}
238- CORE_ARTIFACT : ArduinoCore-${{ matrix.artifact }}-${{ needs.build-env.outputs.CORE_HASH }}
239- ARTIFACT_TAG : ${{ needs.build-env.outputs.CORE_HASH }}-${{ matrix.board }}
240- if : ${{ !cancelled() && needs.build-env.result == 'success' }}
241- steps :
242- - uses : actions/checkout@v4
243- with :
244- fetch-depth : 0
245- persist-credentials : false
246- sparse-checkout : |
247- extra/ci_test_list.sh
248- extra/artifacts/
249-
250- - uses : actions/download-artifact@v4
251- with :
252- name : ${{ env.CORE_ARTIFACT }}
253-
254- - name : Set up core
255- run : |
256- tar xf ${CORE_ARTIFACT}.tar.bz2 # will create ArduinoCore-zephyr/
257- echo "REPORT_FILE=$(echo ${FQBN} | tr ':' '-').json" >> $GITHUB_ENV
258-
259- - name : Get test sketches
260- run : |
261- # sets ALL_TESTS and ALL_LIBRARIES env vars
262- extra/ci_test_list.sh ${{ matrix.artifact }} ${{ matrix.variant }}
263-
264- - name : Compile tests for ${{ matrix.board }}
265- uses : pillo79/compile-sketches@next
266- with :
267- fqbn : ${{ env.FQBN }}
268- platforms : |
269- # Use Board Manager version first, to install the toolchain
270- - name: ${{ env.PLAT }}
271- - name: ${{ env.PLAT }}
272- source-path: "ArduinoCore-zephyr"
273- sketch-paths : |
274- ${{ env.ALL_TESTS }}
275- libraries : |
276- ${{ env.ALL_LIBRARIES }}
277- cli-compile-flags : |
278- - '--build-property'
279- - 'compiler.c.extra_flags=-Wno-type-limits -Wno-missing-field-initializers'
280- - '--build-property'
281- - 'compiler.cpp.extra_flags=-Wno-type-limits -Wno-missing-field-initializers'
282- verbose : ' false'
283- enable-deltas-report : ' false'
284- enable-issues-report : ' true'
285- always-succeed : ' true'
286-
287- - name : Get test job ID
288- id : job_id
289- if : ${{ success() || failure() }}
290- uses : actions/github-script@main
291- with :
292- script : |
293- const { data: workflow_run } = await github.rest.actions.listJobsForWorkflowRun({
294- owner: context.repo.owner,
295- repo: context.repo.repo,
296- run_id: context.runId
297- });
298- const job_name = `Test ${{ matrix.subarch }}:${{ matrix.board }}`
299- return workflow_run.jobs.find((job) => job.name === job_name).id;
300-
301- - name : Prepare log
302- if : ${{ success() || failure() }}
303- run : |
304- [ ! -f sketches-reports/${REPORT_FILE} ] && mkdir -p sketches-reports && echo "{}" > sketches-reports/${REPORT_FILE}
305- sed -i -e 's!/home/runner/.arduino15/packages/arduino/hardware/zephyr/[^/]*/!!g' sketches-reports/${REPORT_FILE}
306- cat sketches-reports/${REPORT_FILE} | jq -cr ". += { job_id: ${{ steps.job_id.outputs.result }} }" > ${REPORT_FILE} && mv ${REPORT_FILE} sketches-reports/
307-
308- - uses : actions/upload-artifact@v4
309- if : ${{ success() || failure() }}
310- with :
311- name : test-report-${{ env.ARTIFACT_TAG }}
312- path : sketches-reports/*
313-
3148 inspect-logs :
3159 name : Analyze logs
31610 runs-on : ubuntu-latest
@@ -322,25 +16,17 @@ jobs:
32216 env :
32317 ALL_BOARD_DATA : ${{ needs.build-env.outputs.ALL_BOARD_DATA }}
32418 steps :
325- - uses : actions/checkout@v4
326- with :
327- fetch-depth : 0
328- persist-credentials : false
329-
330- - uses : actions/download-artifact@v4
331- with :
332- path : .
333- pattern : " *-report-*"
334- merge-multiple : true
335-
33619 # Collect and summarize logs
33720 - run : |
338- mkdir -p reports
339- echo ${{ github.event.pull_request.number }} > pr_number
340- extra/ci_inspect_logs.py reports/result reports/summary reports/full_log
341- echo "CI_RESULT=$(cat reports/result)" > $GITHUB_OUTPUT
342- if ${{ github.event_name != 'pull_request' && 'true' || 'false' }}; then
343- cat reports/summary >> $GITHUB_STEP_SUMMARY
21+ extra/ci_inspect_logs.py result summary full_log
22+
23+ if [ "${{ github.event_name }}" == "pull_request" ]; then
24+ mkdir -p comment-request
25+ echo "${{ github.event.pull_request.number }}" > comment-request/pr_number
26+ cp summary comment-request/comment_body
27+ echo "delete-existing" > comment-request/update_mode
28+ else
29+ cat summary >> $GITHUB_STEP_SUMMARY
34430 fi
34531 cat full_log >> $GITHUB_STEP_SUMMARY
34632 echo "CI_RESULT=$(cat result)" > $GITHUB_OUTPUT
@@ -352,12 +38,6 @@ jobs:
35238 name : comment-request
35339 path : comment-request/
35440
355- - name : Archive comment information
356- uses : actions/upload-artifact@v4
357- with :
358- name : summary
359- path : reports/
360-
36141 - name : Clean up intermediate artifacts
36242 uses : geekyeggo/delete-artifact@v5.1.0
36343 with :
@@ -369,14 +49,13 @@ jobs:
36949 verify-core :
37050 runs-on : ubuntu-latest
37151 needs :
372- - build-env
373- - package-core
37452 - inspect-logs
37553 if : ${{ !cancelled() }}
37654 steps :
37755 - name : CI run result
37856 run : |
379- exit ${{ ((needs.inspect-logs.CI_RESULT == 'PASSED') && !contains(needs.*.result, 'failure')) && '0' || '1' }}
57+ echo ${{ needs.inspect-logs.outputs.CI_RESULT }}
58+ exit ${{ ((needs.inspect-logs.outputs.CI_RESULT == 'PASSED') && !contains(needs.*.result, 'failure')) && '0' || '1' }}
38059
38160 publish-core :
38261 name : Publish core
0 commit comments