Skip to content

Commit 0938895

Browse files
authored
ci: dynamically build the test matrix (#5307)
Dynamically build the matrix of tests to run so we can have each test in its own step without having to manually maintain the test matrix.
1 parent ed27c01 commit 0938895

File tree

1 file changed

+84
-3
lines changed

1 file changed

+84
-3
lines changed

.github/workflows/ci.yml

Lines changed: 84 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ jobs:
3333
env:
3434
CONTAINER_IMAGE_ID: "ghcr.io/super-linter/super-linter:${{ matrix.images.prefix }}latest"
3535
CONTAINER_IMAGE_TARGET: "${{ matrix.images.target }}"
36+
CONTAINER_IMAGE_OUTPUT_IMAGE_NAME: "super-linter-${{ matrix.images.prefix }}latest"
3637
steps:
3738
- name: Checkout Code
3839
uses: actions/checkout@v4
@@ -94,14 +95,21 @@ jobs:
9495
BUILD_REVISION=${{ env.BUILD_REVISION }}
9596
BUILD_VERSION=${{ env.BUILD_VERSION }}
9697
cache-from: type=registry,ref=${{ env.CONTAINER_IMAGE_ID }}-buildcache
97-
load: true
98+
outputs: type=docker,dest=/tmp/${{ env.CONTAINER_IMAGE_OUTPUT_IMAGE_NAME }}.tar
9899
push: false
99100
secrets: |
100101
GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}
101102
tags: |
102103
${{ env.CONTAINER_IMAGE_ID }}
103104
target: "${{ matrix.images.target }}"
104105

106+
# Load the image here because the docker/build-push-action doesn't support multiple exporters yet
107+
# Ref: https://github.com/docker/build-push-action/issues/413
108+
# Ref: https://github.com/moby/buildkit/issues/1555
109+
- name: Load image
110+
run: |
111+
docker load <"/tmp/${{ env.CONTAINER_IMAGE_OUTPUT_IMAGE_NAME }}.tar"
112+
105113
- name: Test Local Action (debug log)
106114
uses: ./
107115
env:
@@ -128,8 +136,81 @@ jobs:
128136
FILTER_REGEX_EXCLUDE: ".*(/test/linters/|CHANGELOG.md).*"
129137
TYPESCRIPT_STANDARD_TSCONFIG_FILE: ".github/linters/tsconfig.json"
130138

131-
- name: Run Test Suite
132-
run: make test
139+
# Validate the container image labels here so we don't have to pass the expected
140+
# label values to other build jobs
141+
- name: Validate container image labels
142+
run: make validate-container-image-labels
143+
144+
- name: Upload ${{ env.CONTAINER_IMAGE_OUTPUT_IMAGE_NAME }} container image
145+
uses: actions/upload-artifact@v4.3.1
146+
with:
147+
name: ${{ env.CONTAINER_IMAGE_OUTPUT_IMAGE_NAME }}
148+
path: /tmp/${{ env.CONTAINER_IMAGE_OUTPUT_IMAGE_NAME }}.tar
149+
150+
build-test-suite-matrix:
151+
name: Build test suite matrix
152+
runs-on: ubuntu-latest
153+
needs: test
154+
permissions:
155+
contents: read
156+
outputs:
157+
matrix: ${{ steps.generate-matrix.outputs.test-cases }}
158+
steps:
159+
- name: Checkout Code
160+
uses: actions/checkout@v4
161+
with:
162+
fetch-depth: 0
163+
- name: Generate test cases matrix
164+
id: generate-matrix
165+
run: |
166+
TEST_TARGETS=$(make -pRrq 2>&1 | grep 'test:' | tr -d '\n' | sed -e "s/^test: //" | jq --raw-input --slurp --compact-output 'split(" ")')
167+
echo "TEST_TARGETS: ${TEST_TARGETS}"
168+
echo "test-cases=${TEST_TARGETS}" >> "${GITHUB_OUTPUT}"
169+
170+
run-test-suite:
171+
name: Run test cases
172+
runs-on: ubuntu-latest
173+
permissions:
174+
contents: read
175+
needs: build-test-suite-matrix
176+
strategy:
177+
matrix:
178+
test-case: ${{ fromJson(needs.build-test-suite-matrix.outputs.matrix) }}
179+
images:
180+
- container-image-id: super-linter-latest
181+
prefix: ""
182+
target: standard
183+
- container-image-id: super-linter-slim-latest
184+
prefix: slim-
185+
target: slim
186+
exclude:
187+
# Don't validate container image labels because we do that when building the image
188+
- test-case: validate-container-image-labels
189+
env:
190+
CONTAINER_IMAGE_ID: "ghcr.io/super-linter/super-linter:${{ matrix.images.prefix }}latest"
191+
CONTAINER_IMAGE_TARGET: "${{ matrix.images.target }}"
192+
CONTAINER_IMAGE_OUTPUT_IMAGE_NAME: "super-linter-${{ matrix.images.prefix }}latest"
193+
steps:
194+
- name: Checkout Code
195+
uses: actions/checkout@v4
196+
with:
197+
fetch-depth: 0
198+
199+
- name: Download ${{ env.CONTAINER_IMAGE_OUTPUT_IMAGE_NAME }} container image
200+
uses: actions/download-artifact@v4.1.2
201+
with:
202+
name: ${{ env.CONTAINER_IMAGE_OUTPUT_IMAGE_NAME }}
203+
path: /tmp
204+
205+
- name: Load ${{ env.CONTAINER_IMAGE_OUTPUT_IMAGE_NAME }} container image
206+
run: |
207+
docker load --input /tmp/${{ env.CONTAINER_IMAGE_OUTPUT_IMAGE_NAME }}.tar
208+
docker image ls -a
209+
210+
- name: "Test case: ${{ env.CONTAINER_IMAGE_OUTPUT_IMAGE_NAME }} - ${{ matrix.test-case }}"
211+
run: |
212+
echo "Running: ${{ env.CONTAINER_IMAGE_OUTPUT_IMAGE_NAME }} - ${{ matrix.test-case }}"
213+
make ${{ matrix.test-case }}
133214
env:
134215
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
135216

0 commit comments

Comments
 (0)