38 Commits

Author SHA1 Message Date
CrazyMax
8f54c6f886 Merge pull request #487 from docker/dependabot/github_actions/docker/build-push-action-7
build(deps): bump docker/build-push-action from 6 to 7
2026-03-06 10:06:19 +01:00
dependabot[bot]
7973930601 build(deps): bump docker/build-push-action from 6 to 7
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6 to 7.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v6...v7)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-06 04:42:15 +00:00
CrazyMax
2ae358d897 Merge pull request #486 from crazy-max/update-readme
readme: update to v4
2026-03-05 09:17:23 +01:00
CrazyMax
d586dba768 readme: update to v4
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2026-03-05 09:09:21 +01:00
CrazyMax
4d04d5d948 Merge pull request #485 from docker/dependabot/npm_and_yarn/docker/actions-toolkit-0.79.0
build(deps): bump @docker/actions-toolkit from 0.77.0 to 0.79.0
2026-03-05 08:41:24 +01:00
github-actions[bot]
cd74e05d9b chore: update generated content 2026-03-05 07:38:34 +00:00
dependabot[bot]
eee38ec7b3 build(deps): bump @docker/actions-toolkit from 0.77.0 to 0.79.0
Bumps [@docker/actions-toolkit](https://github.com/docker/actions-toolkit) from 0.77.0 to 0.79.0.
- [Release notes](https://github.com/docker/actions-toolkit/releases)
- [Commits](https://github.com/docker/actions-toolkit/compare/v0.77.0...v0.79.0)

---
updated-dependencies:
- dependency-name: "@docker/actions-toolkit"
  dependency-version: 0.79.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-05 07:37:31 +00:00
CrazyMax
7a83f65b5a Merge pull request #484 from docker/dependabot/github_actions/docker/setup-qemu-action-4
build(deps): bump docker/setup-qemu-action from 3 to 4
2026-03-05 08:35:10 +01:00
CrazyMax
a5aa96747d Merge pull request #464 from crazy-max/rm-deprecated
remove deprecated inputs/outputs
2026-03-05 08:34:48 +01:00
dependabot[bot]
e73d53fa4e build(deps): bump docker/setup-qemu-action from 3 to 4
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 3 to 4.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](https://github.com/docker/setup-qemu-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-05 04:42:14 +00:00
Tõnis Tiigi
28a438e9ed Merge pull request #483 from crazy-max/node24
node 24 as default runtime
2026-03-04 17:35:35 -08:00
CrazyMax
034e9d37dd chore: update generated content
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2026-03-04 10:00:32 +01:00
CrazyMax
b4664d8fd0 remove deprecated inputs/outputs
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2026-03-04 09:07:39 +01:00
CrazyMax
a8257dec35 node 24 as default runtime
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2026-03-04 09:06:43 +01:00
Tõnis Tiigi
9cd4410b76 Merge pull request #482 from docker/dependabot/npm_and_yarn/docker/actions-toolkit-0.77.0
build(deps): bump @docker/actions-toolkit from 0.63.0 to 0.77.0
2026-03-03 11:06:49 -08:00
CrazyMax
7064bb6cb0 chore: update generated content
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2026-03-03 14:25:56 +01:00
CrazyMax
57d4a8d20c test: fix missing explicit file extensions in ECMAScript imports
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2026-03-03 14:24:53 +01:00
CrazyMax
0dadf93d54 update buildxInstall.download call since v0.77.0
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2026-03-03 14:24:53 +01:00
dependabot[bot]
1a12f33edd build(deps): bump @docker/actions-toolkit from 0.63.0 to 0.77.0
Dependabot couldn't find the original pull request head commit, a7a0232b4ec28569f7a45b01ebe22471c27d524f.
2026-03-03 13:23:31 +00:00
CrazyMax
1282d41a96 Merge pull request #475 from docker/dependabot/npm_and_yarn/actions/core-3.0.0
build(deps): bump @actions/core from 1.11.1 to 3.0.0
2026-03-03 14:10:36 +01:00
github-actions[bot]
01144634a7 chore: update generated content 2026-03-03 13:08:30 +00:00
dependabot[bot]
cb437c6618 build(deps): bump @actions/core from 1.11.1 to 3.0.0
Bumps [@actions/core](https://github.com/actions/toolkit/tree/HEAD/packages/core) from 1.11.1 to 3.0.0.
- [Changelog](https://github.com/actions/toolkit/blob/main/packages/core/RELEASES.md)
- [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/core)

---
updated-dependencies:
- dependency-name: "@actions/core"
  dependency-version: 3.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-03 13:07:20 +00:00
CrazyMax
4b6c254447 Merge pull request #452 from docker/dependabot/npm_and_yarn/js-yaml-4.1.1
build(deps): bump js-yaml from 4.1.0 to 4.1.1
2026-03-03 14:05:39 +01:00
github-actions[bot]
3d95d526ba chore: update generated content 2026-03-03 12:58:13 +00:00
dependabot[bot]
2231aab25d build(deps): bump js-yaml from 4.1.0 to 4.1.1
Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.1.0 to 4.1.1.
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/4.1.0...4.1.1)

---
updated-dependencies:
- dependency-name: js-yaml
  dependency-version: 4.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-03 12:56:48 +00:00
CrazyMax
483f4842ce Merge pull request #480 from docker/dependabot/npm_and_yarn/minimatch-3.1.3
build(deps): bump minimatch from 3.1.2 to 3.1.5
2026-03-03 13:55:28 +01:00
github-actions[bot]
a43d49b256 chore: update generated content 2026-03-03 12:53:59 +00:00
dependabot[bot]
64bf327336 build(deps): bump minimatch from 3.1.2 to 3.1.3
Bumps [minimatch](https://github.com/isaacs/minimatch) from 3.1.2 to 3.1.3.
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v3.1.2...v3.1.3)

---
updated-dependencies:
- dependency-name: minimatch
  dependency-version: 3.1.3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-03 12:52:48 +00:00
CrazyMax
94782da071 Merge pull request #472 from docker/dependabot/npm_and_yarn/lodash-4.17.23
build(deps): bump lodash from 4.17.21 to 4.17.23
2026-03-03 13:51:10 +01:00
CrazyMax
d6c542fbcd Merge pull request #481 from crazy-max/esm
switch to ESM and update config/test wiring
2026-03-03 13:49:55 +01:00
CrazyMax
eaf69fbc6f chore: update generated content
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2026-03-02 09:45:54 +01:00
CrazyMax
f95826b456 dockerfile: fix vendoring
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2026-03-02 09:45:54 +01:00
CrazyMax
fb37e2879d update dev dependencies
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2026-02-28 10:04:40 +01:00
CrazyMax
099630bcb6 switch to ESM and update config/test wiring
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2026-02-28 10:02:54 +01:00
CrazyMax
70d132ddbe switch from jest to vitest
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2026-02-28 09:58:00 +01:00
CrazyMax
7c525be6cc Merge pull request #476 from crazy-max/update-dist-workflow
ci: update-dist workflow
2026-01-29 20:32:43 +01:00
CrazyMax
ca8948fcde ci: update-dist workflow
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2026-01-29 16:26:38 +01:00
dependabot[bot]
86fc44fcc0 build(deps): bump lodash from 4.17.21 to 4.17.23
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.21 to 4.17.23.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.21...4.17.23)

---
updated-dependencies:
- dependency-name: lodash
  dependency-version: 4.17.23
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-22 00:32:44 +00:00
25 changed files with 2331 additions and 8560 deletions

View File

@@ -102,7 +102,7 @@ jobs:
EOL EOL
- -
name: Set up QEMU name: Set up QEMU
uses: docker/setup-qemu-action@v3 uses: docker/setup-qemu-action@v4
- -
name: Set up Docker Buildx name: Set up Docker Buildx
uses: ./ uses: ./
@@ -110,7 +110,7 @@ jobs:
buildkitd-flags: --debug buildkitd-flags: --debug
- -
name: Build name: Build
uses: docker/build-push-action@v6 uses: docker/build-push-action@v7
with: with:
context: . context: .
platforms: linux/amd64,linux/arm64,linux/ppc64le platforms: linux/amd64,linux/arm64,linux/ppc64le
@@ -212,7 +212,7 @@ jobs:
env: env:
DOCKER_CONTEXT: mycontext DOCKER_CONTEXT: mycontext
config: buildkitd-config:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- -
@@ -240,11 +240,11 @@ jobs:
buildkitd-config: /tmp/buildkitd.toml buildkitd-config: /tmp/buildkitd.toml
- -
name: Build name: Build
uses: docker/build-push-action@v6 uses: docker/build-push-action@v7
with: with:
context: . context: .
config-inline: buildkitd-config-inline:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- -
@@ -267,7 +267,7 @@ jobs:
mirrors = ["mirror.gcr.io"] mirrors = ["mirror.gcr.io"]
- -
name: Build name: Build
uses: docker/build-push-action@v6 uses: docker/build-push-action@v7
with: with:
context: . context: .
@@ -288,7 +288,7 @@ jobs:
uses: actions/checkout@v6 uses: actions/checkout@v6
- -
name: Set up QEMU name: Set up QEMU
uses: docker/setup-qemu-action@v3 uses: docker/setup-qemu-action@v4
with: with:
platforms: ${{ matrix.qemu-platforms }} platforms: ${{ matrix.qemu-platforms }}
- -
@@ -391,36 +391,6 @@ jobs:
with: with:
context: . context: .
standalone-install-error:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v6
-
name: Uninstall docker cli
run: |
if dpkg -s "docker-ce" >/dev/null 2>&1; then
sudo dpkg -r --force-depends docker-ce-cli docker-buildx-plugin
else
sudo apt-get purge -y moby-cli moby-buildx
fi
-
name: Set up Docker Buildx
id: buildx
continue-on-error: true
uses: ./
with:
install: true
-
name: Check
run: |
echo "${{ toJson(steps.buildx) }}"
if [ "${{ steps.buildx.outcome }}" != "failure" ] || [ "${{ steps.buildx.conclusion }}" != "success" ]; then
echo "::error::Should have failed"
exit 1
fi
append: append:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
@@ -458,7 +428,7 @@ jobs:
uses: actions/checkout@v6 uses: actions/checkout@v6
- -
name: Set up QEMU name: Set up QEMU
uses: docker/setup-qemu-action@v3 uses: docker/setup-qemu-action@v4
- -
name: Set up Docker Buildx name: Set up Docker Buildx
uses: ./ uses: ./

49
.github/workflows/update-dist.yml vendored Normal file
View File

@@ -0,0 +1,49 @@
name: update-dist
on:
pull_request:
types:
- opened
- synchronize
jobs:
update-dist:
if: github.actor == 'dependabot[bot]'
runs-on: ubuntu-latest
steps:
-
name: GitHub auth token from GitHub App
id: docker-read-app
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.GHACTIONS_REPO_WRITE_APP_ID }}
private-key: ${{ secrets.GHACTIONS_REPO_WRITE_APP_PRIVATE_KEY }}
owner: docker
-
name: Checkout
uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.ref }}
fetch-depth: 0
token: ${{ steps.docker-read-app.outputs.token || github.token }}
-
name: Build
uses: docker/bake-action@v6
with:
source: .
targets: build
-
name: Commit and push dist
run: |
if [ -n "$(git status --porcelain -- dist)" ]; then
(
set -x
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add dist
git commit -m "chore: update generated content"
git push
)
else
echo "No changes in dist"
fi

View File

@@ -6,6 +6,5 @@
"singleQuote": true, "singleQuote": true,
"trailingComma": "none", "trailingComma": "none",
"bracketSpacing": false, "bracketSpacing": false,
"arrowParens": "avoid", "arrowParens": "avoid"
"parser": "typescript"
} }

View File

@@ -40,17 +40,14 @@ jobs:
buildx: buildx:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
-
name: Checkout
uses: actions/checkout@v5
- -
# Add support for more platforms with QEMU (optional) # Add support for more platforms with QEMU (optional)
# https://github.com/docker/setup-qemu-action # https://github.com/docker/setup-qemu-action
name: Set up QEMU name: Set up QEMU
uses: docker/setup-qemu-action@v3 uses: docker/setup-qemu-action@v4
- -
name: Set up Docker Buildx name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v4
``` ```
## Configuring your builder ## Configuring your builder
@@ -94,7 +91,6 @@ The following inputs can be used as `step.with` keys:
| `buildkitd-flags` | String | | [BuildKit daemon flags](https://docs.docker.com/engine/reference/commandline/buildx_create/#buildkitd-flags) | | `buildkitd-flags` | String | | [BuildKit daemon flags](https://docs.docker.com/engine/reference/commandline/buildx_create/#buildkitd-flags) |
| `buildkitd-config` \* | String | | [BuildKit daemon config file](https://docs.docker.com/engine/reference/commandline/buildx_create/#config) | | `buildkitd-config` \* | String | | [BuildKit daemon config file](https://docs.docker.com/engine/reference/commandline/buildx_create/#config) |
| `buildkitd-config-inline` \* | String | | Same as `buildkitd-config` but inline | | `buildkitd-config-inline` \* | String | | Same as `buildkitd-config` but inline |
| `install` \* | Bool | `false` | Sets up `docker build` command as an alias to `docker buildx` |
| `use` | Bool | `true` | Switch to this builder instance | | `use` | Bool | `true` | Switch to this builder instance |
| `endpoint` | String | | [Optional address for docker socket](https://docs.docker.com/engine/reference/commandline/buildx_create/#description) or context from `docker context ls` | | `endpoint` | String | | [Optional address for docker socket](https://docs.docker.com/engine/reference/commandline/buildx_create/#description) or context from `docker context ls` |
| `platforms` | List/CSV | | Fixed [platforms](https://docs.docker.com/engine/reference/commandline/buildx_create/#platform) for current node. If not empty, values take priority over the detected ones | | `platforms` | List/CSV | | Fixed [platforms](https://docs.docker.com/engine/reference/commandline/buildx_create/#platform) for current node. If not empty, values take priority over the detected ones |
@@ -111,14 +107,6 @@ The following inputs can be used as `step.with` keys:
> [!NOTE] > [!NOTE]
> `buildkitd-config` and `buildkitd-config-inline` are mutually exclusive. > `buildkitd-config` and `buildkitd-config-inline` are mutually exclusive.
> [!NOTE]
> `install` input is deprecated and will be removed in a future release. This
> input is not necessary when building with our actions like
> `docker/build-push-action` or `docker/bake-action`. If you are still building
> with the `docker build` command then you can set the `BUILDX_BUILDER`
> environment variable, or you can just directly invoke the
> `docker buildx build` command: https://github.com/docker/setup-buildx-action/pull/455
### outputs ### outputs
The following outputs are available: The following outputs are available:
@@ -142,23 +130,6 @@ The following [official docker environment variables](https://docs.docker.com/en
### `nodes` output ### `nodes` output
```json
[
{
"name": "builder-3820d274-502c-4498-ae24-d4c32b3023d90",
"endpoint": "unix:///var/run/docker.sock",
"driver-opts": [
"network=host",
"image=moby/buildkit:master"
],
"status": "running",
"buildkitd-flags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
"buildkit": "3fab389",
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/amd64/v4,linux/386"
}
]
```
| Name | Type | Description | | Name | Type | Description |
|-------------------|--------|----------------------------| |-------------------|--------|----------------------------|
| `name` | String | Node name | | `name` | String | Node name |
@@ -169,6 +140,21 @@ The following [official docker environment variables](https://docs.docker.com/en
| `buildkit` | String | BuildKit version | | `buildkit` | String | BuildKit version |
| `platforms` | String | Platforms available | | `platforms` | String | Platforms available |
Example:
```json
[
{
"name": "builder-8fa135e1-9bce-4a29-9368-46a09a1d750d0",
"endpoint": "unix:///var/run/docker.sock",
"status": "running",
"buildkitd-flags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
"buildkit": "v0.27.1",
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/386"
}
]
```
## Contributing ## Contributing
Want to contribute? Awesome! You can find information about contributing to Want to contribute? Awesome! You can find information about contributing to

View File

@@ -1,38 +1,40 @@
import {beforeEach, describe, expect, jest, test} from '@jest/globals'; import {beforeEach, describe, expect, test, vi} from 'vitest';
import * as fs from 'fs'; import * as fs from 'fs';
import * as os from 'os';
import * as path from 'path'; import * as path from 'path';
import {Buildx} from '@docker/actions-toolkit/lib/buildx/buildx';
import {Context} from '@docker/actions-toolkit/lib/context';
import {Docker} from '@docker/actions-toolkit/lib/docker/docker';
import {Toolkit} from '@docker/actions-toolkit/lib/toolkit';
import {Node} from '@docker/actions-toolkit/lib/types/buildx/builder';
import * as context from '../src/context'; import {Buildx} from '@docker/actions-toolkit/lib/buildx/buildx.js';
import {Context} from '@docker/actions-toolkit/lib/context.js';
import {Docker} from '@docker/actions-toolkit/lib/docker/docker.js';
import {Toolkit} from '@docker/actions-toolkit/lib/toolkit.js';
import {Node} from '@docker/actions-toolkit/lib/types/buildx/builder.js';
import * as context from '../src/context.js';
const fixturesDir = path.join(__dirname, 'fixtures'); const fixturesDir = path.join(__dirname, 'fixtures');
// prettier-ignore const tmpDir = fs.mkdtempSync(path.join(process.env.TEMP || os.tmpdir(), 'context-'));
const tmpDir = path.join(process.env.TEMP || '/tmp', 'setup-buildx-jest'); const tmpName = path.join(tmpDir, '.tmpname-vi');
const tmpName = path.join(tmpDir, '.tmpname-jest');
jest.spyOn(Context, 'tmpDir').mockImplementation((): string => { vi.spyOn(Context, 'tmpDir').mockImplementation((): string => {
if (!fs.existsSync(tmpDir)) { if (!fs.existsSync(tmpDir)) {
fs.mkdirSync(tmpDir, {recursive: true}); fs.mkdirSync(tmpDir, {recursive: true});
} }
return tmpDir; return tmpDir;
}); });
jest.spyOn(Context, 'tmpName').mockImplementation((): string => { vi.spyOn(Context, 'tmpName').mockImplementation((): string => {
return tmpName; return tmpName;
}); });
jest.mock('crypto', () => { vi.mock('crypto', async () => {
return { return {
...(jest.requireActual('crypto') as object), ...(await vi.importActual('crypto')),
randomUUID: jest.fn(() => '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d') randomUUID: vi.fn(() => '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d')
}; };
}); });
jest.spyOn(Docker, 'context').mockImplementation((): Promise<string> => { vi.spyOn(Docker, 'context').mockImplementation((): Promise<string> => {
return Promise.resolve('default'); return Promise.resolve('default');
}); });
@@ -52,7 +54,6 @@ describe('getCreateArgs', () => {
0, 0,
'v0.10.3', 'v0.10.3',
new Map<string, string>([ new Map<string, string>([
['install', 'false'],
['use', 'true'], ['use', 'true'],
['cache-binary', 'true'], ['cache-binary', 'true'],
['cleanup', 'true'], ['cleanup', 'true'],
@@ -71,7 +72,6 @@ describe('getCreateArgs', () => {
'v0.10.3', 'v0.10.3',
new Map<string, string>([ new Map<string, string>([
['driver', 'docker'], ['driver', 'docker'],
['install', 'false'],
['use', 'true'], ['use', 'true'],
['cache-binary', 'true'], ['cache-binary', 'true'],
['cleanup', 'true'], ['cleanup', 'true'],
@@ -89,7 +89,6 @@ describe('getCreateArgs', () => {
2, 2,
'v0.10.3', 'v0.10.3',
new Map<string, string>([ new Map<string, string>([
['install', 'false'],
['use', 'false'], ['use', 'false'],
['driver-opts', 'image=moby/buildkit:master\nnetwork=host'], ['driver-opts', 'image=moby/buildkit:master\nnetwork=host'],
['cache-binary', 'true'], ['cache-binary', 'true'],
@@ -111,7 +110,6 @@ describe('getCreateArgs', () => {
new Map<string, string>([ new Map<string, string>([
['driver', 'remote'], ['driver', 'remote'],
['endpoint', 'tls://foo:1234'], ['endpoint', 'tls://foo:1234'],
['install', 'false'],
['use', 'true'], ['use', 'true'],
['cache-binary', 'true'], ['cache-binary', 'true'],
['cleanup', 'true'], ['cleanup', 'true'],
@@ -132,7 +130,6 @@ describe('getCreateArgs', () => {
['driver', 'remote'], ['driver', 'remote'],
['platforms', 'linux/arm64,linux/arm/v7'], ['platforms', 'linux/arm64,linux/arm/v7'],
['endpoint', 'tls://foo:1234'], ['endpoint', 'tls://foo:1234'],
['install', 'false'],
['use', 'true'], ['use', 'true'],
['cache-binary', 'true'], ['cache-binary', 'true'],
['cleanup', 'true'], ['cleanup', 'true'],
@@ -151,7 +148,6 @@ describe('getCreateArgs', () => {
5, 5,
'v0.10.3', 'v0.10.3',
new Map<string, string>([ new Map<string, string>([
['install', 'false'],
['use', 'false'], ['use', 'false'],
['driver-opts', `"env.no_proxy=localhost,127.0.0.1,.mydomain"`], ['driver-opts', `"env.no_proxy=localhost,127.0.0.1,.mydomain"`],
['cache-binary', 'true'], ['cache-binary', 'true'],
@@ -170,7 +166,6 @@ describe('getCreateArgs', () => {
6, 6,
'v0.10.3', 'v0.10.3',
new Map<string, string>([ new Map<string, string>([
['install', 'false'],
['use', 'false'], ['use', 'false'],
['platforms', 'linux/amd64\n"linux/arm64,linux/arm/v7"'], ['platforms', 'linux/amd64\n"linux/arm64,linux/arm/v7"'],
['cache-binary', 'true'], ['cache-binary', 'true'],
@@ -189,7 +184,6 @@ describe('getCreateArgs', () => {
7, 7,
'v0.10.3', 'v0.10.3',
new Map<string, string>([ new Map<string, string>([
['install', 'false'],
['use', 'false'], ['use', 'false'],
['driver', 'unknown'], ['driver', 'unknown'],
['cache-binary', 'true'], ['cache-binary', 'true'],
@@ -206,7 +200,6 @@ describe('getCreateArgs', () => {
8, 8,
'v0.10.3', 'v0.10.3',
new Map<string, string>([ new Map<string, string>([
['install', 'false'],
['use', 'false'], ['use', 'false'],
['buildkitd-config', path.join(fixturesDir, 'buildkitd.toml')], ['buildkitd-config', path.join(fixturesDir, 'buildkitd.toml')],
['cache-binary', 'true'], ['cache-binary', 'true'],
@@ -225,7 +218,6 @@ describe('getCreateArgs', () => {
9, 9,
'v0.10.3', 'v0.10.3',
new Map<string, string>([ new Map<string, string>([
['install', 'false'],
['use', 'false'], ['use', 'false'],
['buildkitd-config-inline', 'debug = true'], ['buildkitd-config-inline', 'debug = true'],
['cache-binary', 'true'], ['cache-binary', 'true'],
@@ -244,7 +236,6 @@ describe('getCreateArgs', () => {
10, 10,
'v0.10.3', 'v0.10.3',
new Map<string, string>([ new Map<string, string>([
['install', 'false'],
['use', 'false'], ['use', 'false'],
['driver', 'cloud'], ['driver', 'cloud'],
['buildkitd-flags', '--allow-insecure-entitlement network.host'], ['buildkitd-flags', '--allow-insecure-entitlement network.host'],
@@ -263,7 +254,6 @@ describe('getCreateArgs', () => {
11, 11,
'v0.10.3', 'v0.10.3',
new Map<string, string>([ new Map<string, string>([
['install', 'false'],
['use', 'true'], ['use', 'true'],
['cleanup', 'true'], ['cleanup', 'true'],
['cache-binary', 'true'], ['cache-binary', 'true'],
@@ -282,7 +272,6 @@ describe('getCreateArgs', () => {
12, 12,
'v0.10.3', 'v0.10.3',
new Map<string, string>([ new Map<string, string>([
['install', 'false'],
['use', 'true'], ['use', 'true'],
['cleanup', 'true'], ['cleanup', 'true'],
['cache-binary', 'true'], ['cache-binary', 'true'],
@@ -298,13 +287,13 @@ describe('getCreateArgs', () => {
] ]
], ],
])( ])(
'[%d] given buildx %s and %p as inputs, returns %p', '[%d] given buildx %o and %o as inputs, returns %o',
async (num: number, buildxVersion: string, inputs: Map<string, string>, expected: Array<string>) => { async (num: number, buildxVersion: string, inputs: Map<string, string>, expected: Array<string>) => {
inputs.forEach((value: string, name: string) => { inputs.forEach((value: string, name: string) => {
setInput(name, value); setInput(name, value);
}); });
const toolkit = new Toolkit(); const toolkit = new Toolkit();
jest.spyOn(Buildx.prototype, 'version').mockImplementation(async (): Promise<string> => { vi.spyOn(Buildx.prototype, 'version').mockImplementation(async (): Promise<string> => {
return buildxVersion; return buildxVersion;
}); });
const inp = await context.getInputs(); const inp = await context.getInputs();
@@ -330,7 +319,6 @@ describe('getAppendArgs', () => {
0, 0,
'v0.10.3', 'v0.10.3',
new Map<string, string>([ new Map<string, string>([
['install', 'false'],
['use', 'true'], ['use', 'true'],
['cache-binary', 'true'], ['cache-binary', 'true'],
['cleanup', 'true'], ['cleanup', 'true'],
@@ -357,13 +345,13 @@ describe('getAppendArgs', () => {
] ]
] ]
])( ])(
'[%d] given buildx %s and %p as inputs, returns %p', '[%d] given buildx %o and %o as inputs, returns %o',
async (num: number, buildxVersion: string, inputs: Map<string, string>, node: Node, expected: Array<string>) => { async (num: number, buildxVersion: string, inputs: Map<string, string>, node: Node, expected: Array<string>) => {
inputs.forEach((value: string, name: string) => { inputs.forEach((value: string, name: string) => {
setInput(name, value); setInput(name, value);
}); });
const toolkit = new Toolkit(); const toolkit = new Toolkit();
jest.spyOn(Buildx.prototype, 'version').mockImplementation(async (): Promise<string> => { vi.spyOn(Buildx.prototype, 'version').mockImplementation(async (): Promise<string> => {
return buildxVersion; return buildxVersion;
}); });
const inp = await context.getInputs(); const inp = await context.getInputs();
@@ -389,7 +377,6 @@ describe('getVersion', () => {
0, 0,
new Map<string, string>([ new Map<string, string>([
// defaults // defaults
['install', 'false'],
['use', 'true'], ['use', 'true'],
['cache-binary', 'true'], ['cache-binary', 'true'],
['cleanup', 'true'], ['cleanup', 'true'],
@@ -402,7 +389,6 @@ describe('getVersion', () => {
new Map<string, string>([ new Map<string, string>([
['version', 'latest'], ['version', 'latest'],
// defaults // defaults
['install', 'false'],
['use', 'true'], ['use', 'true'],
['cache-binary', 'true'], ['cache-binary', 'true'],
['cleanup', 'true'], ['cleanup', 'true'],
@@ -415,7 +401,6 @@ describe('getVersion', () => {
new Map<string, string>([ new Map<string, string>([
['version', 'edge'], ['version', 'edge'],
// defaults // defaults
['install', 'false'],
['use', 'true'], ['use', 'true'],
['cache-binary', 'true'], ['cache-binary', 'true'],
['cleanup', 'true'], ['cleanup', 'true'],
@@ -428,7 +413,6 @@ describe('getVersion', () => {
new Map<string, string>([ new Map<string, string>([
['version', 'v0.19.2'], ['version', 'v0.19.2'],
// defaults // defaults
['install', 'false'],
['use', 'true'], ['use', 'true'],
['cache-binary', 'true'], ['cache-binary', 'true'],
['cleanup', 'true'], ['cleanup', 'true'],
@@ -442,7 +426,6 @@ describe('getVersion', () => {
['version', 'latest'], ['version', 'latest'],
['driver', 'cloud'], ['driver', 'cloud'],
// defaults // defaults
['install', 'false'],
['use', 'true'], ['use', 'true'],
['cache-binary', 'true'], ['cache-binary', 'true'],
['cleanup', 'true'], ['cleanup', 'true'],
@@ -456,7 +439,6 @@ describe('getVersion', () => {
['version', 'edge'], ['version', 'edge'],
['driver', 'cloud'], ['driver', 'cloud'],
// defaults // defaults
['install', 'false'],
['use', 'true'], ['use', 'true'],
['cache-binary', 'true'], ['cache-binary', 'true'],
['cleanup', 'true'], ['cleanup', 'true'],
@@ -469,7 +451,6 @@ describe('getVersion', () => {
new Map<string, string>([ new Map<string, string>([
['driver', 'cloud'], ['driver', 'cloud'],
// defaults // defaults
['install', 'false'],
['use', 'true'], ['use', 'true'],
['cache-binary', 'true'], ['cache-binary', 'true'],
['cleanup', 'true'], ['cleanup', 'true'],
@@ -483,7 +464,6 @@ describe('getVersion', () => {
['version', 'cloud:v0.11.2-desktop.2'], ['version', 'cloud:v0.11.2-desktop.2'],
['driver', 'cloud'], ['driver', 'cloud'],
// defaults // defaults
['install', 'false'],
['use', 'true'], ['use', 'true'],
['cache-binary', 'true'], ['cache-binary', 'true'],
['cleanup', 'true'], ['cleanup', 'true'],
@@ -496,7 +476,6 @@ describe('getVersion', () => {
new Map<string, string>([ new Map<string, string>([
['version', 'cloud:v0.11.2-desktop.2'], ['version', 'cloud:v0.11.2-desktop.2'],
// defaults // defaults
['install', 'false'],
['use', 'true'], ['use', 'true'],
['cache-binary', 'true'], ['cache-binary', 'true'],
['cleanup', 'true'], ['cleanup', 'true'],
@@ -505,7 +484,7 @@ describe('getVersion', () => {
'cloud:v0.11.2-desktop.2' 'cloud:v0.11.2-desktop.2'
], ],
])( ])(
'[%d] given %p as inputs, returns version %p', '[%d] given %o as inputs, returns version %o',
async (num: number, inputs: Map<string, string>, expected: string) => { async (num: number, inputs: Map<string, string>, expected: string) => {
inputs.forEach((value: string, name: string) => { inputs.forEach((value: string, name: string) => {
setInput(name, value); setInput(name, value);

12
__tests__/setup.unit.ts Normal file
View File

@@ -0,0 +1,12 @@
import fs from 'node:fs';
import os from 'node:os';
import path from 'node:path';
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'docker-setup-buildx-action-'));
process.env = Object.assign({}, process.env, {
TEMP: tmpDir,
GITHUB_REPOSITORY: 'docker/setup-buildx-action',
RUNNER_TEMP: path.join(tmpDir, 'runner-temp'),
RUNNER_TOOL_CACHE: path.join(tmpDir, 'runner-tool-cache')
});

View File

@@ -54,20 +54,6 @@ inputs:
description: 'Cleanup temp files and remove builder at the end of a job' description: 'Cleanup temp files and remove builder at the end of a job'
default: 'true' default: 'true'
required: false required: false
# TODO: remove deprecated config, config-inline and install inputs
config:
description: 'BuildKit daemon config file'
deprecationMessage: 'Use buildkitd-config instead'
required: false
config-inline:
description: 'Inline BuildKit daemon config'
deprecationMessage: 'Use buildkitd-config-inline instead'
required: false
install:
description: 'Sets up docker build command as an alias to docker buildx build'
deprecationMessage: '"docker buildx install" command is deprecated and will be removed in a future release, use BUILDX_BUILDER environment variable instead'
default: 'false'
required: false
outputs: outputs:
name: name:
@@ -86,6 +72,6 @@ outputs:
description: 'Builder node flags (deprecated, use nodes output instead)' description: 'Builder node flags (deprecated, use nodes output instead)'
runs: runs:
using: 'node20' using: 'node24'
main: 'dist/index.js' main: 'dist/index.js'
post: 'dist/index.js' post: 'dist/index.js'

View File

@@ -1,12 +1,13 @@
# syntax=docker/dockerfile:1 # syntax=docker/dockerfile:1
ARG NODE_VERSION=20 ARG NODE_VERSION=24
FROM node:${NODE_VERSION}-alpine AS base FROM node:${NODE_VERSION}-alpine AS base
RUN apk add --no-cache cpio findutils git RUN apk add --no-cache cpio findutils git rsync
WORKDIR /src WORKDIR /src
RUN --mount=type=bind,target=.,rw \ RUN --mount=type=bind,target=.,rw \
--mount=type=cache,target=/src/.yarn/cache <<EOT --mount=type=cache,target=/src/.yarn/cache <<EOT
set -e
corepack enable corepack enable
yarn --version yarn --version
yarn config set --home enableTelemetry 0 yarn config set --home enableTelemetry 0
@@ -34,18 +35,27 @@ RUN --mount=type=bind,target=.,rw <<EOT
EOT EOT
FROM deps AS build FROM deps AS build
RUN --mount=type=bind,target=.,rw \ RUN --mount=target=/context \
--mount=type=cache,target=/src/.yarn/cache \ --mount=type=cache,target=/src/.yarn/cache \
--mount=type=cache,target=/src/node_modules \ --mount=type=cache,target=/src/node_modules <<EOT
yarn run build && mkdir /out && cp -Rf dist /out/ set -e
rsync -a /context/. .
rm -rf dist
yarn run build
mkdir /out
cp -r dist /out
EOT
FROM scratch AS build-update FROM scratch AS build-update
COPY --from=build /out / COPY --from=build /out /
FROM build AS build-validate FROM build AS build-validate
RUN --mount=type=bind,target=.,rw <<EOT RUN --mount=target=/context \
--mount=target=.,type=tmpfs <<EOT
set -e set -e
rsync -a /context/. .
git add -A git add -A
rm -rf dist
cp -rf /out/* . cp -rf /out/* .
if [ -n "$(git status --porcelain -- dist)" ]; then if [ -n "$(git status --porcelain -- dist)" ]; then
echo >&2 'ERROR: Build result differs. Please build first with "docker buildx bake build"' echo >&2 'ERROR: Build result differs. Please build first with "docker buildx bake build"'
@@ -58,8 +68,7 @@ FROM deps AS format
RUN --mount=type=bind,target=.,rw \ RUN --mount=type=bind,target=.,rw \
--mount=type=cache,target=/src/.yarn/cache \ --mount=type=cache,target=/src/.yarn/cache \
--mount=type=cache,target=/src/node_modules \ --mount=type=cache,target=/src/node_modules \
yarn run format \ yarn run format && mkdir /out && find . -name '*.ts' -not -path './node_modules/*' -not -path './.yarn/*' | cpio -pdm /out
&& mkdir /out && find . -name '*.ts' -not -path './node_modules/*' -not -path './.yarn/*' | cpio -pdm /out
FROM scratch AS format-update FROM scratch AS format-update
COPY --from=format /out / COPY --from=format /out /
@@ -74,7 +83,7 @@ FROM deps AS test
RUN --mount=type=bind,target=.,rw \ RUN --mount=type=bind,target=.,rw \
--mount=type=cache,target=/src/.yarn/cache \ --mount=type=cache,target=/src/.yarn/cache \
--mount=type=cache,target=/src/node_modules \ --mount=type=cache,target=/src/node_modules \
yarn run test --coverage --coverageDirectory=/tmp/coverage yarn run test --coverage --coverage.reportsDirectory=/tmp/coverage
FROM scratch AS test-coverage FROM scratch AS test-coverage
COPY --from=test /tmp/coverage / COPY --from=test /tmp/coverage /

301
dist/606.index.js generated vendored Normal file
View File

@@ -0,0 +1,301 @@
export const id = 606;
export const ids = [606];
export const modules = {
/***/ 606:
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (/* binding */ pMap)
/* harmony export */ });
/* unused harmony exports pMapIterable, pMapSkip */
async function pMap(
iterable,
mapper,
{
concurrency = Number.POSITIVE_INFINITY,
stopOnError = true,
signal,
} = {},
) {
return new Promise((resolve_, reject_) => {
if (iterable[Symbol.iterator] === undefined && iterable[Symbol.asyncIterator] === undefined) {
throw new TypeError(`Expected \`input\` to be either an \`Iterable\` or \`AsyncIterable\`, got (${typeof iterable})`);
}
if (typeof mapper !== 'function') {
throw new TypeError('Mapper function is required');
}
if (!((Number.isSafeInteger(concurrency) && concurrency >= 1) || concurrency === Number.POSITIVE_INFINITY)) {
throw new TypeError(`Expected \`concurrency\` to be an integer from 1 and up or \`Infinity\`, got \`${concurrency}\` (${typeof concurrency})`);
}
const result = [];
const errors = [];
const skippedIndexesMap = new Map();
let isRejected = false;
let isResolved = false;
let isIterableDone = false;
let resolvingCount = 0;
let currentIndex = 0;
const iterator = iterable[Symbol.iterator] === undefined ? iterable[Symbol.asyncIterator]() : iterable[Symbol.iterator]();
const signalListener = () => {
reject(signal.reason);
};
const cleanup = () => {
signal?.removeEventListener('abort', signalListener);
};
const resolve = value => {
resolve_(value);
cleanup();
};
const reject = reason => {
isRejected = true;
isResolved = true;
reject_(reason);
cleanup();
};
if (signal) {
if (signal.aborted) {
reject(signal.reason);
}
signal.addEventListener('abort', signalListener, {once: true});
}
const next = async () => {
if (isResolved) {
return;
}
const nextItem = await iterator.next();
const index = currentIndex;
currentIndex++;
// Note: `iterator.next()` can be called many times in parallel.
// This can cause multiple calls to this `next()` function to
// receive a `nextItem` with `done === true`.
// The shutdown logic that rejects/resolves must be protected
// so it runs only one time as the `skippedIndex` logic is
// non-idempotent.
if (nextItem.done) {
isIterableDone = true;
if (resolvingCount === 0 && !isResolved) {
if (!stopOnError && errors.length > 0) {
reject(new AggregateError(errors)); // eslint-disable-line unicorn/error-message
return;
}
isResolved = true;
if (skippedIndexesMap.size === 0) {
resolve(result);
return;
}
const pureResult = [];
// Support multiple `pMapSkip`'s.
for (const [index, value] of result.entries()) {
if (skippedIndexesMap.get(index) === pMapSkip) {
continue;
}
pureResult.push(value);
}
resolve(pureResult);
}
return;
}
resolvingCount++;
// Intentionally detached
(async () => {
try {
const element = await nextItem.value;
if (isResolved) {
return;
}
const value = await mapper(element, index);
// Use Map to stage the index of the element.
if (value === pMapSkip) {
skippedIndexesMap.set(index, value);
}
result[index] = value;
resolvingCount--;
await next();
} catch (error) {
if (stopOnError) {
reject(error);
} else {
errors.push(error);
resolvingCount--;
// In that case we can't really continue regardless of `stopOnError` state
// since an iterable is likely to continue throwing after it throws once.
// If we continue calling `next()` indefinitely we will likely end up
// in an infinite loop of failed iteration.
try {
await next();
} catch (error) {
reject(error);
}
}
}
})();
};
// Create the concurrent runners in a detached (non-awaited)
// promise. We need this so we can await the `next()` calls
// to stop creating runners before hitting the concurrency limit
// if the iterable has already been marked as done.
// NOTE: We *must* do this for async iterators otherwise we'll spin up
// infinite `next()` calls by default and never start the event loop.
(async () => {
for (let index = 0; index < concurrency; index++) {
try {
// eslint-disable-next-line no-await-in-loop
await next();
} catch (error) {
reject(error);
break;
}
if (isIterableDone || isRejected) {
break;
}
}
})();
});
}
function pMapIterable(
iterable,
mapper,
{
concurrency = Number.POSITIVE_INFINITY,
backpressure = concurrency,
} = {},
) {
if (iterable[Symbol.iterator] === undefined && iterable[Symbol.asyncIterator] === undefined) {
throw new TypeError(`Expected \`input\` to be either an \`Iterable\` or \`AsyncIterable\`, got (${typeof iterable})`);
}
if (typeof mapper !== 'function') {
throw new TypeError('Mapper function is required');
}
if (!((Number.isSafeInteger(concurrency) && concurrency >= 1) || concurrency === Number.POSITIVE_INFINITY)) {
throw new TypeError(`Expected \`concurrency\` to be an integer from 1 and up or \`Infinity\`, got \`${concurrency}\` (${typeof concurrency})`);
}
if (!((Number.isSafeInteger(backpressure) && backpressure >= concurrency) || backpressure === Number.POSITIVE_INFINITY)) {
throw new TypeError(`Expected \`backpressure\` to be an integer from \`concurrency\` (${concurrency}) and up or \`Infinity\`, got \`${backpressure}\` (${typeof backpressure})`);
}
return {
async * [Symbol.asyncIterator]() {
const iterator = iterable[Symbol.asyncIterator] === undefined ? iterable[Symbol.iterator]() : iterable[Symbol.asyncIterator]();
const promises = [];
let pendingPromisesCount = 0;
let isDone = false;
let index = 0;
function trySpawn() {
if (isDone || !(pendingPromisesCount < concurrency && promises.length < backpressure)) {
return;
}
pendingPromisesCount++;
const promise = (async () => {
const {done, value} = await iterator.next();
if (done) {
pendingPromisesCount--;
return {done: true};
}
// Spawn if still below concurrency and backpressure limit
trySpawn();
try {
const returnValue = await mapper(await value, index++);
pendingPromisesCount--;
if (returnValue === pMapSkip) {
const index = promises.indexOf(promise);
if (index > 0) {
promises.splice(index, 1);
}
}
// Spawn if still below backpressure limit and just dropped below concurrency limit
trySpawn();
return {done: false, value: returnValue};
} catch (error) {
pendingPromisesCount--;
isDone = true;
return {error};
}
})();
promises.push(promise);
}
trySpawn();
while (promises.length > 0) {
const {error, done, value} = await promises[0]; // eslint-disable-line no-await-in-loop
promises.shift();
if (error) {
throw error;
}
if (done) {
return;
}
// Spawn if just dropped below backpressure limit and below the concurrency limit
trySpawn();
if (value === pMapSkip) {
continue;
}
yield value;
}
},
};
}
const pMapSkip = Symbol('skip');
/***/ })
};
//# sourceMappingURL=606.index.js.map

1
dist/606.index.js.map generated vendored Normal file

File diff suppressed because one or more lines are too long

124
dist/index.js generated vendored

File diff suppressed because one or more lines are too long

2
dist/index.js.map generated vendored

File diff suppressed because one or more lines are too long

3860
dist/licenses.txt generated vendored

File diff suppressed because it is too large Load Diff

3
dist/package.json generated vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"type": "module"
}

View File

@@ -1,58 +0,0 @@
/* eslint-disable @typescript-eslint/no-require-imports */
const {defineConfig, globalIgnores} = require('eslint/config');
const {fixupConfigRules, fixupPluginRules} = require('@eslint/compat');
const typescriptEslint = require('@typescript-eslint/eslint-plugin');
const jestPlugin = require('eslint-plugin-jest');
const prettier = require('eslint-plugin-prettier');
const globals = require('globals');
const tsParser = require('@typescript-eslint/parser');
const js = require('@eslint/js');
const {FlatCompat} = require('@eslint/eslintrc');
// __dirname and __filename exist natively in CommonJS
const compat = new FlatCompat({
baseDirectory: __dirname,
recommendedConfig: js.configs.recommended,
allConfig: js.configs.all
});
module.exports = defineConfig([
globalIgnores(['dist/**/*', 'coverage/**/*', 'node_modules/**/*']),
{
// prettier-ignore
extends: fixupConfigRules(
compat.extends(
'eslint:recommended',
'plugin:@typescript-eslint/eslint-recommended',
'plugin:@typescript-eslint/recommended',
'plugin:jest/recommended',
'plugin:prettier/recommended'
)
),
plugins: {
'@typescript-eslint': fixupPluginRules(typescriptEslint),
jest: fixupPluginRules(jestPlugin),
prettier: fixupPluginRules(prettier)
},
languageOptions: {
globals: {
...globals.node,
...globals.jest
},
parser: tsParser,
ecmaVersion: 'latest',
sourceType: 'module'
},
rules: {
'@typescript-eslint/no-require-imports': [
'error',
{
allowAsImport: true
}
]
}
}
]);

52
eslint.config.mjs Normal file
View File

@@ -0,0 +1,52 @@
import {defineConfig} from 'eslint/config';
import js from '@eslint/js';
import tseslint from '@typescript-eslint/eslint-plugin';
import vitest from '@vitest/eslint-plugin';
import globals from 'globals';
import eslintConfigPrettier from 'eslint-config-prettier/flat';
import eslintPluginPrettier from 'eslint-plugin-prettier';
export default defineConfig([
{
ignores: ['.yarn/**/*', 'coverage/**/*', 'dist/**/*']
},
js.configs.recommended,
...tseslint.configs['flat/recommended'],
eslintConfigPrettier,
{
languageOptions: {
globals: {
...globals.node
}
}
},
{
files: ['__tests__/**'],
...vitest.configs.recommended,
languageOptions: {
globals: {
...globals.node,
...vitest.environments.env.globals
}
},
rules: {
...vitest.configs.recommended.rules,
'vitest/no-conditional-expect': 'error',
'vitest/no-disabled-tests': 0
}
},
{
plugins: {
prettier: eslintPluginPrettier
},
rules: {
'prettier/prettier': 'error',
'@typescript-eslint/no-require-imports': [
'error',
{
allowAsImport: true
}
]
}
}
]);

View File

@@ -1,29 +0,0 @@
/* eslint-disable @typescript-eslint/no-require-imports */
const fs = require('fs');
const os = require('os');
const path = require('path');
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'docker-setup-buildx-action-'));
process.env = Object.assign({}, process.env, {
TEMP: tmpDir,
GITHUB_REPOSITORY: 'docker/setup-buildx-action',
RUNNER_TEMP: path.join(tmpDir, 'runner-temp'),
RUNNER_TOOL_CACHE: path.join(tmpDir, 'runner-tool-cache')
});
module.exports = {
clearMocks: true,
testEnvironment: 'node',
moduleFileExtensions: ['js', 'ts'],
testMatch: ['**/*.test.ts'],
transform: {
'^.+\\.ts$': 'ts-jest'
},
moduleNameMapper: {
'^csv-parse/sync': '<rootDir>/node_modules/csv-parse/dist/cjs/sync.cjs'
},
collectCoverageFrom: ['src/**/{!(main.ts),}.ts'],
coveragePathIgnorePatterns: ['lib/', 'node_modules/', '__mocks__/', '__tests__/'],
verbose: true
};

View File

@@ -1,16 +1,13 @@
{ {
"name": "docker-setup-buildx", "name": "docker-setup-buildx",
"description": "Set up Docker Buildx", "description": "Set up Docker Buildx",
"type": "module",
"main": "src/main.ts", "main": "src/main.ts",
"scripts": { "scripts": {
"build": "ncc build --source-map --minify --license licenses.txt", "build": "ncc build --source-map --minify --license licenses.txt",
"lint": "yarn run prettier && yarn run eslint", "lint": "eslint --max-warnings=0 .",
"format": "yarn run prettier:fix && yarn run eslint:fix", "format": "eslint --fix .",
"eslint": "eslint --max-warnings=0 .", "test": "vitest run"
"eslint:fix": "eslint --fix .",
"prettier": "prettier --check \"./**/*.ts\"",
"prettier:fix": "prettier --write \"./**/*.ts\"",
"test": "jest"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@@ -25,27 +22,25 @@
"license": "Apache-2.0", "license": "Apache-2.0",
"packageManager": "yarn@4.9.2", "packageManager": "yarn@4.9.2",
"dependencies": { "dependencies": {
"@actions/core": "^1.11.1", "@actions/core": "^3.0.0",
"@docker/actions-toolkit": "^0.63.0", "@docker/actions-toolkit": "^0.79.0",
"js-yaml": "^4.1.0" "js-yaml": "^4.1.1"
}, },
"devDependencies": { "devDependencies": {
"@eslint/compat": "^2.0.0", "@eslint/js": "^9.39.3",
"@eslint/eslintrc": "^3.3.3",
"@eslint/js": "^9.39.2",
"@types/js-yaml": "^4.0.9", "@types/js-yaml": "^4.0.9",
"@types/node": "^20.19.27", "@types/node": "^24.11.0",
"@typescript-eslint/eslint-plugin": "^8.50.0", "@typescript-eslint/eslint-plugin": "^8.56.1",
"@typescript-eslint/parser": "^8.50.0", "@typescript-eslint/parser": "^8.56.1",
"@vercel/ncc": "^0.38.4", "@vercel/ncc": "^0.38.4",
"eslint": "^9.39.2", "@vitest/coverage-v8": "^4.0.18",
"@vitest/eslint-plugin": "^1.6.9",
"eslint": "^9.39.3",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"eslint-plugin-jest": "^29.5.0", "eslint-plugin-prettier": "^5.5.5",
"eslint-plugin-prettier": "^5.5.4", "globals": "^17.3.0",
"jest": "^30.2.0", "prettier": "^3.8.1",
"prettier": "^3.7.4", "typescript": "^5.9.3",
"ts-jest": "^29.4.6", "vitest": "^4.0.18"
"ts-node": "^10.9.2",
"typescript": "^5.9.3"
} }
} }

View File

@@ -1,11 +1,11 @@
import * as crypto from 'crypto'; import * as crypto from 'crypto';
import * as core from '@actions/core'; import * as core from '@actions/core';
import {Docker} from '@docker/actions-toolkit/lib/docker/docker'; import {Docker} from '@docker/actions-toolkit/lib/docker/docker.js';
import {Util} from '@docker/actions-toolkit/lib/util'; import {Util} from '@docker/actions-toolkit/lib/util.js';
import {Toolkit} from '@docker/actions-toolkit/lib/toolkit'; import {Toolkit} from '@docker/actions-toolkit/lib/toolkit.js';
import {Node} from '@docker/actions-toolkit/lib/types/buildx/builder'; import {Node} from '@docker/actions-toolkit/lib/types/buildx/builder.js';
export const builderNodeEnvPrefix = 'BUILDER_NODE'; export const builderNodeEnvPrefix = 'BUILDER_NODE';
const defaultBuildkitdFlags = '--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host'; const defaultBuildkitdFlags = '--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host';
@@ -19,7 +19,6 @@ export interface Inputs {
buildkitdConfig: string; buildkitdConfig: string;
buildkitdConfigInline: string; buildkitdConfigInline: string;
platforms: string[]; platforms: string[];
install: boolean;
use: boolean; use: boolean;
endpoint: string; endpoint: string;
append: string; append: string;
@@ -36,11 +35,10 @@ export async function getInputs(): Promise<Inputs> {
driverOpts: Util.getInputList('driver-opts', {ignoreComma: true, quote: false}), driverOpts: Util.getInputList('driver-opts', {ignoreComma: true, quote: false}),
buildkitdFlags: core.getInput('buildkitd-flags'), buildkitdFlags: core.getInput('buildkitd-flags'),
platforms: Util.getInputList('platforms'), platforms: Util.getInputList('platforms'),
install: core.getBooleanInput('install'),
use: core.getBooleanInput('use'), use: core.getBooleanInput('use'),
endpoint: core.getInput('endpoint'), endpoint: core.getInput('endpoint'),
buildkitdConfig: core.getInput('buildkitd-config') || core.getInput('config'), buildkitdConfig: core.getInput('buildkitd-config'),
buildkitdConfigInline: core.getInput('buildkitd-config-inline') || core.getInput('config-inline'), buildkitdConfigInline: core.getInput('buildkitd-config-inline'),
append: core.getInput('append'), append: core.getInput('append'),
keepState: core.getBooleanInput('keep-state'), keepState: core.getBooleanInput('keep-state'),
cacheBinary: core.getBooleanInput('cache-binary'), cacheBinary: core.getBooleanInput('cache-binary'),

View File

@@ -4,18 +4,18 @@ import * as yaml from 'js-yaml';
import * as core from '@actions/core'; import * as core from '@actions/core';
import * as actionsToolkit from '@docker/actions-toolkit'; import * as actionsToolkit from '@docker/actions-toolkit';
import {Buildx} from '@docker/actions-toolkit/lib/buildx/buildx'; import {Buildx} from '@docker/actions-toolkit/lib/buildx/buildx.js';
import {Builder} from '@docker/actions-toolkit/lib/buildx/builder'; import {Builder} from '@docker/actions-toolkit/lib/buildx/builder.js';
import {Docker} from '@docker/actions-toolkit/lib/docker/docker'; import {Docker} from '@docker/actions-toolkit/lib/docker/docker.js';
import {Exec} from '@docker/actions-toolkit/lib/exec'; import {Exec} from '@docker/actions-toolkit/lib/exec.js';
import {Toolkit} from '@docker/actions-toolkit/lib/toolkit'; import {Toolkit} from '@docker/actions-toolkit/lib/toolkit.js';
import {Util} from '@docker/actions-toolkit/lib/util'; import {Util} from '@docker/actions-toolkit/lib/util.js';
import {Node} from '@docker/actions-toolkit/lib/types/buildx/builder'; import {Node} from '@docker/actions-toolkit/lib/types/buildx/builder.js';
import {ContextInfo} from '@docker/actions-toolkit/lib/types/docker/docker'; import {ContextInfo} from '@docker/actions-toolkit/lib/types/docker/docker.js';
import * as context from './context'; import * as context from './context.js';
import * as stateHelper from './state-helper'; import * as stateHelper from './state-helper.js';
actionsToolkit.run( actionsToolkit.run(
// main // main
@@ -53,7 +53,10 @@ actionsToolkit.run(
}); });
} else if (!(await toolkit.buildx.isAvailable()) || version) { } else if (!(await toolkit.buildx.isAvailable()) || version) {
await core.group(`Download buildx from GitHub Releases`, async () => { await core.group(`Download buildx from GitHub Releases`, async () => {
toolPath = await toolkit.buildxInstall.download(version || 'latest', !inputs.cacheBinary); toolPath = await toolkit.buildxInstall.download({
version: version || 'latest',
ghaNoCache: !inputs.cacheBinary
});
}); });
} }
if (toolPath) { if (toolPath) {
@@ -184,23 +187,6 @@ actionsToolkit.run(
}); });
}); });
if (inputs.install) {
if (standalone) {
throw new Error(`Cannot set buildx as default builder without the Docker CLI`);
}
await core.group(`Setting buildx as default builder`, async () => {
stateHelper.setBuildxIsDefaultBuilder(true);
const installCmd = await toolkit.buildx.getCommand(['install']);
await Exec.getExecOutput(installCmd.command, installCmd.args, {
ignoreReturnCode: true
}).then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
throw new Error(res.stderr.match(/(.*)\s*$/)?.[0]?.trim() ?? 'unknown error');
}
});
});
}
const builderInspect = await toolkit.builder.inspect(inputs.name); const builderInspect = await toolkit.builder.inspect(inputs.name);
const firstNode = builderInspect.nodes[0]; const firstNode = builderInspect.nodes[0];
@@ -218,9 +204,6 @@ actionsToolkit.run(
core.setOutput('driver', builderInspect.driver); core.setOutput('driver', builderInspect.driver);
core.setOutput('platforms', reducedPlatforms.join(',')); core.setOutput('platforms', reducedPlatforms.join(','));
core.setOutput('nodes', JSON.stringify(builderInspect.nodes, undefined, 2)); core.setOutput('nodes', JSON.stringify(builderInspect.nodes, undefined, 2));
core.setOutput('endpoint', firstNode.endpoint); // TODO: deprecated, to be removed in a later version
core.setOutput('status', firstNode.status); // TODO: deprecated, to be removed in a later version
core.setOutput('flags', firstNode['buildkitd-flags']); // TODO: deprecated, to be removed in a later version
}); });
if (!standalone && builderInspect.driver == 'docker-container') { if (!standalone && builderInspect.driver == 'docker-container') {
@@ -290,17 +273,5 @@ actionsToolkit.run(
fs.rmSync(stateHelper.certsDir, {recursive: true}); fs.rmSync(stateHelper.certsDir, {recursive: true});
}); });
} }
if (stateHelper.buildxIsDefaultBuilder) {
await core.group(`Restoring default builder`, async () => {
await Exec.getExecOutput('docker', ['buildx', 'uninstall'], {
ignoreReturnCode: true
}).then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
core.warning(`${res.stderr.match(/(.*)\s*$/)?.[0]?.trim() ?? 'unknown error'}`);
}
});
});
}
} }
); );

View File

@@ -8,7 +8,6 @@ export const containerName = process.env['STATE_containerName'] || '';
export const certsDir = process.env['STATE_certsDir'] || ''; export const certsDir = process.env['STATE_certsDir'] || '';
export const tmpDockerContext = process.env['STATE_tmpDockerContext'] || ''; export const tmpDockerContext = process.env['STATE_tmpDockerContext'] || '';
export const cleanup = /true/i.test(process.env['STATE_cleanup'] || ''); export const cleanup = /true/i.test(process.env['STATE_cleanup'] || '');
export const buildxIsDefaultBuilder = /true/i.test(process.env['STATE_buildxIsDefaultBuilder'] || '');
export const keepState = /true/i.test(process.env['STATE_keepState'] || ''); export const keepState = /true/i.test(process.env['STATE_keepState'] || '');
export function setDebug(debug: string) { export function setDebug(debug: string) {
@@ -43,10 +42,6 @@ export function setCleanup(cleanup: boolean) {
core.saveState('cleanup', cleanup); core.saveState('cleanup', cleanup);
} }
export function setBuildxIsDefaultBuilder(buildxIsDefaultBuilder: boolean) {
core.saveState('buildxIsDefaultBuilder', buildxIsDefaultBuilder);
}
export function setKeepState(keepState: boolean) { export function setKeepState(keepState: boolean) {
core.saveState('keepState', keepState); core.saveState('keepState', keepState);
} }

View File

@@ -1,9 +1,8 @@
{ {
"compilerOptions": { "compilerOptions": {
"module": "nodenext",
"moduleResolution": "nodenext",
"esModuleInterop": true, "esModuleInterop": true,
"target": "es6",
"module": "commonjs",
"strict": true,
"newLine": "lf", "newLine": "lf",
"outDir": "./lib", "outDir": "./lib",
"rootDir": "./src", "rootDir": "./src",
@@ -12,10 +11,7 @@
"resolveJsonModule": true, "resolveJsonModule": true,
"useUnknownInCatchVariables": false, "useUnknownInCatchVariables": false,
}, },
"exclude": [ "include": [
"./__tests__/**/*", "src/**/*.ts"
"./lib/**/*",
"node_modules",
"jest.config.ts"
] ]
} }

16
vitest.config.ts Normal file
View File

@@ -0,0 +1,16 @@
import {defineConfig} from 'vitest/config';
export default defineConfig({
test: {
clearMocks: true,
environment: 'node',
setupFiles: ['./__tests__/setup.unit.ts'],
include: ['**/*.test.ts'],
coverage: {
provider: 'v8',
reporter: ['clover'],
include: ['src/**/*.ts'],
exclude: ['src/**/main.ts']
}
}
});

6046
yarn.lock

File diff suppressed because it is too large Load Diff