Skip to content

Commit 68446e8

Browse files
gha: use subsets for tests
paralelize build and run of UT on boards Signed-off-by: Robert Gałat <[email protected]>
1 parent b713146 commit 68446e8

File tree

5 files changed

+104
-27
lines changed

5 files changed

+104
-27
lines changed

.github/workflows/on-pr.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,6 @@ jobs:
2828
name: Build samples
2929
uses: ./.github/workflows/samples_build.yml
3030

31-
# build_and_run_tests:
32-
# name: Build and run unit tests
33-
# uses: ./.github/workflows/run_tests.yml
31+
build_and_run_tests:
32+
name: Build and run unit tests
33+
uses: ./.github/workflows/run_tests.yml

.github/workflows/run_tests.yml

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
name: Build Sidewalk samples
22
on:
33
workflow_call:
4+
inputs:
5+
jobs_per_subset:
6+
type: number
7+
required: false
8+
default: 3
49

510
jobs:
611
discover_targets:
@@ -10,6 +15,8 @@ jobs:
1015
options: --cpus 2 --privileged
1116
outputs:
1217
total_platforms_json: ${{ steps.platforms.outputs.total_platforms_json }}
18+
subset_matrix: ${{ steps.subsets.outputs.matrix }}
19+
subset_config: ${{ steps.subsets.outputs.config }}
1320
defaults:
1421
run:
1522
shell: nrfutil toolchain-manager launch --install-dir /root/ncs bash -- {0}
@@ -39,6 +46,30 @@ jobs:
3946
total_platforms_json=$(printf '%s' "${total_platforms[@]}" | jq -R . | jq -s -c .)
4047
echo "total_platforms_json=$total_platforms_json" >> $GITHUB_OUTPUT;
4148
49+
- name: subsets configuration
50+
id: subsets
51+
run: |
52+
rm -rf twister-out* max max_sorted configuration
53+
west twister --test-config sidewalk/test_config.yaml --testsuite-root sidewalk --level="Github_tests" --exclude-platform native_sim --exclude-platform native_posix --exclude-platform unit_testing --dry-run
54+
total_platforms=$(jq -r '.testsuites |map({platform: .platform}) | unique | .[].platform' twister-out/testplan.json)
55+
echo "[]" > configuration
56+
for platform in $total_platforms; do
57+
west twister --test-config sidewalk/test_config.yaml --testsuite-root sidewalk --level="Github_tests" --dry-run --platform $platform
58+
total_jobs=$(jq '.testsuites | length' twister-out/testplan.json)
59+
subsets=$(( ( total_jobs + ${{inputs.jobs_per_subset}}) / ${{inputs.jobs_per_subset}}))
60+
echo $subsets >> max
61+
cat configuration | jq -c --arg platform_name $platform --arg subsets $subsets '. += [{"platform": $platform_name, "subsets": $subsets}]' > configuration_new
62+
mv configuration_new configuration
63+
done
64+
sort max > max_sorted
65+
max_subset=$(tail -n 1 max_sorted)
66+
subset_matrix="[$(seq -s ', ' 1 $max_subset)]"
67+
cat configuration
68+
echo $subset_matrix
69+
70+
echo "matrix=$subset_matrix" >> $GITHUB_OUTPUT;
71+
echo "config=`cat configuration`" >> $GITHUB_OUTPUT;
72+
4273
- name: clean
4374
if: always()
4475
run: |
@@ -115,11 +146,14 @@ jobs:
115146
strategy:
116147
fail-fast: false
117148
matrix:
118-
board: ${{ fromJson(needs.discover_targets.outputs.total_platforms_json) }}
149+
subset: ${{ fromJson(needs.discover_targets.outputs.subset_matrix) }}
150+
target: ${{ fromJson(needs.discover_targets.outputs.total_platforms_json) }}
119151
uses: ./.github/workflows/run_tests_dut.yml
120152
with:
121153
run_tests: true
122-
target_board: ${{ matrix.board }}
154+
target: ${{matrix.target}}
155+
subset: ${{matrix.subset}}
156+
subset_config: '${{needs.discover_targets.outputs.subset_config}}'
123157

124158
merge_tests_on_hw:
125159
needs: build-and-test_on_hw

.github/workflows/run_tests_dut.yml

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,41 @@ name: Build and run DUT tests
22
on:
33
workflow_call:
44
inputs:
5-
target_board:
6-
description: "target board for tests"
5+
target:
76
type: string
87
required: true
8+
subset_config:
9+
type: string
10+
required: true
11+
subset:
12+
type: number
13+
required: true
914
run_tests:
1015
description: ""
1116
required: false
1217
type: boolean
1318
default: true
1419

1520
jobs:
21+
parse_config:
22+
runs-on: ubuntu-24.04
23+
name: ${{inputs.subset}} - ${{inputs.target}} config
24+
outputs:
25+
max_subset: ${{steps.subsets.outputs.max_subset}}
26+
steps:
27+
- name: subsets
28+
id: subsets
29+
run: |
30+
echo '${{inputs.subset_config}}' > configuration.json
31+
cat configuration.json
32+
max_subsets=$(jq --arg target_name "${{inputs.target}}" '.[] | select(.platform == $target_name).subsets | tonumber' configuration.json)
33+
echo "max_subset=$max_subsets"
34+
echo "max_subset=$max_subsets" >> $GITHUB_OUTPUT
35+
1636
build_dut_tests:
17-
name: "Build UT for (${{inputs.target_board}})"
37+
needs: [parse_config]
38+
if: ${{ inputs.subset <= needs.parse_config.outputs.max_subset }}
39+
name: "Build UT ${{inputs.subset}} - ${{inputs.target}}"
1840
runs-on: ubuntu-24.04
1941
container:
2042
image: ghcr.io/nrfconnect/sdk-sidewalk:main
@@ -44,7 +66,7 @@ jobs:
4466
- name: Replace slash with underscore
4567
id: replace
4668
run: |
47-
TARGET_BOARD=${{ inputs.target_board }}
69+
TARGET_BOARD=${{ inputs.target }}
4870
TARGET_BOARD=${TARGET_BOARD//\//_}
4971
echo "target_board=$TARGET_BOARD" >> $GITHUB_OUTPUT
5072
@@ -59,7 +81,7 @@ jobs:
5981
- name: Build DUT test artifacts
6082
run: |
6183
source zephyr/zephyr-env.sh
62-
west twister --test-config sidewalk/test_config.yaml --level="Github_tests" --platform ${{inputs.target_board}} --testsuite-root sidewalk --inline-logs --overflow-as-errors -vvv --prep-artifacts-for-testing --package-artifacts PACKAGE_ARTIFACTS.tar.bz2
84+
west twister --test-config sidewalk/test_config.yaml --level="Github_tests" --platform ${{inputs.target}} --testsuite-root sidewalk --inline-logs --overflow-as-errors -vvv --prep-artifacts-for-testing --package-artifacts PACKAGE_ARTIFACTS_${{ inputs.subset }}.tar.bz2 --subset ${{ inputs.subset }}/${{needs.parse_config.outputs.max_subset}}
6385
6486
- name: Print ccache stats
6587
run: |
@@ -68,16 +90,15 @@ jobs:
6890
- name: Save build artifacts
6991
uses: actions/upload-artifact@v4
7092
with:
71-
path: PACKAGE_ARTIFACTS.tar.bz2
72-
name: DUT_artifacts_${{steps.replace.outputs.target_board}}
93+
path: PACKAGE_ARTIFACTS_${{ inputs.subset }}.tar.bz2
94+
name: DUT_artifacts_${{steps.replace.outputs.target_board}}_${{ inputs.subset }}
7395
include-hidden-files: true
7496

7597
run_dut_ut:
76-
needs: [build_dut_tests]
77-
78-
if: ${{ fromJson(inputs.run_tests) }}
79-
name: "Run on ${{inputs.target_board}}"
80-
runs-on: [self-hosted, linux, x64, "${{inputs.target_board}}"]
98+
needs: [build_dut_tests, parse_config]
99+
if: ${{ fromJson(inputs.run_tests) }} and ${{ inputs.subset <= needs.parse_config.outputs.max_subset }}
100+
name: "Run UT ${{ inputs.subset }} - ${{inputs.target}}"
101+
runs-on: [self-hosted, linux, x64, "${{inputs.target}}"]
81102
container:
82103
image: ghcr.io/nrfconnect/sdk-sidewalk:main
83104
options: --cpus 2 --privileged
@@ -114,7 +135,7 @@ jobs:
114135
- name: Replace slash with underscore
115136
id: replace
116137
run: |
117-
TARGET_BOARD=${{ inputs.target_board }}
138+
TARGET_BOARD=${{ inputs.target }}
118139
TARGET_BOARD=${TARGET_BOARD//\//_}
119140
echo "target_board=$TARGET_BOARD" >> $GITHUB_OUTPUT
120141
@@ -125,11 +146,11 @@ jobs:
125146
- name: Download artifacts
126147
uses: actions/download-artifact@v4
127148
with:
128-
name: DUT_artifacts_${{steps.replace.outputs.target_board}}
149+
name: DUT_artifacts_${{steps.replace.outputs.target_board}}_${{ inputs.subset }}
129150

130151
- name: Unwrap artifacts
131152
run: |
132-
tar -xf PACKAGE_ARTIFACTS.tar.bz2
153+
tar -xf PACKAGE_ARTIFACTS_${{ inputs.subset }}.tar.bz2
133154
134155
- name: Run Tests
135156
run: |
@@ -138,13 +159,13 @@ jobs:
138159
139160
- name: rename_twister_xml_report
140161
run: |
141-
mv twister-out/twister.xml twister-out/${{steps.replace.outputs.target_board}}_twister.xml
162+
mv twister-out/twister.xml twister-out/${{steps.replace.outputs.target_board}}_${{ inputs.subset }}_twister.xml
142163
143164
- name: Upload test results
144165
uses: actions/upload-artifact@v4
145166
if: always()
146167
with:
147-
name: tests-dut_result_${{steps.replace.outputs.target_board}}
168+
name: tests-dut_result_${{steps.replace.outputs.target_board}}_${{ inputs.subset }}
148169
path: |
149170
twister-out/${{steps.replace.outputs.target_board}}_twister.xml
150171
twister-out/**/handler.log

.github/workflows/samples_build.yml

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ jobs:
5454
- name: subsets configuration
5555
id: subsets
5656
run: |
57-
rm -rf twister-out*
57+
rm -rf twister-out* max max_sorted configuration
5858
west twister --test-config sidewalk/test_config.yaml --testsuite-root sidewalk --level="samples" --dry-run
5959
total_platforms=$(jq -r '.testsuites |map({platform: .platform}) | unique | .[].platform' twister-out/testplan.json)
6060
echo "[]" > configuration
@@ -93,4 +93,25 @@ jobs:
9393
target: ${{matrix.target}}
9494
subset: ${{matrix.subset}}
9595
subset_config: '${{needs.discover_targets.outputs.subset_config}}'
96-
# subset_config: '[{"platform":"nrf52840dk/nrf52840","subsets":"4"},{"platform":"nrf5340dk/nrf5340/cpuapp","subsets":"4"},{"platform":"nrf54l15dk/nrf54l10/cpuapp","subsets":"4"},{"platform":"nrf54l15dk/nrf54l15/cpuapp","subsets":"4"},{"platform":"nrf54l15dk/nrf54l15/cpuapp/ns","subsets":"4"},{"platform":"thingy53/nrf5340/cpuapp","subsets":"1"}]'
96+
97+
merge_sample_artifacts:
98+
needs: build_samples
99+
runs-on: ubuntu-24.04
100+
permissions: write-all
101+
steps:
102+
- name: Merge Artifacts
103+
uses: actions/upload-artifact/merge@v4
104+
with:
105+
delete-merged: true
106+
name: sample-artifacts-meta
107+
pattern: sample-artifacts-meta-*
108+
include-hidden-files: true
109+
110+
- name: Merge Artifacts
111+
uses: actions/upload-artifact/merge@v4
112+
if: ${{ inputs.save_images }}
113+
with:
114+
delete-merged: true
115+
name: sample-artifacts
116+
pattern: sample-artifacts-build-*
117+
include-hidden-files: true

.github/workflows/samples_build_target.yml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,15 @@ jobs:
8888
8989
- name: Prepare artifacts for upload
9090
run: |
91-
mkdir subset_${{inputs.subset}}; cp twister-out/twister.json subset_${{inputs.subset}}
91+
mkdir -p subsets/${{inputs.subset}}_of_${{ needs.parse_config.outputs.max_subset }}_${{ steps.replace.outputs.target_board}}
92+
cp twister-out/twister.json subsets/${{inputs.subset}}_of_${{ needs.parse_config.outputs.max_subset }}_${{ steps.replace.outputs.target_board}}
9293
9394
- name: Upload build metadata
9495
uses: actions/upload-artifact@v4
9596
with:
9697
name: sample-artifacts-meta-${{ steps.replace.outputs.target_board}}-${{inputs.subset}}
9798
path: |
98-
subset_${{inputs.subset}}
99+
subsets
99100
twister-out/**/build.log
100101
twister-out/**/.config
101102
twister-out/**/runners.yaml
@@ -108,7 +109,7 @@ jobs:
108109
with:
109110
name: sample-artifacts-build-${{ steps.replace.outputs.target_board}}-${{inputs.subset}}
110111
path: |
111-
subset_${{inputs.subset}}
112+
subsets
112113
twister-out/**/zephyr.elf
113114
twister-out/**/zephyr.hex
114115
twister-out/**/merged.hex

0 commit comments

Comments
 (0)