Skip to content

Commit 1a42865

Browse files
authored
Merge pull request #204 from crazy-max/subaction-matrix
matrix subaction
2 parents 6de75d5 + ba406cd commit 1a42865

9 files changed

Lines changed: 373 additions & 65 deletions

File tree

.github/subaction-list-targets.png

-4.41 KB
Loading

.github/subaction-matrix.png

11.6 KB
Loading

.github/workflows/ci-subaction.yml

Lines changed: 79 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,28 @@ on:
2525
- 'test/**'
2626

2727
jobs:
28-
list-targets-group:
28+
list-targets:
2929
runs-on: ubuntu-latest
30+
strategy:
31+
fail-fast: false
32+
matrix:
33+
include:
34+
-
35+
testdir: group
36+
expected: >
37+
["t1","t2"]
38+
-
39+
testdir: group-matrix
40+
target: validate
41+
expected: >
42+
["lint-default","lint-labs","lint-nydus","lint-proto","lint-yaml","validate-doctoc","validate-vendor"]
43+
-
44+
testdir: multi-files
45+
files: |
46+
docker-bake.json
47+
docker-bake.hcl
48+
expected: >
49+
["v1-tag","v2-tag"]
3050
steps:
3151
-
3252
name: Checkout
@@ -36,64 +56,81 @@ jobs:
3656
id: gen
3757
uses: ./subaction/list-targets
3858
with:
39-
workdir: ./test/group
59+
workdir: ./test/${{ matrix.testdir }}
60+
files: ${{ matrix.files }}
61+
target: ${{ matrix.target }}
4062
-
41-
name: Check targets
63+
name: Check output
4264
uses: actions/github-script@v7
65+
env:
66+
INPUT_TARGETS: ${{ steps.gen.outputs.targets }}
67+
INPUT_EXPECTED: ${{ matrix.expected }}
4368
with:
4469
script: |
45-
const targets = `${{ steps.gen.outputs.targets }}`;
46-
if (!targets) {
47-
core.setFailed('No targets generated');
70+
const targets = JSON.stringify(JSON.parse(core.getInput('targets')));
71+
const expected = JSON.stringify(JSON.parse(core.getInput('expected')));
72+
if (targets !== expected) {
73+
throw new Error(`Targets do not match expected values: ${targets} != ${expected}`);
74+
} else {
75+
core.info(`✅`);
4876
}
49-
core.info(`targets=${targets}`);
5077
51-
list-targets-group-matrix:
78+
matrix:
5279
runs-on: ubuntu-latest
80+
strategy:
81+
fail-fast: false
82+
matrix:
83+
include:
84+
-
85+
testdir: group
86+
expected: >
87+
[{"target":"t1"},{"target":"t2"}]
88+
-
89+
testdir: group-matrix
90+
target: validate
91+
expected: >
92+
[{"target":"lint-default"},{"target":"lint-labs"},{"target":"lint-nydus"},{"target":"lint-proto"},{"target":"lint-yaml"},{"target":"validate-doctoc"},{"target":"validate-vendor"}]
93+
-
94+
testdir: group-with-platform
95+
target: validate
96+
expected: >
97+
[{"target":"lint"},{"target":"lint-gopls"},{"target":"validate-docs"},{"target":"validate-vendor"}]
98+
-
99+
testdir: group-with-platform
100+
target: validate
101+
fields: platforms
102+
expected: >
103+
[{"target":"lint","platforms":"darwin/amd64"},{"target":"lint","platforms":"darwin/arm64"},{"target":"lint","platforms":"linux/amd64"},{"target":"lint","platforms":"linux/arm64"},{"target":"lint","platforms":"linux/s390x"},{"target":"lint","platforms":"linux/ppc64le"},{"target":"lint","platforms":"linux/riscv64"},{"target":"lint","platforms":"windows/amd64"},{"target":"lint","platforms":"windows/arm64"},{"target":"lint-gopls","platforms":"darwin/amd64"},{"target":"lint-gopls","platforms":"darwin/arm64"},{"target":"lint-gopls","platforms":"linux/amd64"},{"target":"lint-gopls","platforms":"linux/arm64"},{"target":"lint-gopls","platforms":"linux/s390x"},{"target":"lint-gopls","platforms":"linux/ppc64le"},{"target":"lint-gopls","platforms":"linux/riscv64"},{"target":"lint-gopls","platforms":"windows/amd64"},{"target":"lint-gopls","platforms":"windows/arm64"},{"target":"validate-docs"},{"target":"validate-vendor"}]
104+
-
105+
testdir: group-with-platform
106+
target: validate
107+
fields: platforms,dockerfile
108+
expected: >
109+
[{"target":"lint","dockerfile":"./hack/dockerfiles/lint.Dockerfile"},{"target":"lint","dockerfile":"./hack/dockerfiles/lint.Dockerfile","platforms":"darwin/amd64"},{"target":"lint","dockerfile":"./hack/dockerfiles/lint.Dockerfile","platforms":"darwin/arm64"},{"target":"lint","dockerfile":"./hack/dockerfiles/lint.Dockerfile","platforms":"linux/amd64"},{"target":"lint","dockerfile":"./hack/dockerfiles/lint.Dockerfile","platforms":"linux/arm64"},{"target":"lint","dockerfile":"./hack/dockerfiles/lint.Dockerfile","platforms":"linux/s390x"},{"target":"lint","dockerfile":"./hack/dockerfiles/lint.Dockerfile","platforms":"linux/ppc64le"},{"target":"lint","dockerfile":"./hack/dockerfiles/lint.Dockerfile","platforms":"linux/riscv64"},{"target":"lint","dockerfile":"./hack/dockerfiles/lint.Dockerfile","platforms":"windows/amd64"},{"target":"lint","dockerfile":"./hack/dockerfiles/lint.Dockerfile","platforms":"windows/arm64"},{"target":"lint-gopls","dockerfile":"./hack/dockerfiles/lint.Dockerfile"},{"target":"lint-gopls","dockerfile":"./hack/dockerfiles/lint.Dockerfile","platforms":"darwin/amd64"},{"target":"lint-gopls","dockerfile":"./hack/dockerfiles/lint.Dockerfile","platforms":"darwin/arm64"},{"target":"lint-gopls","dockerfile":"./hack/dockerfiles/lint.Dockerfile","platforms":"linux/amd64"},{"target":"lint-gopls","dockerfile":"./hack/dockerfiles/lint.Dockerfile","platforms":"linux/arm64"},{"target":"lint-gopls","dockerfile":"./hack/dockerfiles/lint.Dockerfile","platforms":"linux/s390x"},{"target":"lint-gopls","dockerfile":"./hack/dockerfiles/lint.Dockerfile","platforms":"linux/ppc64le"},{"target":"lint-gopls","dockerfile":"./hack/dockerfiles/lint.Dockerfile","platforms":"linux/riscv64"},{"target":"lint-gopls","dockerfile":"./hack/dockerfiles/lint.Dockerfile","platforms":"windows/amd64"},{"target":"lint-gopls","dockerfile":"./hack/dockerfiles/lint.Dockerfile","platforms":"windows/arm64"},{"target":"validate-docs","dockerfile":"./hack/dockerfiles/docs.Dockerfile"},{"target":"validate-vendor","dockerfile":"./hack/dockerfiles/vendor.Dockerfile"}]
53110
steps:
54111
-
55112
name: Checkout
56113
uses: actions/checkout@v5
57114
-
58115
name: Matrix gen
59116
id: gen
60-
uses: ./subaction/list-targets
61-
with:
62-
workdir: ./test/group-matrix
63-
target: validate
64-
-
65-
name: Check targets
66-
uses: actions/github-script@v7
67-
with:
68-
script: |
69-
const targets = `${{ steps.gen.outputs.targets }}`;
70-
if (!targets) {
71-
core.setFailed('No targets generated');
72-
}
73-
core.info(`targets=${targets}`);
74-
75-
list-targets-multi-files:
76-
runs-on: ubuntu-latest
77-
steps:
78-
-
79-
name: Checkout
80-
uses: actions/checkout@v5
81-
-
82-
name: Matrix gen
83-
id: gen
84-
uses: ./subaction/list-targets
117+
uses: ./subaction/matrix
85118
with:
86-
workdir: ./test/multi-files
87-
files: |
88-
docker-bake.json
89-
docker-bake.hcl
119+
workdir: ./test/${{ matrix.testdir }}
120+
target: ${{ matrix.target }}
121+
fields: ${{ matrix.fields }}
90122
-
91-
name: Check targets
123+
name: Check output
92124
uses: actions/github-script@v7
125+
env:
126+
INPUT_MATRIX: ${{ steps.gen.outputs.matrix }}
127+
INPUT_EXPECTED: ${{ matrix.expected }}
93128
with:
94129
script: |
95-
const targets = `${{ steps.gen.outputs.targets }}`;
96-
if (!targets) {
97-
core.setFailed('No targets generated');
130+
const matrix = JSON.stringify(JSON.parse(core.getInput('matrix')));
131+
const expected = JSON.stringify(JSON.parse(core.getInput('expected')));
132+
if (matrix !== expected) {
133+
throw new Error(`Matrix do not match expected values: ${matrix} != ${expected}`);
134+
} else {
135+
core.info(`✅`);
98136
}
99-
core.info(`targets=${targets}`);

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ ___
2222
* [outputs](#outputs)
2323
* [environment variables](#environment-variables)
2424
* [Subactions](#subactions)
25-
* [`list-targets`](subaction/list-targets)
25+
* [`matrix`](subaction/matrix)
2626
* [Contributing](#contributing)
2727

2828
## Usage
@@ -234,7 +234,7 @@ The following outputs are available
234234

235235
## Subactions
236236

237-
* [`list-targets`](subaction/list-targets)
237+
* [`matrix`](subaction/matrix)
238238

239239
## Contributing
240240

subaction/list-targets/README.md

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1+
> [!WARNING]
2+
> `docker/bake-action/subaction/list-targets` is deprecated and will be removed
3+
> in a future release. Please use [`docker/bake-action/subaction/matrix`](../matrix)
4+
> instead.
5+
16
## About
27

38
This subaction generates a list of Bake targets that can be used in a [GitHub matrix](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategymatrix),
49
so you can distribute your builds across multiple runners.
510

6-
![Screenshot](../../.github/bake-action.png)
11+
![Screenshot](../../.github/subaction-list-targets.png)
712

813
___
914

@@ -55,9 +60,6 @@ jobs:
5560
matrix:
5661
target: ${{ fromJson(needs.prepare.outputs.targets) }}
5762
steps:
58-
-
59-
name: Checkout
60-
uses: actions/checkout@v4
6163
-
6264
name: Validate
6365
uses: docker/bake-action@v6
@@ -79,6 +81,6 @@ jobs:
7981

8082
The following outputs are available
8183

82-
| Name | Type | Description |
83-
|------------|----------|----------------------------|
84-
| `targets` | List/CSV | List of extracted targest |
84+
| Name | Type | Description |
85+
|------------|----------|---------------------------|
86+
| `targets` | List/CSV | List of extracted targets |

subaction/list-targets/action.yml

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,6 @@ outputs:
2222
runs:
2323
using: composite
2424
steps:
25-
-
26-
name: Install npm dependencies
27-
uses: actions/github-script@v7
28-
env:
29-
INPUT_ACTIONS-TOOLKIT-VERSION: '0.62.1'
30-
with:
31-
script: |
32-
const version = core.getInput('actions-toolkit-version') || 'latest';
33-
const dep = `@docker/actions-toolkit@${version}`;
34-
await core.group(`Installing ${dep}`, async () => {
35-
await exec.exec('npm', ['install', dep]);
36-
});
3725
-
3826
name: Generate
3927
id: generate
@@ -44,10 +32,14 @@ runs:
4432
INPUT_TARGET: ${{ inputs.target }}
4533
with:
4634
script: |
47-
const { Util } = require('@docker/actions-toolkit/lib/util');
35+
core.warning(`docker/bake-action/subaction/list-targets is deprecated and will be removed in a future release. Please use docker/bake-action/subaction/matrix instead.`);
36+
37+
function getInputList(name) {
38+
return core.getInput(name) ? core.getInput(name).split(/[\r?\n,]+/).filter(x => x !== '') : [];
39+
}
4840
4941
const workdir = core.getInput('workdir');
50-
const files = Util.getInputList('files');
42+
const files = getInputList('files');
5143
const target = core.getInput('target');
5244
5345
let def = {};

subaction/matrix/README.md

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
## About
2+
3+
This subaction generates a multi-dimension matrix that can be used in a [GitHub matrix](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategymatrix)
4+
through the [`include` property](https://docs.github.com/en/actions/how-tos/writing-workflows/choosing-what-your-workflow-does/running-variations-of-jobs-in-a-workflow#expanding-or-adding-matrix-configurations)
5+
so you can distribute your builds across multiple runners.
6+
7+
![Screenshot](../../.github/subaction-matrix.png)
8+
9+
___
10+
11+
* [Usage](#usage)
12+
* [Customizing](#customizing)
13+
* [inputs](#inputs)
14+
* [outputs](#outputs)
15+
16+
## Usage
17+
18+
### List targets
19+
20+
```hcl
21+
# docker-bake.hcl
22+
group "validate" {
23+
targets = ["lint", "doctoc"]
24+
}
25+
26+
target "lint" {
27+
target = "lint"
28+
}
29+
30+
target "doctoc" {
31+
target = "doctoc"
32+
}
33+
```
34+
35+
```yaml
36+
jobs:
37+
prepare:
38+
runs-on: ubuntu-latest
39+
outputs:
40+
matrix: ${{ steps.generate.outputs.matrix }}
41+
steps:
42+
-
43+
name: Checkout
44+
uses: actions/checkout@v4
45+
-
46+
name: Generate matrix
47+
id: generate
48+
uses: docker/bake-action/subaction/matrix@v6
49+
with:
50+
target: validate
51+
52+
validate:
53+
runs-on: ubuntu-latest
54+
needs:
55+
- prepare
56+
strategy:
57+
fail-fast: false
58+
matrix:
59+
include: ${{ fromJson(needs.prepare.outputs.matrix) }}
60+
steps:
61+
-
62+
name: Validate
63+
uses: docker/bake-action@v6
64+
with:
65+
targets: ${{ matrix.target }}
66+
```
67+
68+
### Platforms split
69+
70+
```hcl
71+
# docker-bake.hcl
72+
target "lint" {
73+
dockerfile = "./hack/dockerfiles/lint.Dockerfile"
74+
output = ["type=cacheonly"]
75+
platforms = [
76+
"darwin/amd64",
77+
"darwin/arm64",
78+
"linux/amd64",
79+
"linux/arm64",
80+
"linux/s390x",
81+
"linux/ppc64le",
82+
"linux/riscv64",
83+
"windows/amd64",
84+
"windows/arm64"
85+
]
86+
}
87+
```
88+
89+
```yaml
90+
jobs:
91+
prepare:
92+
runs-on: ubuntu-latest
93+
outputs:
94+
matrix: ${{ steps.generate.outputs.matrix }}
95+
steps:
96+
-
97+
name: Checkout
98+
uses: actions/checkout@v4
99+
-
100+
name: Generate matrix
101+
id: generate
102+
uses: docker/bake-action/subaction/matrix@v6
103+
with:
104+
target: lint
105+
fields: platforms
106+
107+
lint:
108+
runs-on: ${{ startsWith(matrix.platforms, 'linux/arm') && 'ubuntu-24.04-arm' || 'ubuntu-latest' }}
109+
needs:
110+
- prepare
111+
strategy:
112+
fail-fast: false
113+
matrix:
114+
include: ${{ fromJson(needs.prepare.outputs.matrix) }}
115+
steps:
116+
-
117+
name: Lint
118+
uses: docker/bake-action@v6
119+
with:
120+
targets: ${{ matrix.target }}
121+
set: |
122+
*.platform=${{ matrix.platforms }}
123+
```
124+
125+
## Customizing
126+
127+
### inputs
128+
129+
| Name | Type | Description |
130+
|-----------|----------|------------------------------------------------------------------------------------------------|
131+
| `workdir` | String | Working directory to use (defaults to `.`) |
132+
| `files` | List/CSV | List of [bake definition files](https://docs.docker.com/build/customize/bake/file-definition/) |
133+
| `target` | String | The target to use within the bake file |
134+
| `fields` | String | List of extra fields to include in the matrix |
135+
136+
### outputs
137+
138+
| Name | Type | Description |
139+
|----------|------|----------------------|
140+
| `matrix` | JSON | Matrix configuration |

0 commit comments

Comments
 (0)