@@ -19,17 +19,26 @@ jobs:
1919 detect-changes :
2020 runs-on : ubuntu-24.04
2121 outputs :
22- examples_changed : ${{ steps.changed-files.outputs.any_changed }}
22+ examples_changed : ${{ steps.changed-examples.outputs.any_changed }}
23+ devtools_changed : ${{ steps.changed-devtools.outputs.any_changed }}
2324 steps :
2425 - name : Checkout code
2526 uses : actions/checkout@v6
2627 - name : Detect changed example files
27- id : changed-files
28+ id : changed-examples
2829 uses : tj-actions/changed-files@v47
2930 with :
3031 files : |
3132 examples/**
3233 .ci/**
34+ - name : Detect changed devtools files
35+ id : changed-devtools
36+ uses : tj-actions/changed-files@v47
37+ with :
38+ files : |
39+ devtools/**
40+ examples/**
41+ .ci/non-working
3342
3443 lint :
3544 needs : detect-changes
@@ -131,12 +140,95 @@ jobs:
131140 path : ${{ runner.temp }}/status-check-logs
132141 if-no-files-found : ignore
133142
143+ devtools-check :
144+ needs : detect-changes
145+ if : ${{ github.event_name == 'workflow_dispatch' ||
146+ needs.detect-changes.outputs.devtools_changed == 'true' }}
147+ runs-on : ubuntu-24.04
148+ timeout-minutes : 5
149+ steps :
150+ - name : Checkout code
151+ uses : actions/checkout@v6
152+ - name : Install shellcheck
153+ run : sudo apt-get update && sudo apt-get install -y --no-install-recommends shellcheck
154+ - name : Run devtools offline checks
155+ run : devtools/check.sh
156+
157+ devtools-qemu :
158+ needs :
159+ - detect-changes
160+ - devtools-check
161+ if : ${{ github.event_name == 'workflow_dispatch' ||
162+ needs.detect-changes.outputs.devtools_changed == 'true' }}
163+ runs-on : ubuntu-24.04
164+ timeout-minutes : 45
165+ steps :
166+ - name : Checkout code
167+ uses : actions/checkout@v6
168+ - name : Install dependencies
169+ run : |
170+ sudo apt-get update
171+ sudo apt-get install -y --no-install-recommends \
172+ build-essential bc flex bison libelf-dev libssl-dev \
173+ cpio qemu-system-x86
174+ - name : Restore kernel source cache
175+ uses : actions/cache@v5
176+ with :
177+ path : |
178+ devtools/.cache/linux-*.tar.xz
179+ devtools/.cache/linux-*/
180+ key : devtools-kernel-src-${{ runner.os }}-${{ hashFiles('devtools/config.defaults') }}
181+ - name : Restore kernel build cache
182+ uses : actions/cache@v5
183+ with :
184+ path : devtools/.cache/kernel-build
185+ key : devtools-kernel-build-${{ runner.os }}-${{ hashFiles('devtools/config.defaults', 'devtools/kernel.config') }}
186+ restore-keys : |
187+ devtools-kernel-build-${{ runner.os }}-
188+ - name : Restore busybox cache
189+ uses : actions/cache@v5
190+ with :
191+ path : |
192+ devtools/.cache/busybox-*.tar.bz2
193+ devtools/.cache/busybox-*/
194+ key : devtools-busybox-${{ runner.os }}-${{ hashFiles('devtools/config.defaults') }}
195+ - name : Restore initramfs cache
196+ uses : actions/cache@v5
197+ with :
198+ path : |
199+ devtools/.cache/initramfs
200+ devtools/.cache/initramfs.cpio.gz
201+ devtools/.cache/.initramfs-stamp
202+ key : devtools-initramfs-${{ runner.os }}-${{ hashFiles('devtools/config.defaults', 'devtools/initramfs/init') }}
203+ - name : Build kernel and initramfs
204+ run : devtools/setup.sh
205+ - name : Build kernel modules
206+ run : devtools/build-modules.sh
207+ - name : Run QEMU module tests
208+ timeout-minutes : 10
209+ run : devtools/test-modules.sh --no-build
210+ - name : Collect guest log
211+ if : failure()
212+ run : |
213+ mkdir -p "${{ runner.temp }}/devtools-logs"
214+ sudo dmesg --color=never | tail -n 200 \
215+ > "${{ runner.temp }}/devtools-logs/dmesg.log" 2>/dev/null || true
216+ - name : Upload diagnostics
217+ if : failure()
218+ uses : actions/upload-artifact@v7
219+ with :
220+ name : devtools-qemu-logs
221+ path : ${{ runner.temp }}/devtools-logs
222+ if-no-files-found : ignore
223+
134224 validate :
135225 needs :
136226 - detect-changes
137227 - lint
138228 - static-analysis
139229 - build-and-run
230+ - devtools-check
231+ - devtools-qemu
140232 if : ${{ always() }}
141233 runs-on : ubuntu-24.04
142234 steps :
@@ -146,19 +238,32 @@ jobs:
146238 result_lint="${{ needs.lint.result }}"
147239 result_sa="${{ needs.static-analysis.result }}"
148240 result_bar="${{ needs.build-and-run.result }}"
149- changed="${{ needs.detect-changes.outputs.examples_changed }}"
241+ result_check="${{ needs.devtools-check.result }}"
242+ result_qemu="${{ needs.devtools-qemu.result }}"
243+ examples_changed="${{ needs.detect-changes.outputs.examples_changed }}"
244+ devtools_changed="${{ needs.detect-changes.outputs.devtools_changed }}"
150245
151246 if [[ "${result_detect}" != "success" ]]; then
152247 echo "Change-detection job did not succeed: ${result_detect}"
153248 exit 1
154249 fi
155250
156- # When examples changed (or manual dispatch), jobs must succeed
157- if [[ "${changed }" == "true" || "${{ github.event_name }}" == "workflow_dispatch" ]]; then
251+ # When examples changed (or manual dispatch), lint/analysis/build jobs must succeed
252+ if [[ "${examples_changed }" == "true" || "${{ github.event_name }}" == "workflow_dispatch" ]]; then
158253 for r in "${result_lint}" "${result_sa}" "${result_bar}"; do
159254 if [[ "${r}" != "success" ]]; then
160255 echo "Required job did not succeed: ${r}"
161256 exit 1
162257 fi
163258 done
164259 fi
260+
261+ # When devtools or examples changed (or manual dispatch), devtools jobs must succeed
262+ if [[ "${devtools_changed}" == "true" || "${{ github.event_name }}" == "workflow_dispatch" ]]; then
263+ for r in "${result_check}" "${result_qemu}"; do
264+ if [[ "${r}" != "success" ]]; then
265+ echo "devtools job did not succeed: ${r}"
266+ exit 1
267+ fi
268+ done
269+ fi
0 commit comments