From 68cf998b487c604a3bb1c7003a4746878499407f Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Sun, 6 Jul 2025 02:23:32 +0200 Subject: [PATCH] matrix subaction Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- .github/subaction-matrix.png | Bin 0 -> 11869 bytes .github/workflows/ci-subaction.yml | 95 +++++++-------- README.md | 4 +- subaction/matrix/README.md | 140 +++++++++++++++++++++++ subaction/matrix/action.yml | 101 ++++++++++++++++ test/group-with-platform/docker-bake.hcl | 36 ++++++ 6 files changed, 322 insertions(+), 54 deletions(-) create mode 100644 .github/subaction-matrix.png create mode 100644 subaction/matrix/README.md create mode 100644 subaction/matrix/action.yml create mode 100644 test/group-with-platform/docker-bake.hcl diff --git a/.github/subaction-matrix.png b/.github/subaction-matrix.png new file mode 100644 index 0000000000000000000000000000000000000000..4a67d9edeb668c51f2f2ce9d1a2e7a42128b6376 GIT binary patch literal 11869 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 literal 0 HcmV?d00001 diff --git a/.github/workflows/ci-subaction.yml b/.github/workflows/ci-subaction.yml index ebd7028..6274352 100644 --- a/.github/workflows/ci-subaction.yml +++ b/.github/workflows/ci-subaction.yml @@ -25,8 +25,22 @@ on: - 'test/**' jobs: - list-targets-group: + list-targets: runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - + testdir: group + - + testdir: group-matrix + target: validate + - + testdir: multi-files + files: | + docker-bake.json + docker-bake.hcl steps: - name: Checkout @@ -36,20 +50,32 @@ jobs: id: gen uses: ./subaction/list-targets with: - workdir: ./test/group - - - name: Check targets - uses: actions/github-script@v7 - with: - script: | - const targets = `${{ steps.gen.outputs.targets }}`; - if (!targets) { - core.setFailed('No targets generated'); - } - core.info(`targets=${targets}`); + workdir: ./test/${{ matrix.testdir }} + files: ${{ matrix.files }} + target: ${{ matrix.target }} - list-targets-group-matrix: + matrix: runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - + testdir: group + - + testdir: group-matrix + target: validate + - + testdir: group-with-platform + target: validate + - + testdir: group-with-platform + target: validate + fields: platforms + - + testdir: group-with-platform + target: validate + fields: platforms,dockerfile steps: - name: Checkout @@ -57,43 +83,8 @@ jobs: - name: Matrix gen id: gen - uses: ./subaction/list-targets + uses: ./subaction/matrix with: - workdir: ./test/group-matrix - target: validate - - - name: Check targets - uses: actions/github-script@v7 - with: - script: | - const targets = `${{ steps.gen.outputs.targets }}`; - if (!targets) { - core.setFailed('No targets generated'); - } - core.info(`targets=${targets}`); - - list-targets-multi-files: - runs-on: ubuntu-latest - steps: - - - name: Checkout - uses: actions/checkout@v5 - - - name: Matrix gen - id: gen - uses: ./subaction/list-targets - with: - workdir: ./test/multi-files - files: | - docker-bake.json - docker-bake.hcl - - - name: Check targets - uses: actions/github-script@v7 - with: - script: | - const targets = `${{ steps.gen.outputs.targets }}`; - if (!targets) { - core.setFailed('No targets generated'); - } - core.info(`targets=${targets}`); + workdir: ./test/${{ matrix.testdir }} + target: ${{ matrix.target }} + fields: ${{ matrix.fields }} diff --git a/README.md b/README.md index 10fc84a..cb03aa7 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ ___ * [outputs](#outputs) * [environment variables](#environment-variables) * [Subactions](#subactions) - * [`list-targets`](subaction/list-targets) + * [`matrix`](subaction/matrix) * [Contributing](#contributing) ## Usage @@ -234,7 +234,7 @@ The following outputs are available ## Subactions -* [`list-targets`](subaction/list-targets) +* [`matrix`](subaction/matrix) ## Contributing diff --git a/subaction/matrix/README.md b/subaction/matrix/README.md new file mode 100644 index 0000000..a84d9a3 --- /dev/null +++ b/subaction/matrix/README.md @@ -0,0 +1,140 @@ +## About + +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) +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) +so you can distribute your builds across multiple runners. + +![Screenshot](../../.github/subaction-matrix.png) + +___ + +* [Usage](#usage) +* [Customizing](#customizing) + * [inputs](#inputs) + * [outputs](#outputs) + +## Usage + +### List targets + +```hcl +# docker-bake.hcl +group "validate" { + targets = ["lint", "doctoc"] +} + +target "lint" { + target = "lint" +} + +target "doctoc" { + target = "doctoc" +} +``` + +```yaml +jobs: + prepare: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.generate.outputs.matrix }} + steps: + - + name: Checkout + uses: actions/checkout@v4 + - + name: Generate matrix + id: generate + uses: docker/bake-action/subaction/matrix@v6 + with: + target: validate + + validate: + runs-on: ubuntu-latest + needs: + - prepare + strategy: + fail-fast: false + matrix: + include: ${{ fromJson(needs.prepare.outputs.matrix) }} + steps: + - + name: Validate + uses: docker/bake-action@v6 + with: + targets: ${{ matrix.target }} +``` + +### Platforms split + +```hcl +# docker-bake.hcl +target "lint" { + dockerfile = "./hack/dockerfiles/lint.Dockerfile" + output = ["type=cacheonly"] + platforms = [ + "darwin/amd64", + "darwin/arm64", + "linux/amd64", + "linux/arm64", + "linux/s390x", + "linux/ppc64le", + "linux/riscv64", + "windows/amd64", + "windows/arm64" + ] +} +``` + +```yaml +jobs: + prepare: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.generate.outputs.matrix }} + steps: + - + name: Checkout + uses: actions/checkout@v4 + - + name: Generate matrix + id: generate + uses: docker/bake-action/subaction/matrix@v6 + with: + target: lint + fields: platforms + + lint: + runs-on: ${{ startsWith(matrix.platforms, 'linux/arm') && 'ubuntu-24.04-arm' || 'ubuntu-latest' }} + needs: + - prepare + strategy: + fail-fast: false + matrix: + include: ${{ fromJson(needs.prepare.outputs.matrix) }} + steps: + - + name: Lint + uses: docker/bake-action@v6 + with: + targets: ${{ matrix.target }} + set: | + *.platform=${{ matrix.platforms }} +``` + +## Customizing + +### inputs + +| Name | Type | Description | +|-----------|----------|------------------------------------------------------------------------------------------------| +| `workdir` | String | Working directory to use (defaults to `.`) | +| `files` | List/CSV | List of [bake definition files](https://docs.docker.com/build/customize/bake/file-definition/) | +| `target` | String | The target to use within the bake file | +| `fields` | String | List of extra fields to include in the matrix | + +### outputs + +| Name | Type | Description | +|----------|------|----------------------| +| `matrix` | JSON | Matrix configuration | diff --git a/subaction/matrix/action.yml b/subaction/matrix/action.yml new file mode 100644 index 0000000..32b2000 --- /dev/null +++ b/subaction/matrix/action.yml @@ -0,0 +1,101 @@ +# https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions +name: 'Matrix' +description: 'Generate a matrix from a Bake definition to help distributing builds in your workflow' + +inputs: + workdir: + description: Working directory + default: '.' + required: false + files: + description: List of Bake files + required: false + target: + description: Bake target + required: false + fields: + description: List of extra fields to include in the matrix + required: false + +outputs: + matrix: + description: Matrix configuration + value: ${{ steps.generate.outputs.includes }} + +runs: + using: composite + steps: + - + name: Generate + id: generate + uses: actions/github-script@v7 + env: + INPUT_WORKDIR: ${{ inputs.workdir }} + INPUT_FILES: ${{ inputs.files }} + INPUT_TARGET: ${{ inputs.target }} + INPUT_FIELDS: ${{ inputs.fields }} + with: + script: | + function getInputList(name) { + return core.getInput(name) ? core.getInput(name).split(/[\r?\n,]+/).filter(x => x !== '') : []; + } + + const workdir = core.getInput('workdir'); + const files = getInputList('files'); + const target = core.getInput('target'); + const fields = getInputList('fields'); + + let def = {}; + await core.group(`Parsing definition`, async () => { + let args = ['buildx', 'bake']; + for (const file of files) { + args.push('--file', file); + } + if (target) { + args.push(target); + } + args.push('--print'); + const res = await exec.getExecOutput('docker', args, { + ignoreReturnCode: true, + silent: true, + cwd: workdir + }); + if (res.stderr.length > 0 && res.exitCode != 0) { + throw new Error(res.stderr); + } + def = JSON.parse(res.stdout.trim()); + core.info(JSON.stringify(def, null, 2)); + }); + + await core.group(`Generating matrix`, async () => { + const result = []; + for (const targetName of Object.keys(def.target)) { + const target = def.target[targetName]; + const entry = { target: targetName }; + if (fields.length === 0) { + result.push({ ...entry }); + continue; + } + let fieldFound = false; + Object.keys(target).forEach(field => { + if (fields.includes(field)) { + fieldFound = true; + const value = target[field]; + if (Array.isArray(value)) { + value.forEach((v) => { + entry[field] = v; + result.push({ ...entry }); + }); + } else { + entry[field] = value; + result.push({ ...entry }); + } + } + }); + if (!fieldFound) { + result.push({ ...entry }); + } + } + core.info(JSON.stringify(result, null, 2)); + core.setOutput('includes', JSON.stringify(result)); + }); diff --git a/test/group-with-platform/docker-bake.hcl b/test/group-with-platform/docker-bake.hcl new file mode 100644 index 0000000..bfba830 --- /dev/null +++ b/test/group-with-platform/docker-bake.hcl @@ -0,0 +1,36 @@ +group "validate" { + targets = ["lint", "lint-gopls", "validate-vendor", "validate-docs"] +} + +target "lint" { + dockerfile = "./hack/dockerfiles/lint.Dockerfile" + output = ["type=cacheonly"] + platforms = [ + "darwin/amd64", + "darwin/arm64", + "linux/amd64", + "linux/arm64", + "linux/s390x", + "linux/ppc64le", + "linux/riscv64", + "windows/amd64", + "windows/arm64" + ] +} + +target "lint-gopls" { + inherits = ["lint"] + target = "gopls-analyze" +} + +target "validate-vendor" { + dockerfile = "./hack/dockerfiles/vendor.Dockerfile" + target = "validate" + output = ["type=cacheonly"] +} + +target "validate-docs" { + dockerfile = "./hack/dockerfiles/docs.Dockerfile" + target = "validate" + output = ["type=cacheonly"] +}