Compare commits
5 Commits
02f80bda15
...
62a971216d
Author | SHA1 | Date |
---|---|---|
|
62a971216d | |
|
471d1dc4e0 | |
|
b89ff0a6f2 | |
|
1e3ae3a4d3 | |
|
1f530c4b33 |
|
@ -1542,3 +1542,12 @@ jobs:
|
|||
echo "::error::Should have failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
distribute:
|
||||
uses: ./.github/workflows/reusable-distribute.yml
|
||||
with:
|
||||
push: false
|
||||
meta-image: user/app
|
||||
build-context: "{{defaultContext}}:test"
|
||||
build-file: multi.Dockerfile
|
||||
build-platforms: linux/amd64,linux/arm64
|
||||
|
|
|
@ -0,0 +1,541 @@
|
|||
# Reusable workflow to distribute multi-platform builds efficiently
|
||||
# https://docs.docker.com/build/ci/github-actions/multi-platform/#distribute-build-across-multiple-runners
|
||||
name: reusable-distribute
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
# inputs specific to this reusable worklow
|
||||
runner:
|
||||
type: string
|
||||
description: "Runner instance"
|
||||
required: false
|
||||
default: 'auto'
|
||||
push:
|
||||
type: boolean
|
||||
description: "Push image to registry"
|
||||
required: false
|
||||
default: false
|
||||
set-meta-annotations:
|
||||
type: boolean
|
||||
description: "Set metadata-action annotations"
|
||||
required: false
|
||||
default: false
|
||||
set-meta-labels:
|
||||
type: boolean
|
||||
description: "Set metadata-action labels"
|
||||
required: false
|
||||
default: false
|
||||
setup-qemu:
|
||||
type: boolean
|
||||
description: "Install QEMU static binaries"
|
||||
required: false
|
||||
default: true
|
||||
# same as docker/metadata-action inputs (minus sep-tags, sep-labels, sep-annotations, bake-target)
|
||||
meta-image:
|
||||
type: string
|
||||
description: "Image to use as base name for tags"
|
||||
required: true
|
||||
meta-tags:
|
||||
type: string
|
||||
description: 'List of tags as key-value pair attributes'
|
||||
required: false
|
||||
meta-flavor:
|
||||
type: string
|
||||
description: 'Flavors to apply'
|
||||
required: false
|
||||
meta-labels:
|
||||
type: string
|
||||
description: 'List of custom labels'
|
||||
required: false
|
||||
meta-annotations:
|
||||
type: string
|
||||
description: 'List of custom annotations'
|
||||
required: false
|
||||
# same as docker/login-action inputs (minus logout)
|
||||
login-registry:
|
||||
type: string
|
||||
description: 'Server address of Docker registry. If not set then will default to Docker Hub'
|
||||
required: false
|
||||
login-username:
|
||||
type: string
|
||||
description: 'Username used to log against the Docker registry'
|
||||
required: false
|
||||
login-ecr:
|
||||
type: string
|
||||
description: 'Specifies whether the given registry is ECR (auto, true or false)'
|
||||
default: 'auto'
|
||||
required: false
|
||||
# same as docker/setup-qemu-action inputs (minus platforms, cache-image)
|
||||
qemu-image:
|
||||
type: string
|
||||
description: 'QEMU static binaries Docker image (e.g. tonistiigi/binfmt:latest)'
|
||||
required: false
|
||||
# same as docker/build-push-action inputs (minus builder, call, load, outputs, platforms, push, tags)
|
||||
build-add-hosts:
|
||||
type: string
|
||||
description: "List of a customs host-to-IP mapping (e.g., docker:10.180.0.1)"
|
||||
required: false
|
||||
build-allow:
|
||||
type: string
|
||||
description: "List of extra privileged entitlement (e.g., network.host,security.insecure)"
|
||||
required: false
|
||||
build-annotations:
|
||||
type: string
|
||||
description: "List of annotation to set to the image"
|
||||
required: false
|
||||
build-attests:
|
||||
type: string
|
||||
description: "List of attestation parameters (e.g., type=sbom,generator=image)"
|
||||
required: false
|
||||
build-args:
|
||||
type: string
|
||||
description: "List of build-time variables"
|
||||
required: false
|
||||
build-cache-from:
|
||||
type: string
|
||||
description: "List of external cache sources for buildx (e.g., user/app:cache, type=local,src=path/to/dir)"
|
||||
required: false
|
||||
build-cache-to:
|
||||
type: string
|
||||
description: "List of cache export destinations for buildx (e.g., user/app:cache, type=local,dest=path/to/dir)"
|
||||
required: false
|
||||
build-cgroup-parent:
|
||||
type: string
|
||||
description: "Optional parent cgroup for the container used in the build"
|
||||
required: false
|
||||
build-context:
|
||||
type: string
|
||||
description: "Build's context is the set of files located in the specified PATH or URL"
|
||||
required: false
|
||||
build-contexts:
|
||||
type: string
|
||||
description: "List of additional build contexts (e.g., name=path)"
|
||||
required: false
|
||||
build-file:
|
||||
type: string
|
||||
description: "Path to the Dockerfile"
|
||||
required: false
|
||||
build-labels:
|
||||
type: string
|
||||
description: "List of metadata for an image"
|
||||
required: false
|
||||
build-network:
|
||||
type: string
|
||||
description: "Set the networking mode for the RUN instructions during build"
|
||||
required: false
|
||||
build-no-cache:
|
||||
type: boolean
|
||||
description: "Do not use cache when building the image"
|
||||
required: false
|
||||
default: false
|
||||
build-no-cache-filters:
|
||||
type: string
|
||||
description: "Do not cache specified stages"
|
||||
required: false
|
||||
build-platforms:
|
||||
type: string
|
||||
description: "List of target platforms for build"
|
||||
required: true
|
||||
build-provenance:
|
||||
type: string
|
||||
description: "Generate provenance attestation for the build (shorthand for --attest=type=provenance)"
|
||||
required: false
|
||||
build-pull:
|
||||
type: boolean
|
||||
description: "Always attempt to pull all referenced images"
|
||||
required: false
|
||||
default: false
|
||||
build-sbom:
|
||||
type: string
|
||||
description: "Generate SBOM attestation for the build (shorthand for --attest=type=sbom)"
|
||||
required: false
|
||||
build-secrets:
|
||||
type: string
|
||||
description: "List of secrets to expose to the build (e.g., key=string, GIT_AUTH_TOKEN=mytoken)"
|
||||
required: false
|
||||
build-secret-envs:
|
||||
type: string
|
||||
description: "List of secret env vars to expose to the build (e.g., key=envname, MY_SECRET=MY_ENV_VAR)"
|
||||
required: false
|
||||
build-secret-files:
|
||||
type: string
|
||||
description: "List of secret files to expose to the build (e.g., key=filename, MY_SECRET=./secret.txt)"
|
||||
required: false
|
||||
build-shm-size:
|
||||
type: string
|
||||
description: "Size of /dev/shm (e.g., 2g)"
|
||||
required: false
|
||||
build-ssh:
|
||||
type: string
|
||||
description: "List of SSH agent socket or keys to expose to the build"
|
||||
required: false
|
||||
build-target:
|
||||
type: string
|
||||
description: "Sets the target stage to build"
|
||||
required: false
|
||||
build-ulimit:
|
||||
type: string
|
||||
description: "Ulimit options (e.g., nofile=1024:1024)"
|
||||
required: false
|
||||
secrets:
|
||||
login-username:
|
||||
description: 'Username used to log against the Docker registry'
|
||||
required: false
|
||||
login-password:
|
||||
description: "Password or personal access token used to log against the Docker registry"
|
||||
required: false
|
||||
github-token:
|
||||
description: "GitHub Token used to authenticate against a repository for Git context"
|
||||
required: false
|
||||
|
||||
env:
|
||||
ACTIONS_TOOLKIT_VERSION: "0.54.0"
|
||||
|
||||
jobs:
|
||||
prepare:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
includes: ${{ steps.set.outputs.includes }}
|
||||
steps:
|
||||
-
|
||||
name: Install npm dependencies
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
await exec.exec('npm', ['install',
|
||||
'@docker/actions-toolkit@${{ env.ACTIONS_TOOLKIT_VERSION }}'
|
||||
]);
|
||||
-
|
||||
name: Set includes
|
||||
id: set
|
||||
uses: actions/github-script@v7
|
||||
env:
|
||||
INPUT_RUNNER: ${{ inputs.runner }}
|
||||
INPUT_META-IMAGE: ${{ inputs.meta-image }}
|
||||
INPUT_BUILD-PLATFORMS: ${{ inputs.build-platforms }}
|
||||
GITHUB_TOKEN: ${{ secrets.github-token || github.token }}
|
||||
with:
|
||||
script: |
|
||||
const { Util } = require('@docker/actions-toolkit/lib/util');
|
||||
|
||||
if (Util.getInputList('meta-image').length > 1) {
|
||||
throw new Error('Only one meta-image is allowed');
|
||||
}
|
||||
|
||||
const inpRunner = core.getInput('runner');
|
||||
const inpBuildPlatforms = Util.getInputList('build-platforms');
|
||||
if (inpBuildPlatforms.length > 100) {
|
||||
throw new Error('Too many platforms');
|
||||
} else if (inpBuildPlatforms.length <= 1) {
|
||||
throw new Error('At least 2 platforms are required');
|
||||
}
|
||||
|
||||
await core.group(`Set includes`, async () => {
|
||||
let includes = [];
|
||||
inpBuildPlatforms.forEach((platform, index) => {
|
||||
let runner = inpRunner;
|
||||
if (runner === 'auto') {
|
||||
runner = platform.startsWith('linux/arm') ? 'ubuntu-24.04-arm' : 'ubuntu-latest';
|
||||
}
|
||||
includes.push({
|
||||
index: index,
|
||||
platform: platform,
|
||||
runner: runner
|
||||
});
|
||||
});
|
||||
core.info(JSON.stringify(includes, null, 2));
|
||||
core.setOutput('includes', JSON.stringify(includes));
|
||||
});
|
||||
|
||||
build:
|
||||
runs-on: ${{ matrix.runner }}
|
||||
needs:
|
||||
- prepare
|
||||
outputs:
|
||||
# needs predefined outputs as we can't use dynamic ones atm: https://github.com/actions/runner/pull/2477
|
||||
# 100 is the maximum number of platforms supported by the matrix strategy
|
||||
digest_0: ${{ steps.digest.outputs.digest_0 }}
|
||||
digest_1: ${{ steps.digest.outputs.digest_1 }}
|
||||
digest_2: ${{ steps.digest.outputs.digest_2 }}
|
||||
digest_3: ${{ steps.digest.outputs.digest_3 }}
|
||||
digest_4: ${{ steps.digest.outputs.digest_4 }}
|
||||
digest_5: ${{ steps.digest.outputs.digest_5 }}
|
||||
digest_6: ${{ steps.digest.outputs.digest_6 }}
|
||||
digest_7: ${{ steps.digest.outputs.digest_7 }}
|
||||
digest_8: ${{ steps.digest.outputs.digest_8 }}
|
||||
digest_9: ${{ steps.digest.outputs.digest_9 }}
|
||||
digest_10: ${{ steps.digest.outputs.digest_10 }}
|
||||
digest_11: ${{ steps.digest.outputs.digest_11 }}
|
||||
digest_12: ${{ steps.digest.outputs.digest_12 }}
|
||||
digest_13: ${{ steps.digest.outputs.digest_13 }}
|
||||
digest_14: ${{ steps.digest.outputs.digest_14 }}
|
||||
digest_15: ${{ steps.digest.outputs.digest_15 }}
|
||||
digest_16: ${{ steps.digest.outputs.digest_16 }}
|
||||
digest_17: ${{ steps.digest.outputs.digest_17 }}
|
||||
digest_18: ${{ steps.digest.outputs.digest_18 }}
|
||||
digest_19: ${{ steps.digest.outputs.digest_19 }}
|
||||
digest_20: ${{ steps.digest.outputs.digest_20 }}
|
||||
digest_21: ${{ steps.digest.outputs.digest_21 }}
|
||||
digest_22: ${{ steps.digest.outputs.digest_22 }}
|
||||
digest_23: ${{ steps.digest.outputs.digest_23 }}
|
||||
digest_24: ${{ steps.digest.outputs.digest_24 }}
|
||||
digest_25: ${{ steps.digest.outputs.digest_25 }}
|
||||
digest_26: ${{ steps.digest.outputs.digest_26 }}
|
||||
digest_27: ${{ steps.digest.outputs.digest_27 }}
|
||||
digest_28: ${{ steps.digest.outputs.digest_28 }}
|
||||
digest_29: ${{ steps.digest.outputs.digest_29 }}
|
||||
digest_30: ${{ steps.digest.outputs.digest_30 }}
|
||||
digest_31: ${{ steps.digest.outputs.digest_31 }}
|
||||
digest_32: ${{ steps.digest.outputs.digest_32 }}
|
||||
digest_33: ${{ steps.digest.outputs.digest_33 }}
|
||||
digest_34: ${{ steps.digest.outputs.digest_34 }}
|
||||
digest_35: ${{ steps.digest.outputs.digest_35 }}
|
||||
digest_36: ${{ steps.digest.outputs.digest_36 }}
|
||||
digest_37: ${{ steps.digest.outputs.digest_37 }}
|
||||
digest_38: ${{ steps.digest.outputs.digest_38 }}
|
||||
digest_39: ${{ steps.digest.outputs.digest_39 }}
|
||||
digest_40: ${{ steps.digest.outputs.digest_40 }}
|
||||
digest_41: ${{ steps.digest.outputs.digest_41 }}
|
||||
digest_42: ${{ steps.digest.outputs.digest_42 }}
|
||||
digest_43: ${{ steps.digest.outputs.digest_43 }}
|
||||
digest_44: ${{ steps.digest.outputs.digest_44 }}
|
||||
digest_45: ${{ steps.digest.outputs.digest_45 }}
|
||||
digest_46: ${{ steps.digest.outputs.digest_46 }}
|
||||
digest_47: ${{ steps.digest.outputs.digest_47 }}
|
||||
digest_48: ${{ steps.digest.outputs.digest_48 }}
|
||||
digest_49: ${{ steps.digest.outputs.digest_49 }}
|
||||
digest_50: ${{ steps.digest.outputs.digest_50 }}
|
||||
digest_51: ${{ steps.digest.outputs.digest_51 }}
|
||||
digest_52: ${{ steps.digest.outputs.digest_52 }}
|
||||
digest_53: ${{ steps.digest.outputs.digest_53 }}
|
||||
digest_54: ${{ steps.digest.outputs.digest_54 }}
|
||||
digest_55: ${{ steps.digest.outputs.digest_55 }}
|
||||
digest_56: ${{ steps.digest.outputs.digest_56 }}
|
||||
digest_57: ${{ steps.digest.outputs.digest_57 }}
|
||||
digest_58: ${{ steps.digest.outputs.digest_58 }}
|
||||
digest_59: ${{ steps.digest.outputs.digest_59 }}
|
||||
digest_60: ${{ steps.digest.outputs.digest_60 }}
|
||||
digest_61: ${{ steps.digest.outputs.digest_61 }}
|
||||
digest_62: ${{ steps.digest.outputs.digest_62 }}
|
||||
digest_63: ${{ steps.digest.outputs.digest_63 }}
|
||||
digest_64: ${{ steps.digest.outputs.digest_64 }}
|
||||
digest_65: ${{ steps.digest.outputs.digest_65 }}
|
||||
digest_66: ${{ steps.digest.outputs.digest_66 }}
|
||||
digest_67: ${{ steps.digest.outputs.digest_67 }}
|
||||
digest_68: ${{ steps.digest.outputs.digest_68 }}
|
||||
digest_69: ${{ steps.digest.outputs.digest_69 }}
|
||||
digest_70: ${{ steps.digest.outputs.digest_70 }}
|
||||
digest_71: ${{ steps.digest.outputs.digest_71 }}
|
||||
digest_72: ${{ steps.digest.outputs.digest_72 }}
|
||||
digest_73: ${{ steps.digest.outputs.digest_73 }}
|
||||
digest_74: ${{ steps.digest.outputs.digest_74 }}
|
||||
digest_75: ${{ steps.digest.outputs.digest_75 }}
|
||||
digest_76: ${{ steps.digest.outputs.digest_76 }}
|
||||
digest_77: ${{ steps.digest.outputs.digest_77 }}
|
||||
digest_78: ${{ steps.digest.outputs.digest_78 }}
|
||||
digest_79: ${{ steps.digest.outputs.digest_79 }}
|
||||
digest_80: ${{ steps.digest.outputs.digest_80 }}
|
||||
digest_81: ${{ steps.digest.outputs.digest_81 }}
|
||||
digest_82: ${{ steps.digest.outputs.digest_82 }}
|
||||
digest_83: ${{ steps.digest.outputs.digest_83 }}
|
||||
digest_84: ${{ steps.digest.outputs.digest_84 }}
|
||||
digest_85: ${{ steps.digest.outputs.digest_85 }}
|
||||
digest_86: ${{ steps.digest.outputs.digest_86 }}
|
||||
digest_87: ${{ steps.digest.outputs.digest_87 }}
|
||||
digest_88: ${{ steps.digest.outputs.digest_88 }}
|
||||
digest_89: ${{ steps.digest.outputs.digest_89 }}
|
||||
digest_90: ${{ steps.digest.outputs.digest_90 }}
|
||||
digest_91: ${{ steps.digest.outputs.digest_91 }}
|
||||
digest_92: ${{ steps.digest.outputs.digest_92 }}
|
||||
digest_93: ${{ steps.digest.outputs.digest_93 }}
|
||||
digest_94: ${{ steps.digest.outputs.digest_94 }}
|
||||
digest_95: ${{ steps.digest.outputs.digest_95 }}
|
||||
digest_96: ${{ steps.digest.outputs.digest_96 }}
|
||||
digest_97: ${{ steps.digest.outputs.digest_97 }}
|
||||
digest_98: ${{ steps.digest.outputs.digest_98 }}
|
||||
digest_99: ${{ steps.digest.outputs.digest_99 }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include: ${{ fromJson(needs.prepare.outputs.includes) }}
|
||||
steps:
|
||||
-
|
||||
name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ inputs.meta-image }}
|
||||
tags: ${{ inputs.meta-tags }}
|
||||
flavor: ${{ inputs.meta-flavor }}
|
||||
labels: ${{ inputs.meta-labels }}
|
||||
annotations: ${{ inputs.meta-annotations }}
|
||||
-
|
||||
name: Login to registry
|
||||
uses: docker/login-action@v3
|
||||
if: ${{ inputs.push }}
|
||||
with:
|
||||
registry: ${{ inputs.login-registry }}
|
||||
username: ${{ inputs.login-username || secrets.login-username }}
|
||||
password: ${{ secrets.login-password }}
|
||||
-
|
||||
name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
if: ${{ inputs.setup-qemu }}
|
||||
with:
|
||||
image: ${{ inputs.qemu-image }}
|
||||
-
|
||||
name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
-
|
||||
name: Set build inputs
|
||||
id: build-inputs
|
||||
uses: actions/github-script@v7
|
||||
env:
|
||||
INPUT_SET-META-ANNOTATIONS: ${{ inputs.set-meta-annotations }}
|
||||
INPUT_SET-META-LABELS: ${{ inputs.set-meta-labels }}
|
||||
INPUT_BUILD-ANNOTATIONS: ${{ inputs.build-annotations }}
|
||||
INPUT_BUILD-LABELS: ${{ inputs.build-labels }}
|
||||
with:
|
||||
script: |
|
||||
const inpSetMetaAnnotations = core.getBooleanInput('set-meta-annotations');
|
||||
const inpSetMetaLabels = core.getBooleanInput('set-meta-labels');
|
||||
|
||||
let inpBuildAnnotations = core.getInput('build-annotations');
|
||||
if (inpSetMetaAnnotations) {
|
||||
inpBuildAnnotations += `\n${{ steps.meta.outputs.annotations }}`;
|
||||
}
|
||||
let inpBuildLabels = core.getInput('build-labels');
|
||||
if (inpSetMetaLabels) {
|
||||
inpBuildLabels += `\n${{ steps.meta.outputs.labels }}`;
|
||||
}
|
||||
|
||||
core.setOutput('annotations', inpBuildAnnotations);
|
||||
core.setOutput('labels', inpBuildLabels);
|
||||
-
|
||||
name: Build
|
||||
id: build
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
add-hosts: ${{ inputs.build-add-hosts }}
|
||||
allow: ${{ inputs.build-allow }}
|
||||
annotations: ${{ steps.build-inputs.outputs.annotations }}
|
||||
attests: ${{ inputs.build-attests }}
|
||||
build-args: ${{ inputs.build-build-args }}
|
||||
build-contexts: ${{ inputs.build-contexts }}
|
||||
cache-from: ${{ inputs.build-cache-from }}
|
||||
cache-to: ${{ inputs.build-cache-to }}
|
||||
cgroup-parent: ${{ inputs.build-cgroup-parent }}
|
||||
context: ${{ inputs.build-context }}
|
||||
file: ${{ inputs.build-file }}
|
||||
labels: ${{ steps.build-inputs.outputs.labels }}
|
||||
network: ${{ inputs.build-network }}
|
||||
no-cache: ${{ inputs.build-no-cache }}
|
||||
no-cache-filters: ${{ inputs.build-no-cache-filters }}
|
||||
outputs: |
|
||||
type=image,"name=${{ inputs.meta-image }}",push-by-digest=true,name-canonical=true,push=${{ inputs.push }}
|
||||
platforms: ${{ matrix.platform }}
|
||||
provenance: ${{ inputs.build-provenance }}
|
||||
pull: ${{ inputs.build-pull }}
|
||||
sbom: ${{ inputs.build-sbom }}
|
||||
secrets: ${{ inputs.build-secrets }}
|
||||
secret-envs: ${{ inputs.build-secret-envs }}
|
||||
secret-files: ${{ inputs.build-secret-files }}
|
||||
shm-size: ${{ inputs.build-shm-size }}
|
||||
ssh: ${{ inputs.build-ssh }}
|
||||
target: ${{ inputs.build-target }}
|
||||
ulimit: ${{ inputs.build-ulimit }}
|
||||
-
|
||||
name: Set digest output
|
||||
id: digest
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const metadata = JSON.parse(`${{ steps.build.outputs.metadata }}`);
|
||||
const digest = metadata['containerimage.digest'];
|
||||
const outputKey = `digest_${{ matrix.index }}`;
|
||||
core.info(`Setting digest output: ${outputKey}=${digest}`);
|
||||
core.setOutput(outputKey, digest);
|
||||
|
||||
merge:
|
||||
runs-on: ubuntu-latest
|
||||
needs:
|
||||
- build
|
||||
steps:
|
||||
-
|
||||
name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ inputs.meta-image }}
|
||||
tags: ${{ inputs.meta-tags }}
|
||||
flavor: ${{ inputs.meta-flavor }}
|
||||
-
|
||||
name: Login to registry
|
||||
uses: docker/login-action@v3
|
||||
if: ${{ inputs.push }}
|
||||
with:
|
||||
registry: ${{ inputs.login-registry }}
|
||||
username: ${{ inputs.login-username || secrets.login-username }}
|
||||
password: ${{ secrets.login-password }}
|
||||
-
|
||||
name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
if: ${{ inputs.push }}
|
||||
-
|
||||
name: Create manifest list
|
||||
uses: actions/github-script@v7
|
||||
env:
|
||||
INPUT_PUSH: ${{ inputs.push }}
|
||||
INPUT_META-IMAGE: ${{ inputs.meta-image }}
|
||||
with:
|
||||
script: |
|
||||
const inpPush = core.getBooleanInput('push');
|
||||
const inpMetaImage = core.getInput('meta-image');
|
||||
|
||||
let digests = [];
|
||||
await core.group(`Digests`, async () => {
|
||||
digests = Object.values(JSON.parse(`${{ toJSON(needs.build.outputs) }}`));
|
||||
core.info(JSON.stringify(digests, null, 2));
|
||||
});
|
||||
|
||||
let tags = [];
|
||||
await core.group(`Tags`, async () => {
|
||||
tags = `${{ steps.meta.outputs.tags }}`.split('\n').filter(Boolean);
|
||||
core.info(JSON.stringify(tags, null, 2));
|
||||
});
|
||||
|
||||
let createArgs = ['buildx', 'imagetools', 'create'];
|
||||
for (const tag of tags) {
|
||||
createArgs.push(`-t`, tag);
|
||||
}
|
||||
for (const digest of digests) {
|
||||
createArgs.push(`${inpMetaImage}@${digest}`);
|
||||
}
|
||||
|
||||
if (inpPush) {
|
||||
if (tags.length === 0) {
|
||||
throw new Error('No tags to create manifest list');
|
||||
}
|
||||
await exec.getExecOutput('docker', createArgs, {
|
||||
ignoreReturnCode: true
|
||||
}).then(res => {
|
||||
if (res.stderr.length > 0 && res.exitCode != 0) {
|
||||
throw new Error(res.stderr);
|
||||
}
|
||||
});
|
||||
await core.group(`Inspect image`, async () => {
|
||||
await exec.getExecOutput('docker', ['buildx', 'imagetools', 'inspect', `${inpMetaImage}:${tags[0]}`], {
|
||||
ignoreReturnCode: true
|
||||
}).then(res => {
|
||||
if (res.stderr.length > 0 && res.exitCode != 0) {
|
||||
throw new Error(res.stderr);
|
||||
}
|
||||
});
|
||||
});
|
||||
} else {
|
||||
await core.group(`Generated imagetools create command`, async () => {
|
||||
core.info(`docker ${createArgs.join(' ')}`);
|
||||
});
|
||||
core.info(`Push is disabled, skipping manifest list creation`);
|
||||
}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -2358,9 +2358,6 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
|
|||
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
|
||||
dot-object
|
||||
MIT
|
||||
|
||||
encoding
|
||||
MIT
|
||||
Copyright (c) 2012-2014 Andris Reinman
|
||||
|
@ -3691,9 +3688,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|||
THE SOFTWARE.
|
||||
|
||||
|
||||
twirp-ts
|
||||
MIT
|
||||
|
||||
undici
|
||||
MIT
|
||||
MIT License
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
"packageManager": "yarn@3.6.3",
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.11.1",
|
||||
"@docker/actions-toolkit": "0.55.0",
|
||||
"@docker/actions-toolkit": "0.56.0",
|
||||
"handlebars": "^4.7.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
|
178
yarn.lock
178
yarn.lock
|
@ -12,9 +12,9 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@actions/artifact@npm:^2.2.1":
|
||||
version: 2.2.1
|
||||
resolution: "@actions/artifact@npm:2.2.1"
|
||||
"@actions/artifact@npm:^2.2.2":
|
||||
version: 2.2.2
|
||||
resolution: "@actions/artifact@npm:2.2.2"
|
||||
dependencies:
|
||||
"@actions/core": ^1.10.0
|
||||
"@actions/github": ^5.1.1
|
||||
|
@ -27,15 +27,14 @@ __metadata:
|
|||
"@protobuf-ts/plugin": ^2.2.3-alpha.1
|
||||
archiver: ^7.0.1
|
||||
jwt-decode: ^3.1.2
|
||||
twirp-ts: ^2.5.0
|
||||
unzip-stream: ^0.3.1
|
||||
checksum: 6ce4e62d941f17743c845637cdd832ca34c77efe0c31cf7f6ab3ad0531e54e62d4379198e8af5e84463b5f5ae0bc0ea11d41cc77c5fae7e511c7ef01742892ea
|
||||
checksum: 1501b3d0ceb671f370786ccf70014de9586c5a78c95d235248fc16c73bf928f8de2aa932a679258f6d9bc2f2e570648d830551af9f063298f05d19f3330b33bc
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@actions/cache@npm:^4.0.1":
|
||||
version: 4.0.1
|
||||
resolution: "@actions/cache@npm:4.0.1"
|
||||
"@actions/cache@npm:^4.0.2":
|
||||
version: 4.0.2
|
||||
resolution: "@actions/cache@npm:4.0.2"
|
||||
dependencies:
|
||||
"@actions/core": ^1.11.1
|
||||
"@actions/exec": ^1.0.1
|
||||
|
@ -47,7 +46,7 @@ __metadata:
|
|||
"@azure/storage-blob": ^12.13.0
|
||||
"@protobuf-ts/plugin": ^2.9.4
|
||||
semver: ^6.3.1
|
||||
checksum: ca2cc59c8682817788f387bdb83279e1924dece32cb5a0789b0d57837c317caf35a90ec240f7671798ca3bf620a72085ddbdc86ef1c309a79e4b8efe73074bae
|
||||
checksum: 208f11238a26194f331b329bb99d50a87c1a3ccef1dbae181e5c142b3faf41715203e0c5cbc491519d3d97540a68fbd418c25fb6e16caabf76248c40867c02b4
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
@ -1073,12 +1072,12 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@docker/actions-toolkit@npm:0.55.0":
|
||||
version: 0.55.0
|
||||
resolution: "@docker/actions-toolkit@npm:0.55.0"
|
||||
"@docker/actions-toolkit@npm:0.56.0":
|
||||
version: 0.56.0
|
||||
resolution: "@docker/actions-toolkit@npm:0.56.0"
|
||||
dependencies:
|
||||
"@actions/artifact": ^2.2.1
|
||||
"@actions/cache": ^4.0.1
|
||||
"@actions/artifact": ^2.2.2
|
||||
"@actions/cache": ^4.0.2
|
||||
"@actions/core": ^1.11.1
|
||||
"@actions/exec": ^1.1.1
|
||||
"@actions/github": ^6.0.0
|
||||
|
@ -1098,7 +1097,7 @@ __metadata:
|
|||
semver: ^7.7.1
|
||||
tar-stream: ^3.1.7
|
||||
tmp: ^0.2.3
|
||||
checksum: 1d596fa95e26273d8974f9d3310018b0a0bdc5e1994c8e088a148b17298ec6bf398ed2a257b9c6eee221a095168d05ea81ce3f0b5d6fd422550dce4100529408
|
||||
checksum: 0f1b569f8bb206399f8c26e566c78e30e4a311bbd64486016e7fa1d35fbbb4c94d4f55afa6b711afa4b41c5835b40b038f48c3d1bfdfdc6f7c6680973e922d9e
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
@ -1891,7 +1890,7 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@protobuf-ts/plugin-framework@npm:^2.0.7, @protobuf-ts/plugin-framework@npm:^2.9.4":
|
||||
"@protobuf-ts/plugin-framework@npm:^2.9.4":
|
||||
version: 2.9.4
|
||||
resolution: "@protobuf-ts/plugin-framework@npm:2.9.4"
|
||||
dependencies:
|
||||
|
@ -2770,16 +2769,6 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"camel-case@npm:^4.1.2":
|
||||
version: 4.1.2
|
||||
resolution: "camel-case@npm:4.1.2"
|
||||
dependencies:
|
||||
pascal-case: ^3.1.2
|
||||
tslib: ^2.0.3
|
||||
checksum: bcbd25cd253b3cbc69be3f535750137dbf2beb70f093bdc575f73f800acc8443d34fd52ab8f0a2413c34f1e8203139ffc88428d8863e4dfe530cfb257a379ad6
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"camelcase@npm:^5.3.1":
|
||||
version: 5.3.1
|
||||
resolution: "camelcase@npm:5.3.1"
|
||||
|
@ -2939,13 +2928,6 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"commander@npm:^6.1.0":
|
||||
version: 6.2.1
|
||||
resolution: "commander@npm:6.2.1"
|
||||
checksum: d7090410c0de6bc5c67d3ca41c41760d6d268f3c799e530aafb73b7437d1826bbf0d2a3edac33f8b57cc9887b4a986dce307fa5557e109be40eadb7c43b21742
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"compress-commons@npm:^6.0.2":
|
||||
version: 6.0.2
|
||||
resolution: "compress-commons@npm:6.0.2"
|
||||
|
@ -3161,7 +3143,7 @@ __metadata:
|
|||
resolution: "docker-build-push@workspace:."
|
||||
dependencies:
|
||||
"@actions/core": ^1.11.1
|
||||
"@docker/actions-toolkit": 0.55.0
|
||||
"@docker/actions-toolkit": 0.56.0
|
||||
"@types/node": ^20.12.12
|
||||
"@typescript-eslint/eslint-plugin": ^7.9.0
|
||||
"@typescript-eslint/parser": ^7.9.0
|
||||
|
@ -3188,18 +3170,6 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"dot-object@npm:^2.1.4":
|
||||
version: 2.1.5
|
||||
resolution: "dot-object@npm:2.1.5"
|
||||
dependencies:
|
||||
commander: ^6.1.0
|
||||
glob: ^7.1.6
|
||||
bin:
|
||||
dot-object: bin/dot-object
|
||||
checksum: 3e5a681bbea32dfc1cd0b1254adc93531bd462f7474a355e981738ef37253e4bc5c9482926289ef4d3c6ef9adb0a7ed894725ed3a69aa22063343dc2a57dd764
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"duplexify@npm:^3.5.0, duplexify@npm:^3.6.0":
|
||||
version: 3.7.1
|
||||
resolution: "duplexify@npm:3.7.1"
|
||||
|
@ -3852,20 +3822,6 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"glob@npm:^7.1.6":
|
||||
version: 7.2.3
|
||||
resolution: "glob@npm:7.2.3"
|
||||
dependencies:
|
||||
fs.realpath: ^1.0.0
|
||||
inflight: ^1.0.4
|
||||
inherits: 2
|
||||
minimatch: ^3.1.1
|
||||
once: ^1.3.0
|
||||
path-is-absolute: ^1.0.0
|
||||
checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"globals@npm:^11.1.0":
|
||||
version: 11.12.0
|
||||
resolution: "globals@npm:11.12.0"
|
||||
|
@ -4947,15 +4903,6 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"lower-case@npm:^2.0.2":
|
||||
version: 2.0.2
|
||||
resolution: "lower-case@npm:2.0.2"
|
||||
dependencies:
|
||||
tslib: ^2.0.3
|
||||
checksum: 83a0a5f159ad7614bee8bf976b96275f3954335a84fad2696927f609ddae902802c4f3312d86668722e668bef41400254807e1d3a7f2e8c3eede79691aa1f010
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"lru-cache@npm:^10.0.1":
|
||||
version: 10.2.2
|
||||
resolution: "lru-cache@npm:10.2.2"
|
||||
|
@ -5080,7 +5027,7 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2":
|
||||
"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.2":
|
||||
version: 3.1.2
|
||||
resolution: "minimatch@npm:3.1.2"
|
||||
dependencies:
|
||||
|
@ -5260,16 +5207,6 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"no-case@npm:^3.0.4":
|
||||
version: 3.0.4
|
||||
resolution: "no-case@npm:3.0.4"
|
||||
dependencies:
|
||||
lower-case: ^2.0.2
|
||||
tslib: ^2.0.3
|
||||
checksum: 0b2ebc113dfcf737d48dde49cfebf3ad2d82a8c3188e7100c6f375e30eafbef9e9124aadc3becef237b042fd5eb0aad2fd78669c20972d045bbe7fea8ba0be5c
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"node-fetch@npm:^2.6.7":
|
||||
version: 2.6.7
|
||||
resolution: "node-fetch@npm:2.6.7"
|
||||
|
@ -5464,16 +5401,6 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"pascal-case@npm:^3.1.2":
|
||||
version: 3.1.2
|
||||
resolution: "pascal-case@npm:3.1.2"
|
||||
dependencies:
|
||||
no-case: ^3.0.4
|
||||
tslib: ^2.0.3
|
||||
checksum: ba98bfd595fc91ef3d30f4243b1aee2f6ec41c53b4546bfa3039487c367abaa182471dcfc830a1f9e1a0df00c14a370514fa2b3a1aacc68b15a460c31116873e
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"path-exists@npm:^4.0.0":
|
||||
version: 4.0.0
|
||||
resolution: "path-exists@npm:4.0.0"
|
||||
|
@ -5512,13 +5439,6 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"path-to-regexp@npm:^6.2.0":
|
||||
version: 6.3.0
|
||||
resolution: "path-to-regexp@npm:6.3.0"
|
||||
checksum: eca78602e6434a1b6799d511d375ec044e8d7e28f5a48aa5c28d57d8152fb52f3fc62fb1cfc5dfa2198e1f041c2a82ed14043d75740a2fe60e91b5089a153250
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"path-type@npm:^4.0.0":
|
||||
version: 4.0.0
|
||||
resolution: "path-type@npm:4.0.0"
|
||||
|
@ -5583,15 +5503,6 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"prettier@npm:^2.5.1":
|
||||
version: 2.8.8
|
||||
resolution: "prettier@npm:2.8.8"
|
||||
bin:
|
||||
prettier: bin-prettier.js
|
||||
checksum: b49e409431bf129dd89238d64299ba80717b57ff5a6d1c1a8b1a28b590d998a34e083fa13573bc732bb8d2305becb4c9a4407f8486c81fa7d55100eb08263cf8
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"prettier@npm:^3.2.5":
|
||||
version: 3.2.5
|
||||
resolution: "prettier@npm:3.2.5"
|
||||
|
@ -6402,16 +6313,6 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"ts-poet@npm:^4.5.0":
|
||||
version: 4.15.0
|
||||
resolution: "ts-poet@npm:4.15.0"
|
||||
dependencies:
|
||||
lodash: ^4.17.15
|
||||
prettier: ^2.5.1
|
||||
checksum: 93490e8b5921e23ac65afdecc00b4dd53f3560d7d9c19778a3f0bd9a300ba7ca71585a989d564508313bc73e8c431413714d513ebca2d5c428f909ec36bcf6e9
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"tslib@npm:^1.10.0":
|
||||
version: 1.14.1
|
||||
resolution: "tslib@npm:1.14.1"
|
||||
|
@ -6419,13 +6320,6 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"tslib@npm:^2.0.3, tslib@npm:^2.6.2":
|
||||
version: 2.6.2
|
||||
resolution: "tslib@npm:2.6.2"
|
||||
checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"tslib@npm:^2.2.0":
|
||||
version: 2.6.1
|
||||
resolution: "tslib@npm:2.6.1"
|
||||
|
@ -6433,6 +6327,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"tslib@npm:^2.6.2":
|
||||
version: 2.6.2
|
||||
resolution: "tslib@npm:2.6.2"
|
||||
checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"tunnel@npm:0.0.6, tunnel@npm:^0.0.6":
|
||||
version: 0.0.6
|
||||
resolution: "tunnel@npm:0.0.6"
|
||||
|
@ -6440,30 +6341,6 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"twirp-ts@npm:^2.5.0":
|
||||
version: 2.5.0
|
||||
resolution: "twirp-ts@npm:2.5.0"
|
||||
dependencies:
|
||||
"@protobuf-ts/plugin-framework": ^2.0.7
|
||||
camel-case: ^4.1.2
|
||||
dot-object: ^2.1.4
|
||||
path-to-regexp: ^6.2.0
|
||||
ts-poet: ^4.5.0
|
||||
yaml: ^1.10.2
|
||||
peerDependencies:
|
||||
"@protobuf-ts/plugin": ^2.5.0
|
||||
ts-proto: ^1.81.3
|
||||
peerDependenciesMeta:
|
||||
"@protobuf-ts/plugin":
|
||||
optional: true
|
||||
ts-proto:
|
||||
optional: true
|
||||
bin:
|
||||
protoc-gen-twirp_ts: protoc-gen-twirp_ts
|
||||
checksum: e7cf87d77ab4d2cd327c9d8307e82ff61afc5af56883aed5fb6ac7d57999b646945e11158be87c10f0340aeef2efde6eb896f2efd60599498f17b4f310d66e4f
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"type-check@npm:^0.4.0, type-check@npm:~0.4.0":
|
||||
version: 0.4.0
|
||||
resolution: "type-check@npm:0.4.0"
|
||||
|
@ -6790,13 +6667,6 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"yaml@npm:^1.10.2":
|
||||
version: 1.10.2
|
||||
resolution: "yaml@npm:1.10.2"
|
||||
checksum: ce4ada136e8a78a0b08dc10b4b900936912d15de59905b2bf415b4d33c63df1d555d23acb2a41b23cf9fb5da41c256441afca3d6509de7247daa062fd2c5ea5f
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1":
|
||||
version: 21.1.1
|
||||
resolution: "yargs-parser@npm:21.1.1"
|
||||
|
|
Loading…
Reference in New Issue