Compare commits

..

414 Commits

Author SHA1 Message Date
CrazyMax
9e405d775a Merge pull request #214 from docker/dependabot/npm_and_yarn/octokit/plugin-rest-endpoint-methods-10.2.0
Some checks failed
publish / publish (push) Has been cancelled
build(deps): bump @octokit/plugin-rest-endpoint-methods from 10.1.5 to 10.2.0
2023-11-29 02:59:11 -08:00
CrazyMax
248fc44d7e Merge pull request #213 from crazy-max/switch-to-lima
docker(install): switch to lima
2023-11-29 02:47:26 -08:00
dependabot[bot]
e907622be4 build(deps): bump @octokit/plugin-rest-endpoint-methods
Bumps [@octokit/plugin-rest-endpoint-methods](https://github.com/octokit/plugin-rest-endpoint-methods.js) from 10.1.5 to 10.2.0.
- [Release notes](https://github.com/octokit/plugin-rest-endpoint-methods.js/releases)
- [Commits](https://github.com/octokit/plugin-rest-endpoint-methods.js/compare/v10.1.5...v10.2.0)

---
updated-dependencies:
- dependency-name: "@octokit/plugin-rest-endpoint-methods"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-28 22:26:11 +00:00
CrazyMax
5bc270dc53 Merge pull request #212 from docker/dependabot/npm_and_yarn/octokit/core-5.0.2
build(deps): bump @octokit/core from 5.0.1 to 5.0.2
2023-11-27 04:36:42 -08:00
CrazyMax
c1ecc4b621 docker(install): don't upgrade unrelated packages when installing lima
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2023-11-27 01:58:24 +01:00
CrazyMax
0a04d5661f docker(install): switch to lima
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2023-11-27 01:58:23 +01:00
dependabot[bot]
252cfd570c build(deps): bump @octokit/core from 5.0.1 to 5.0.2
Bumps [@octokit/core](https://github.com/octokit/core.js) from 5.0.1 to 5.0.2.
- [Release notes](https://github.com/octokit/core.js/releases)
- [Commits](https://github.com/octokit/core.js/compare/v5.0.1...v5.0.2)

---
updated-dependencies:
- dependency-name: "@octokit/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-22 22:40:09 +00:00
CrazyMax
2f97829cfc Merge pull request #211 from docker/bot/buildx-lab-releases-json
Update `.github/buildx-lab-releases.json`
2023-11-21 08:45:32 -08:00
crazy-max
ea541ecec7 github: update .github/buildx-lab-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-11-21 16:44:54 +00:00
CrazyMax
64a550a5dc Merge pull request #209 from docker/bot/buildx-releases-json
Update `.github/buildx-releases.json`
2023-11-17 02:12:12 -08:00
crazy-max
73bb35d328 github: update .github/buildx-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-11-17 00:15:29 +00:00
CrazyMax
97573bff9a Merge pull request #201 from crazy-max/colima-update
Some checks failed
publish / publish (push) Has been cancelled
docker(install): fallback to journalctl to print docker daemon logs
2023-11-16 03:43:14 -08:00
CrazyMax
cef4c16170 ci(test): add macos-13 to the matrix
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2023-11-16 12:28:24 +01:00
CrazyMax
3281ef2a12 docker(install): simplify provision
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2023-11-16 11:55:01 +01:00
CrazyMax
03b93c3aee docker(install): fallback to journalctl to print docker daemon logs
colima only supports Ubuntu image since 0.6.0 which
runs docker as systemd unit.

Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2023-11-16 11:55:01 +01:00
CrazyMax
f8909e3265 docker(install): remove deprecated colima config
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2023-11-16 11:55:00 +01:00
CrazyMax
624fee6e10 Merge pull request #206 from docker/dependabot/npm_and_yarn/octokit/plugin-rest-endpoint-methods-10.1.5
build(deps): bump @octokit/plugin-rest-endpoint-methods from 10.1.3 to 10.1.5
2023-11-16 02:20:13 -08:00
CrazyMax
e927ebb09c Merge pull request #207 from crazy-max/tempdir-runner-temp
Use RUNNER_TEMP as temp directory
2023-11-16 02:19:20 -08:00
CrazyMax
5250fc63c3 Merge pull request #204 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2023-11-16 02:17:08 -08:00
CrazyMax
77c591b46c Merge pull request #208 from docker/bot/buildx-releases-json
Update `.github/buildx-releases.json`
2023-11-16 02:16:53 -08:00
CrazyMax
602235dcce Use RUNNER_TEMP as temp directory
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2023-11-16 11:13:12 +01:00
crazy-max
3ca52c06b2 github: update .github/buildx-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-11-16 00:15:36 +00:00
dependabot[bot]
7c2659dc5d build(deps): bump @octokit/plugin-rest-endpoint-methods
Bumps [@octokit/plugin-rest-endpoint-methods](https://github.com/octokit/plugin-rest-endpoint-methods.js) from 10.1.3 to 10.1.5.
- [Release notes](https://github.com/octokit/plugin-rest-endpoint-methods.js/releases)
- [Commits](https://github.com/octokit/plugin-rest-endpoint-methods.js/compare/v10.1.3...v10.1.5)

---
updated-dependencies:
- dependency-name: "@octokit/plugin-rest-endpoint-methods"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-14 22:43:45 +00:00
crazy-max
307731cacb github: update .github/docker-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-11-14 00:21:04 +00:00
CrazyMax
81355687c2 Merge pull request #202 from crazy-max/align-node-version
ci: align node version
2023-11-13 02:21:38 -08:00
CrazyMax
cca99038ee ci: align node version
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-11-13 10:21:54 +01:00
CrazyMax
24a9fd8152 Merge pull request #198 from docker/dependabot/npm_and_yarn/octokit/plugin-rest-endpoint-methods-10.1.3
build(deps): bump @octokit/plugin-rest-endpoint-methods from 10.1.2 to 10.1.3
2023-11-11 06:14:22 -08:00
dependabot[bot]
53e9f24dd0 build(deps): bump @octokit/plugin-rest-endpoint-methods
Bumps [@octokit/plugin-rest-endpoint-methods](https://github.com/octokit/plugin-rest-endpoint-methods.js) from 10.1.2 to 10.1.3.
- [Release notes](https://github.com/octokit/plugin-rest-endpoint-methods.js/releases)
- [Commits](https://github.com/octokit/plugin-rest-endpoint-methods.js/compare/v10.1.2...v10.1.3)

---
updated-dependencies:
- dependency-name: "@octokit/plugin-rest-endpoint-methods"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-09 22:51:15 +00:00
CrazyMax
b525cd9de8 Merge pull request #197 from crazy-max/ci-codeql
ci: enable SAST scanning with CodeQL
2023-10-30 02:23:18 -07:00
CrazyMax
21a7def1e9 Merge pull request #195 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2023-10-30 01:54:05 -07:00
CrazyMax
243e746a8d Merge pull request #196 from docker/dependabot/npm_and_yarn/jwt-decode-4.0.0
build(deps): bump jwt-decode from 3.1.2 to 4.0.0
2023-10-30 01:53:46 -07:00
CrazyMax
b212b3b35e chore: fix incomplete string escaping
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-10-28 08:38:35 +02:00
CrazyMax
191def3857 ci: enable SAST scanning with CodeQL
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-10-28 08:31:56 +02:00
CrazyMax
0e5f8a766a github: fix jwt-decode import and test
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-10-28 04:37:59 +02:00
dependabot[bot]
a625c7487f build(deps): bump jwt-decode from 3.1.2 to 4.0.0
Bumps [jwt-decode](https://github.com/auth0/jwt-decode) from 3.1.2 to 4.0.0.
- [Release notes](https://github.com/auth0/jwt-decode/releases)
- [Changelog](https://github.com/auth0/jwt-decode/blob/main/CHANGELOG.md)
- [Commits](https://github.com/auth0/jwt-decode/compare/v3.1.2...v4.0.0)

---
updated-dependencies:
- dependency-name: jwt-decode
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-27 22:45:49 +00:00
crazy-max
e8569c2d9b github: update .github/docker-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-10-27 12:07:45 +00:00
CrazyMax
7b1a9e4e34 Merge pull request #193 from docker/bot/buildx-releases-json
Update `.github/buildx-releases.json`
2023-10-26 21:38:53 -07:00
CrazyMax
8b3ff1beb0 Merge pull request #190 from docker/dependabot/npm_and_yarn/octokit/plugin-rest-endpoint-methods-10.1.2
build(deps): bump @octokit/plugin-rest-endpoint-methods from 10.0.1 to 10.1.2
2023-10-26 21:38:33 -07:00
crazy-max
35555f7a24 github: update .github/buildx-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-10-27 04:38:00 +00:00
CrazyMax
5562309585 Merge pull request #192 from docker/dependabot/npm_and_yarn/babel/traverse-7.23.2
build(deps): bump @babel/traverse from 7.17.3 to 7.23.2
2023-10-26 21:37:29 -07:00
CrazyMax
2848275bb4 Merge pull request #191 from docker/dependabot/npm_and_yarn/undici-5.27.0
build(deps): bump undici from 5.25.4 to 5.27.0
2023-10-26 21:37:10 -07:00
dependabot[bot]
48c7d682b4 build(deps): bump @babel/traverse from 7.17.3 to 7.23.2
Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.17.3 to 7.23.2.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse)

---
updated-dependencies:
- dependency-name: "@babel/traverse"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-27 04:26:32 +00:00
dependabot[bot]
04d1940f48 build(deps): bump undici from 5.25.4 to 5.27.0
Bumps [undici](https://github.com/nodejs/undici) from 5.25.4 to 5.27.0.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/commits/v5.27.0)

---
updated-dependencies:
- dependency-name: undici
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-27 04:23:02 +00:00
dependabot[bot]
6af9ce25af build(deps): bump @octokit/plugin-rest-endpoint-methods
Bumps [@octokit/plugin-rest-endpoint-methods](https://github.com/octokit/plugin-rest-endpoint-methods.js) from 10.0.1 to 10.1.2.
- [Release notes](https://github.com/octokit/plugin-rest-endpoint-methods.js/releases)
- [Commits](https://github.com/octokit/plugin-rest-endpoint-methods.js/compare/v10.0.1...v10.1.2)

---
updated-dependencies:
- dependency-name: "@octokit/plugin-rest-endpoint-methods"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-26 22:32:42 +00:00
CrazyMax
1e2ed9bcf1 Merge pull request #187 from docker/dependabot/github_actions/actions/setup-node-4
build(deps): bump actions/setup-node from 3 to 4
2023-10-23 15:36:17 -07:00
dependabot[bot]
3e8e9fc046 build(deps): bump actions/setup-node from 3 to 4
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 3 to 4.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-23 22:15:26 +00:00
CrazyMax
663d108e8d Merge pull request #185 from docker/dependabot/npm_and_yarn/actions/github-6.0.0
Some checks failed
publish / publish (push) Has been cancelled
build(deps): bump @actions/github from 5.1.1 to 6.0.0
2023-10-13 05:00:55 -07:00
CrazyMax
2629338e09 chore: ignore unresolved @octokit/openapi-types module
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-10-13 13:52:41 +02:00
dependabot[bot]
7a01b3e2a4 build(deps): bump @actions/github from 5.1.1 to 6.0.0
Bumps [@actions/github](https://github.com/actions/toolkit/tree/HEAD/packages/github) from 5.1.1 to 6.0.0.
- [Changelog](https://github.com/actions/toolkit/blob/main/packages/github/RELEASES.md)
- [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/github)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-13 10:32:07 +00:00
CrazyMax
c363216f0d Merge pull request #184 from docker/dependabot/npm_and_yarn/csv-parse-5.5.2
build(deps): bump csv-parse from 5.5.1 to 5.5.2
2023-10-12 07:19:56 -07:00
CrazyMax
0ebe5d1c2f Merge pull request #186 from docker/dependabot/npm_and_yarn/octokit/plugin-rest-endpoint-methods-10.0.1
build(deps): bump @octokit/plugin-rest-endpoint-methods from 10.0.0 to 10.0.1
2023-10-12 07:19:33 -07:00
dependabot[bot]
6d03d1708d build(deps): bump @octokit/plugin-rest-endpoint-methods
Bumps [@octokit/plugin-rest-endpoint-methods](https://github.com/octokit/plugin-rest-endpoint-methods.js) from 10.0.0 to 10.0.1.
- [Release notes](https://github.com/octokit/plugin-rest-endpoint-methods.js/releases)
- [Commits](https://github.com/octokit/plugin-rest-endpoint-methods.js/compare/v10.0.0...v10.0.1)

---
updated-dependencies:
- dependency-name: "@octokit/plugin-rest-endpoint-methods"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-11 22:17:43 +00:00
dependabot[bot]
d6753812df build(deps): bump csv-parse from 5.5.1 to 5.5.2
Bumps [csv-parse](https://github.com/adaltas/node-csv/tree/HEAD/packages/csv-parse) from 5.5.1 to 5.5.2.
- [Changelog](https://github.com/adaltas/node-csv/blob/master/packages/csv-parse/CHANGELOG.md)
- [Commits](https://github.com/adaltas/node-csv/commits/csv-parse@5.5.2/packages/csv-parse)

---
updated-dependencies:
- dependency-name: csv-parse
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-09 23:00:46 +00:00
CrazyMax
3f7939e71c Merge pull request #182 from docker/dependabot/npm_and_yarn/actions/http-client-2.2.0
build(deps): bump @actions/http-client from 2.1.1 to 2.2.0
2023-10-09 01:56:18 -07:00
dependabot[bot]
584493d659 build(deps): bump @actions/http-client from 2.1.1 to 2.2.0
Bumps [@actions/http-client](https://github.com/actions/toolkit/tree/HEAD/packages/http-client) from 2.1.1 to 2.2.0.
- [Changelog](https://github.com/actions/toolkit/blob/main/packages/http-client/RELEASES.md)
- [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/http-client)

---
updated-dependencies:
- dependency-name: "@actions/http-client"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-06 22:59:35 +00:00
CrazyMax
dd4311c75e Merge pull request #181 from docker/dependabot/npm_and_yarn/csv-parse-5.5.1
build(deps): bump csv-parse from 5.5.0 to 5.5.1
2023-10-05 16:10:35 -07:00
dependabot[bot]
b91698741e build(deps): bump csv-parse from 5.5.0 to 5.5.1
Bumps [csv-parse](https://github.com/adaltas/node-csv/tree/HEAD/packages/csv-parse) from 5.5.0 to 5.5.1.
- [Changelog](https://github.com/adaltas/node-csv/blob/master/packages/csv-parse/CHANGELOG.md)
- [Commits](https://github.com/adaltas/node-csv/commits/csv-parse@5.5.1/packages/csv-parse)

---
updated-dependencies:
- dependency-name: csv-parse
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-05 22:09:57 +00:00
CrazyMax
36e5638636 Merge pull request #175 from docker/dependabot/npm_and_yarn/octokit/plugin-rest-endpoint-methods-10.0.0
Some checks failed
publish / publish (push) Has been cancelled
build(deps): bump @octokit/plugin-rest-endpoint-methods from 9.0.0 to 10.0.0
2023-10-05 11:29:46 -07:00
dependabot[bot]
d852953482 build(deps): bump @octokit/plugin-rest-endpoint-methods
Bumps [@octokit/plugin-rest-endpoint-methods](https://github.com/octokit/plugin-rest-endpoint-methods.js) from 9.0.0 to 10.0.0.
- [Release notes](https://github.com/octokit/plugin-rest-endpoint-methods.js/releases)
- [Commits](https://github.com/octokit/plugin-rest-endpoint-methods.js/compare/v9.0.0...v10.0.0)

---
updated-dependencies:
- dependency-name: "@octokit/plugin-rest-endpoint-methods"
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-05 18:27:12 +00:00
CrazyMax
9bb2a9fe23 Merge pull request #174 from docker/dependabot/npm_and_yarn/octokit/core-5.0.1
build(deps): bump @octokit/core from 5.0.0 to 5.0.1
2023-10-05 11:26:11 -07:00
CrazyMax
f4fdb6a9f8 Merge pull request #180 from crazy-max/fix-docker-arm64
docker(install): fix download for arm64 arch
2023-10-05 11:25:33 -07:00
CrazyMax
558d76d017 Merge pull request #179 from docker/bot/buildx-lab-releases-json
Update `.github/buildx-lab-releases.json`
2023-10-05 11:24:33 -07:00
CrazyMax
f3dd07df13 docker(install): fix download for arm64 arch
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-10-05 20:02:55 +02:00
crazy-max
0455460f6f github: update .github/buildx-lab-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-10-04 00:13:47 +00:00
CrazyMax
f5c9bb7acd Merge pull request #176 from elias-lundgren/fix-env-quoting
Remove quotes around env variable name in resolveBuildSecretEnv
2023-10-02 10:41:26 +02:00
CrazyMax
9d75f8f839 Merge pull request #177 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2023-10-02 10:33:08 +02:00
crazy-max
b86f723512 github: update .github/docker-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-09-28 00:20:28 +00:00
Elias Lundgren
d3d7271f87 fix: remove quotes around env variable name 2023-09-26 17:36:45 +02:00
dependabot[bot]
fddef161c1 build(deps): bump @octokit/core from 5.0.0 to 5.0.1
Bumps [@octokit/core](https://github.com/octokit/core.js) from 5.0.0 to 5.0.1.
- [Release notes](https://github.com/octokit/core.js/releases)
- [Commits](https://github.com/octokit/core.js/compare/v5.0.0...v5.0.1)

---
updated-dependencies:
- dependency-name: "@octokit/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-25 22:54:02 +00:00
CrazyMax
e75930a3a6 Merge pull request #173 from hoverkraft-tech/fix/handle-detached-ref
fix(git): handle properly detached HEAD ref
2023-09-23 14:28:38 +02:00
Emilien Escalle
bd5e1d1bab fix(git): handle properly detached HEAD ref 2023-09-19 18:35:04 +02:00
CrazyMax
354737b4fc Merge pull request #171 from docker/dependabot/github_actions/docker/setup-buildx-action-3
build(deps): bump docker/setup-buildx-action from 2 to 3
2023-09-13 08:29:51 +02:00
CrazyMax
eea8c07dcc Merge pull request #170 from docker/dependabot/github_actions/docker/bake-action-4
build(deps): bump docker/bake-action from 3 to 4
2023-09-13 08:29:39 +02:00
dependabot[bot]
f08154f2c4 build(deps): bump docker/setup-buildx-action from 2 to 3
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2 to 3.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v2...v3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-12 22:12:43 +00:00
dependabot[bot]
aae835e4b4 build(deps): bump docker/bake-action from 3 to 4
Bumps [docker/bake-action](https://github.com/docker/bake-action) from 3 to 4.
- [Release notes](https://github.com/docker/bake-action/releases)
- [Commits](https://github.com/docker/bake-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: docker/bake-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-12 22:12:39 +00:00
CrazyMax
6f9aedec5e Merge pull request #134 from docker/dependabot/npm_and_yarn/octokit/plugin-rest-endpoint-methods-9.0.0
build(deps): bump @octokit/plugin-rest-endpoint-methods from 7.2.3 to 9.0.0
2023-09-12 10:56:05 +02:00
CrazyMax
78cfd0384b chore: provide @octokit/core
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-09-12 10:51:20 +02:00
dependabot[bot]
d5f67f772e build(deps): bump @octokit/plugin-rest-endpoint-methods
Bumps [@octokit/plugin-rest-endpoint-methods](https://github.com/octokit/plugin-rest-endpoint-methods.js) from 7.2.3 to 9.0.0.
- [Release notes](https://github.com/octokit/plugin-rest-endpoint-methods.js/releases)
- [Commits](https://github.com/octokit/plugin-rest-endpoint-methods.js/compare/v7.2.3...v9.0.0)

---
updated-dependencies:
- dependency-name: "@octokit/plugin-rest-endpoint-methods"
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-12 07:38:39 +00:00
CrazyMax
cb4777c2a5 Merge pull request #169 from docker/dependabot/npm_and_yarn/actions/core-1.10.1
build(deps): bump @actions/core from 1.10.0 to 1.10.1
2023-09-12 08:26:37 +02:00
dependabot[bot]
80845a187b build(deps): bump @actions/core from 1.10.0 to 1.10.1
Bumps [@actions/core](https://github.com/actions/toolkit/tree/HEAD/packages/core) from 1.10.0 to 1.10.1.
- [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-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-11 22:19:30 +00:00
CrazyMax
66e22ce5a5 Merge pull request #167 from crazy-max/update-dev-deps
Some checks failed
publish / publish (push) Has been cancelled
chore: update dev dependencies
2023-09-07 10:10:08 +02:00
CrazyMax
7b63a1220d chore: update dev dependencies
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-09-07 10:05:35 +02:00
CrazyMax
59715cf565 Merge pull request #168 from crazy-max/update-yarn
chore: update yarn to 3.6.3
2023-09-07 09:51:32 +02:00
CrazyMax
e8cb844045 chore: update yarn to 3.6.3
$ yarn set version stable
$ yarn plugin import interactive-tools

Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-09-07 09:29:22 +02:00
Tõnis Tiigi
a00c49179b Merge pull request #164 from crazy-max/node20
Some checks failed
publish / publish (push) Has been cancelled
dev: update to node 20
2023-09-06 10:33:51 -07:00
CrazyMax
dc2c313f17 dev: update to node 20
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-09-06 16:26:01 +02:00
CrazyMax
c73f530a0e Merge pull request #161 from crazy-max/colima-error-logs
docker(install): print lima logs on "colima start" failure
2023-09-06 16:19:06 +02:00
CrazyMax
66fff011ac Merge pull request #165 from crazy-max/dev-update-docker-buildx
dev: update docker and buildx to latest
2023-09-06 16:09:05 +02:00
CrazyMax
c4085cc810 Merge pull request #166 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2023-09-06 09:05:38 +02:00
crazy-max
79d8877773 github: update .github/docker-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-09-06 00:19:54 +00:00
CrazyMax
95ac6338f1 dev: update docker and buildx to latest
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-09-05 12:36:02 +02:00
CrazyMax
7b72d5977b docker(install): print lima logs on "colima start" failure
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-09-05 12:34:47 +02:00
CrazyMax
2ad0e2331e Merge pull request #163 from docker/dependabot/github_actions/actions/checkout-4
build(deps): bump actions/checkout from 3 to 4
2023-09-05 11:36:12 +02:00
dependabot[bot]
f2d14e7769 build(deps): bump actions/checkout from 3 to 4
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-04 22:40:48 +00:00
CrazyMax
33dc7b6ecb Merge pull request #162 from docker/bot/buildx-lab-releases-json
Update `.github/buildx-lab-releases.json`
2023-08-31 12:03:22 +02:00
crazy-max
6bf3dcef73 github: update .github/buildx-lab-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-08-31 10:02:55 +00:00
CrazyMax
31d5e42cc0 Merge pull request #159 from crazy-max/docker-install-colima-args
Some checks failed
publish / publish (push) Has been cancelled
docker(install): allow passing colima start args
2023-08-28 08:06:42 +02:00
CrazyMax
32e2a6bf6f docker(install): allow passing colima start args
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-08-28 02:45:29 +02:00
CrazyMax
c8d666e020 Merge pull request #149 from docker/dependabot/npm_and_yarn/csv-parse-5.5.0
Some checks failed
publish / publish (push) Has been cancelled
build(deps): bump csv-parse from 5.4.0 to 5.5.0
2023-08-27 14:04:02 +02:00
CrazyMax
49ed594253 Merge pull request #156 from crazy-max/docker-install-daemon-config
docker(install): opt to set daemon config
2023-08-27 14:03:43 +02:00
CrazyMax
144df6eecc docker(install): opt to set daemon config
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-08-27 13:30:14 +02:00
CrazyMax
c3e31dcc03 Merge pull request #155 from crazy-max/alt-buildx-releases
Some checks failed
publish / publish (push) Has been cancelled
buildx: alternative release repos to download buildx
2023-08-26 12:38:54 +02:00
CrazyMax
0f8ae202d6 buildx: alternative release repos to download buildx
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-08-26 12:33:51 +02:00
CrazyMax
c674e727ec Merge pull request #154 from crazy-max/docker-install-stop
docker(install): stop docker daemon gracefully on linux
2023-08-26 12:20:53 +02:00
CrazyMax
a72977ca69 docker(install): stop docker daemon gracefully on linux
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-08-26 12:15:49 +02:00
CrazyMax
a6558f6584 docker(install): enable debug for linux
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-08-26 12:07:23 +02:00
CrazyMax
6a8f167e10 Merge pull request #153 from crazy-max/docker-install-linux-log
Some checks failed
publish / publish (push) Has been cancelled
docker(install): increase number of retries and log them
2023-08-26 11:30:02 +02:00
CrazyMax
19f5e39cc1 docker(install): increase number of retries and log them
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-08-26 11:24:43 +02:00
CrazyMax
945af30d0c Merge pull request #152 from crazy-max/docker-install-colima-log
docker(install): SIGN_QEMU_BINARY env as workaround to replace existing signature
2023-08-26 11:17:58 +02:00
CrazyMax
24a56dbe42 docker(install): SIGN_QEMU_BINARY env as workaround to replace existing signature
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-08-26 11:12:52 +02:00
CrazyMax
4e8d894523 docker(install): print ha.stderr.log on failure
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-08-26 11:12:52 +02:00
CrazyMax
5b15c952e9 Merge pull request #151 from docker/bot/buildx-lab-releases-json
Update `.github/buildx-lab-releases.json`
2023-08-26 08:39:41 +02:00
crazy-max
9822f1ac09 github: update .github/buildx-lab-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-08-26 06:39:17 +00:00
CrazyMax
b9121242ac Merge pull request #150 from crazy-max/ci-buildx-lab-releases-json
ci: generate buildx-lab-releases.json
2023-08-26 08:38:48 +02:00
CrazyMax
c759388ee4 ci: generate buildx-lab-releases.json
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-08-26 08:19:06 +02:00
dependabot[bot]
dfcd13e51e build(deps): bump csv-parse from 5.4.0 to 5.5.0
Bumps [csv-parse](https://github.com/adaltas/node-csv/tree/HEAD/packages/csv-parse) from 5.4.0 to 5.5.0.
- [Changelog](https://github.com/adaltas/node-csv/blob/master/packages/csv-parse/CHANGELOG.md)
- [Commits](https://github.com/adaltas/node-csv/commits/csv-parse@5.5.0/packages/csv-parse)

---
updated-dependencies:
- dependency-name: csv-parse
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-25 22:19:29 +00:00
CrazyMax
2be3d9389c Merge pull request #147 from crazy-max/docker-install-backoff
docker(install): increase number of retries
2023-08-18 11:36:20 +02:00
CrazyMax
541f8784ed docker(install): increase number of retries
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-08-18 11:32:07 +02:00
CrazyMax
4abccc4c6a test: docker install 24.0.5
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-08-18 11:32:06 +02:00
CrazyMax
fcc92b092b Merge pull request #146 from crazy-max/bump-actions-io
Some checks failed
publish / publish (push) Has been cancelled
build(deps): bump @actions/io from 1.1.2 to 1.1.3
2023-08-11 15:03:09 +02:00
CrazyMax
6e043aee71 build(deps): bump @actions/io from 1.1.2 to 1.1.3
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-08-11 13:55:04 +02:00
CrazyMax
7a37a260aa Merge pull request #143 from docker/dependabot/npm_and_yarn/actions/http-client-2.1.1
build(deps): bump @actions/http-client from 2.1.0 to 2.1.1
2023-08-08 09:54:31 +02:00
dependabot[bot]
1534dfad1b build(deps): bump @actions/http-client from 2.1.0 to 2.1.1
Bumps [@actions/http-client](https://github.com/actions/toolkit/tree/HEAD/packages/http-client) from 2.1.0 to 2.1.1.
- [Changelog](https://github.com/actions/toolkit/blob/main/packages/http-client/RELEASES.md)
- [Commits](https://github.com/actions/toolkit/commits/@actions/http-client@2.1.1/packages/http-client)

---
updated-dependencies:
- dependency-name: "@actions/http-client"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-08 07:43:54 +00:00
CrazyMax
08e669e7d5 Merge pull request #144 from docker/dependabot/npm_and_yarn/actions/cache-3.2.2
build(deps): bump @actions/cache from 3.2.1 to 3.2.2
2023-08-08 09:43:07 +02:00
dependabot[bot]
83d366eb65 build(deps): bump @actions/cache from 3.2.1 to 3.2.2
Bumps [@actions/cache](https://github.com/actions/toolkit/tree/HEAD/packages/cache) from 3.2.1 to 3.2.2.
- [Changelog](https://github.com/actions/toolkit/blob/main/packages/cache/RELEASES.md)
- [Commits](https://github.com/actions/toolkit/commits/@actions/cache@3.2.2/packages/cache)

---
updated-dependencies:
- dependency-name: "@actions/cache"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-08 07:38:56 +00:00
CrazyMax
5b760c8b3a Merge pull request #145 from crazy-max/update-dependabot
chore: set increase as versioning strategy
2023-08-08 09:00:08 +02:00
CrazyMax
674ee4994a chore: set increase as versioning strategy
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-08-08 05:52:54 +02:00
CrazyMax
a56ca8f880 Merge pull request #142 from docker/dependabot/npm_and_yarn/handlebars-4.7.8
build(deps): bump handlebars from 4.7.7 to 4.7.8
2023-08-02 22:08:43 +02:00
CrazyMax
b833243795 bump handlebars to 4.7.8 in package.json
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-08-02 22:03:10 +02:00
dependabot[bot]
823d1cfce9 build(deps): bump handlebars from 4.7.7 to 4.7.8
Bumps [handlebars](https://github.com/handlebars-lang/handlebars.js) from 4.7.7 to 4.7.8.
- [Release notes](https://github.com/handlebars-lang/handlebars.js/releases)
- [Changelog](https://github.com/handlebars-lang/handlebars.js/blob/v4.7.8/release-notes.md)
- [Commits](https://github.com/handlebars-lang/handlebars.js/compare/v4.7.7...v4.7.8)

---
updated-dependencies:
- dependency-name: handlebars
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-01 23:08:08 +00:00
CrazyMax
97bc88d30b Merge pull request #140 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2023-07-28 16:31:15 +02:00
CrazyMax
ed4441e704 Merge pull request #139 from docker/dependabot/npm_and_yarn/word-wrap-1.2.5
build(deps): bump word-wrap from 1.2.3 to 1.2.5
2023-07-28 16:30:53 +02:00
crazy-max
7a4b2122b2 github: update .github/docker-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-07-25 00:25:29 +00:00
dependabot[bot]
959fb2fd2e build(deps): bump word-wrap from 1.2.3 to 1.2.5
Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.5.
- [Release notes](https://github.com/jonschlinkert/word-wrap/releases)
- [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.5)

---
updated-dependencies:
- dependency-name: word-wrap
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-23 21:28:12 +00:00
CrazyMax
2c0d9d0c4e Merge pull request #137 from docker/bot/buildx-releases-json
Update `.github/buildx-releases.json`
2023-07-20 02:06:23 +02:00
crazy-max
3199bce461 github: update .github/buildx-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-07-19 00:28:09 +00:00
CrazyMax
f1593e3aa2 Merge pull request #135 from crazy-max/fix-buildx-install-platform
Some checks failed
publish / publish (push) Has been cancelled
buildx: build for local platform
2023-07-12 14:23:45 +02:00
CrazyMax
db5c712dec buildx: build for local platform
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-07-12 14:15:26 +02:00
CrazyMax
fd97af130e Merge pull request #132 from docker/dependabot/npm_and_yarn/semver-7.5.4
build(deps): bump semver from 7.5.3 to 7.5.4
2023-07-12 14:05:14 +02:00
CrazyMax
ec700a3813 bump semver to 7.5.4 in package.json
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-07-10 16:02:16 +02:00
CrazyMax
324e807d2e Merge pull request #133 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2023-07-10 11:58:44 +02:00
crazy-max
8e45354f0c github: update .github/docker-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-07-08 00:25:11 +00:00
dependabot[bot]
906aacf7ff build(deps): bump semver from 7.5.3 to 7.5.4
Bumps [semver](https://github.com/npm/node-semver) from 7.5.3 to 7.5.4.
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v7.5.3...v7.5.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-07 22:25:49 +00:00
CrazyMax
1d9f94872d Merge pull request #130 from docker/bot/docker-releases-json
Some checks failed
publish / publish (push) Has been cancelled
Update `.github/docker-releases.json`
2023-07-06 21:07:22 +02:00
crazy-max
b99f9ec3ef github: update .github/docker-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-07-06 19:06:55 +00:00
CrazyMax
8d02bad9a9 Merge pull request #129 from crazy-max/buildx-bin-cache
buildx: cache binary to hosted tool cache and GHA cache backend
2023-07-06 21:06:29 +02:00
CrazyMax
c1edd0b5e3 buildx: improve vspec fingerprint for caching
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-07-06 16:16:12 +02:00
CrazyMax
70c0e12f74 util: trimPrefix and trimSuffix methods
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-07-06 16:15:15 +02:00
CrazyMax
ddcd63c92a buildx: cache binary to hosted tool cache and GHA cache backend
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-07-06 16:15:15 +02:00
CrazyMax
0e5fc3661a Merge pull request #128 from docker/bot/buildx-releases-json
Update `.github/buildx-releases.json`
2023-07-06 09:34:29 +02:00
crazy-max
3d49d98580 github: update .github/buildx-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-07-06 00:01:26 +00:00
CrazyMax
ca519e1aa8 Merge pull request #122 from crazy-max/buildx-inspect-fup
Some checks failed
publish / publish (push) Has been cancelled
buildx: handle new fields when parsing inspect output
2023-06-28 16:21:14 +02:00
CrazyMax
b13ef76b5e Merge pull request #126 from docker/dependabot/npm_and_yarn/semver-7.5.3
build(deps): bump semver from 7.5.2 to 7.5.3
2023-06-26 20:11:15 +02:00
CrazyMax
2043356c92 bump semver to 7.5.3 in package.json
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-06-26 15:19:34 +02:00
dependabot[bot]
84371bb189 build(deps): bump semver from 7.5.2 to 7.5.3
Bumps [semver](https://github.com/npm/node-semver) from 7.5.2 to 7.5.3.
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v7.5.2...v7.5.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-26 13:13:11 +00:00
CrazyMax
ad6e71b881 Merge pull request #123 from docker/dependabot/npm_and_yarn/semver-7.5.2
build(deps): bump semver from 7.5.1 to 7.5.2
2023-06-26 15:09:58 +02:00
CrazyMax
e47142d45b bump semver to 7.5.2 in package.json
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-06-21 01:39:15 +02:00
CrazyMax
e79f79bcd9 Merge pull request #121 from docker/dependabot/npm_and_yarn/octokit/plugin-rest-endpoint-methods-7.2.3
build(deps): bump @octokit/plugin-rest-endpoint-methods from 7.2.1 to 7.2.3
2023-06-21 01:37:47 +02:00
CrazyMax
ab02f62089 buildx: handle new fields for inspect output
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-06-16 22:28:21 +02:00
dependabot[bot]
8cef70fefb build(deps): bump semver from 7.5.1 to 7.5.2
Bumps [semver](https://github.com/npm/node-semver) from 7.5.1 to 7.5.2.
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v7.5.1...v7.5.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-15 23:04:28 +00:00
CrazyMax
321a028303 update package.json
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-06-15 16:25:58 +02:00
CrazyMax
80eaf0972b Merge pull request #119 from docker/bot/buildx-releases-json
Update `.github/buildx-releases.json`
2023-06-15 16:24:15 +02:00
CrazyMax
101a44b0a7 Merge pull request #120 from docker/dependabot/github_actions/peter-evans/create-pull-request-5.0.2
build(deps): bump peter-evans/create-pull-request from 5.0.1 to 5.0.2
2023-06-15 16:23:57 +02:00
dependabot[bot]
22cc0b6c27 build(deps): bump @octokit/plugin-rest-endpoint-methods
Bumps [@octokit/plugin-rest-endpoint-methods](https://github.com/octokit/plugin-rest-endpoint-methods.js) from 7.2.1 to 7.2.3.
- [Release notes](https://github.com/octokit/plugin-rest-endpoint-methods.js/releases)
- [Commits](https://github.com/octokit/plugin-rest-endpoint-methods.js/compare/v7.2.1...v7.2.3)

---
updated-dependencies:
- dependency-name: "@octokit/plugin-rest-endpoint-methods"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-14 23:05:16 +00:00
dependabot[bot]
21fdfc52c4 build(deps): bump peter-evans/create-pull-request from 5.0.1 to 5.0.2
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 5.0.1 to 5.0.2.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](284f54f989...153407881e)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-14 23:02:24 +00:00
crazy-max
eebb677d5a github: update .github/buildx-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-06-14 00:15:48 +00:00
CrazyMax
495c96b050 Merge pull request #115 from crazy-max/input-comment-opt
Some checks failed
publish / publish (push) Has been cancelled
util: comment opt for getInputList
2023-06-13 10:31:11 +02:00
CrazyMax
b1e0aeed50 Merge pull request #114 from crazy-max/docker-config
docker: configFile method
2023-06-12 19:32:33 +02:00
CrazyMax
d0ee813215 Merge pull request #118 from crazy-max/git-remoteSha-token
git: use GitHub API for remoteSha if token provided
2023-06-12 19:30:14 +02:00
CrazyMax
b2a51dd6b4 git: use GitHub API for remoteSha if token provided
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-06-12 19:20:42 +02:00
CrazyMax
acd3c9df19 Merge pull request #116 from crazy-max/buildx-install-private
Some checks failed
publish / publish (push) Has been cancelled
buildx: install from private repo support
2023-06-10 01:59:18 +02:00
CrazyMax
8ad595b445 buildx: install from private repo support
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-06-09 17:56:36 +02:00
CrazyMax
9450a454a7 util: comment opt for getInputList
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-06-09 14:11:57 +02:00
CrazyMax
a7221012c8 docker: configFile method
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-06-09 00:02:06 +02:00
CrazyMax
6fc5565c73 Merge pull request #113 from docker/bot/buildx-releases-json
Update `.github/buildx-releases.json`
2023-06-08 15:22:37 +02:00
crazy-max
7492c7193a github: update .github/buildx-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-06-08 00:17:11 +00:00
CrazyMax
f05a598a08 Merge pull request #112 from crazy-max/fix-git-ref
Some checks failed
publish / publish (push) Has been cancelled
git: fall back to git tag in detached HEAD state
2023-06-07 15:17:00 +02:00
CrazyMax
fc85cef9e1 git: fall back to git tag in detached HEAD state
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-06-07 14:57:37 +02:00
CrazyMax
a5b683b46e Merge pull request #111 from crazy-max/fix-buildx-build-err
buildx(install): throw error on failed build
2023-06-07 14:54:24 +02:00
CrazyMax
0b166c63ef Merge pull request #110 from vinicius73/feature/add-support-to-secret-env
Add support to secret env
2023-06-06 14:18:01 +02:00
CrazyMax
e072607266 buildx(install): throw error on failed build
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-06-05 10:19:30 +02:00
Vinicius Reis
a1ffbe9606 Add support to secret env 2023-06-01 10:19:50 -03:00
CrazyMax
fdd740da2d Merge pull request #108 from docker/dependabot/npm_and_yarn/csv-parse-5.4.0
build(deps): bump csv-parse from 5.3.10 to 5.4.0
2023-05-30 13:23:43 +02:00
CrazyMax
8a9577d5e2 bump csv-parse to 5.4.0 in package.json
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-05-28 22:19:41 +02:00
CrazyMax
ca7a29d2d7 Merge pull request #107 from docker/bot/buildx-releases-json
Update `.github/buildx-releases.json`
2023-05-28 22:16:52 +02:00
CrazyMax
d39585b339 Merge pull request #106 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2023-05-28 22:16:36 +02:00
dependabot[bot]
2e3ba6678f build(deps): bump csv-parse from 5.3.10 to 5.4.0
Bumps [csv-parse](https://github.com/adaltas/node-csv/tree/HEAD/packages/csv-parse) from 5.3.10 to 5.4.0.
- [Changelog](https://github.com/adaltas/node-csv/blob/master/packages/csv-parse/CHANGELOG.md)
- [Commits](https://github.com/adaltas/node-csv/commits/csv-parse@5.4.0/packages/csv-parse)

---
updated-dependencies:
- dependency-name: csv-parse
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-26 23:03:33 +00:00
crazy-max
337a7240a5 github: update .github/docker-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-05-26 12:07:18 +00:00
crazy-max
728fcdbea9 github: update .github/buildx-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-05-23 00:15:40 +00:00
CrazyMax
dfa1a320c4 Merge pull request #104 from docker/dependabot/npm_and_yarn/semver-7.5.1
build(deps): bump semver from 7.5.0 to 7.5.1
2023-05-17 15:17:31 +02:00
CrazyMax
4ff86b974f bump @types/semver to 7.5.0 in package.json
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-05-17 14:13:50 +02:00
CrazyMax
181782ba21 bump semver to 7.5.1 in package.json
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-05-17 14:12:43 +02:00
CrazyMax
dd977d3597 Merge pull request #105 from docker/bot/buildx-releases-json
Update `.github/buildx-releases.json`
2023-05-17 14:10:53 +02:00
CrazyMax
776422c908 Merge pull request #103 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2023-05-17 14:10:36 +02:00
crazy-max
d86a125551 github: update .github/docker-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-05-17 00:24:07 +00:00
crazy-max
633f41191f github: update .github/buildx-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-05-13 00:14:08 +00:00
dependabot[bot]
79def6b218 build(deps): bump semver from 7.5.0 to 7.5.1
Bumps [semver](https://github.com/npm/node-semver) from 7.5.0 to 7.5.1.
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v7.5.0...v7.5.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-12 23:05:26 +00:00
CrazyMax
31e5d12fd9 Merge pull request #101 from docker/dependabot/github_actions/peter-evans/create-pull-request-5.0.1
build(deps): bump peter-evans/create-pull-request from 5.0.0 to 5.0.1
2023-05-08 14:53:09 +02:00
CrazyMax
1eda4b6a6c Merge pull request #102 from docker/dependabot/npm_and_yarn/csv-parse-5.3.10
build(deps): bump csv-parse from 5.3.8 to 5.3.10
2023-05-08 14:52:54 +02:00
CrazyMax
c71f3fe1ba Merge pull request #99 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2023-05-08 14:52:25 +02:00
crazy-max
8c8294806e github: update .github/docker-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-05-08 12:07:20 +00:00
dependabot[bot]
ec382328c4 build(deps): bump csv-parse from 5.3.8 to 5.3.10
Bumps [csv-parse](https://github.com/adaltas/node-csv/tree/HEAD/packages/csv-parse) from 5.3.8 to 5.3.10.
- [Changelog](https://github.com/adaltas/node-csv/blob/master/packages/csv-parse/CHANGELOG.md)
- [Commits](https://github.com/adaltas/node-csv/commits/csv-parse@5.3.10/packages/csv-parse)

---
updated-dependencies:
- dependency-name: csv-parse
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-04 23:04:20 +00:00
dependabot[bot]
051c91700a build(deps): bump peter-evans/create-pull-request from 5.0.0 to 5.0.1
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 5.0.0 to 5.0.1.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](5b4a9f6a9e...284f54f989)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-02 23:01:40 +00:00
CrazyMax
471068fc6f Merge pull request #97 from docker/dependabot/github_actions/docker/bake-action-3
build(deps): bump docker/bake-action from 2 to 3
2023-04-19 11:06:35 +02:00
dependabot[bot]
60feaf2f84 build(deps): bump docker/bake-action from 2 to 3
Bumps [docker/bake-action](https://github.com/docker/bake-action) from 2 to 3.
- [Release notes](https://github.com/docker/bake-action/releases)
- [Commits](https://github.com/docker/bake-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: docker/bake-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-18 23:02:30 +00:00
CrazyMax
ec33a95de8 Merge pull request #92 from docker/dependabot/npm_and_yarn/csv-parse-5.3.8
Some checks failed
publish / publish (push) Has been cancelled
build(deps): bump csv-parse from 5.3.6 to 5.3.8
2023-04-18 17:26:04 +02:00
CrazyMax
b45f7f151f fix package.json
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-04-18 17:15:03 +02:00
dependabot[bot]
0ad6a34d2a build(deps): bump csv-parse from 5.3.6 to 5.3.8
Bumps [csv-parse](https://github.com/adaltas/node-csv/tree/HEAD/packages/csv-parse) from 5.3.6 to 5.3.8.
- [Release notes](https://github.com/adaltas/node-csv/releases)
- [Changelog](https://github.com/adaltas/node-csv/blob/master/packages/csv-parse/CHANGELOG.md)
- [Commits](https://github.com/adaltas/node-csv/commits/csv-parse@5.3.8/packages/csv-parse)

---
updated-dependencies:
- dependency-name: csv-parse
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-18 15:11:26 +00:00
CrazyMax
4445b1e4fc Merge pull request #93 from docker/dependabot/npm_and_yarn/semver-7.5.0
build(deps): bump semver from 7.4.0 to 7.5.0
2023-04-18 17:07:18 +02:00
CrazyMax
9cca84f1d8 fix package.json
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-04-18 16:54:10 +02:00
CrazyMax
cf39a26d01 Merge pull request #94 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2023-04-18 16:52:29 +02:00
CrazyMax
3ebf172e37 Merge pull request #95 from crazy-max/fix-bake-def-parse
bake: missing overrides when parsing definition
2023-04-18 16:52:12 +02:00
CrazyMax
dba2a69f61 bake: missing overrides when parsing definition
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-04-18 14:16:46 +02:00
crazy-max
dd07d9ea06 github: update .github/docker-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-04-18 00:20:32 +00:00
dependabot[bot]
0af70ae7cf build(deps): bump semver from 7.4.0 to 7.5.0
Bumps [semver](https://github.com/npm/node-semver) from 7.4.0 to 7.5.0.
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v7.4.0...v7.5.0)

---
updated-dependencies:
- dependency-name: semver
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-17 23:08:59 +00:00
CrazyMax
0f6ebcb798 Merge pull request #91 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2023-04-16 09:12:43 +02:00
crazy-max
3f543accc6 github: update .github/docker-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-04-15 00:22:48 +00:00
CrazyMax
16bbae82de Merge pull request #88 from docker/dependabot/github_actions/peter-evans/create-pull-request-5.0.0
Some checks failed
publish / publish (push) Has been cancelled
build(deps): bump peter-evans/create-pull-request from 4.2.4 to 5.0.0
2023-04-11 09:34:34 +02:00
CrazyMax
8b597ca8bc Merge pull request #90 from docker/dependabot/npm_and_yarn/semver-7.4.0
build(deps): bump semver from 7.3.8 to 7.4.0
2023-04-11 07:57:08 +02:00
CrazyMax
dc9c9bc2b7 bump semver in package.json
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-04-11 07:09:05 +02:00
dependabot[bot]
63659873d5 build(deps): bump semver from 7.3.8 to 7.4.0
Bumps [semver](https://github.com/npm/node-semver) from 7.3.8 to 7.4.0.
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v7.3.8...v7.4.0)

---
updated-dependencies:
- dependency-name: semver
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-10 23:07:39 +00:00
CrazyMax
6327a9b5dc Merge pull request #89 from crazy-max/ci-virtual-env
ci: fix virtual env workflow
2023-04-08 21:32:17 +02:00
CrazyMax
50b16df20c ci: fix virtual env workflow
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-04-08 07:38:09 +02:00
dependabot[bot]
0b1e18cfc2 build(deps): bump peter-evans/create-pull-request from 4.2.4 to 5.0.0
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 4.2.4 to 5.0.0.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](38e0b6e68b...5b4a9f6a9e)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-05 23:02:30 +00:00
CrazyMax
741d2e1319 Merge pull request #87 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2023-04-05 15:32:42 +02:00
crazy-max
9e10ac6818 github: update .github/docker-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-04-05 12:08:18 +00:00
CrazyMax
65f12dcfd0 Merge pull request #86 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2023-04-01 02:32:06 +02:00
crazy-max
46da20f01d github: update .github/docker-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-04-01 00:22:44 +00:00
CrazyMax
0af3fda4f0 Merge pull request #85 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2023-03-29 02:31:03 +02:00
crazy-max
6179a5a445 github: update .github/docker-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-03-29 00:24:54 +00:00
CrazyMax
26d9901f07 Merge pull request #84 from crazy-max/bake-toolkit
Some checks failed
publish / publish (push) Has been cancelled
toolkit: add bake
2023-03-28 08:56:30 +02:00
CrazyMax
462c95e83d toolkit: add bake
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-28 08:51:43 +02:00
CrazyMax
e185293749 Merge pull request #83 from crazy-max/bake-empty-source
bake: check for empty source
2023-03-28 08:50:32 +02:00
CrazyMax
2d1ce9a223 bake: check for empty source
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-27 17:52:54 +02:00
CrazyMax
2d105f7337 Merge pull request #82 from crazy-max/update-dev
Some checks failed
publish / publish (push) Has been cancelled
chore: update dev dependencies
2023-03-26 21:31:01 +02:00
CrazyMax
5df47fe964 chore: update dev dependencies
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-26 21:16:09 +02:00
CrazyMax
61527248dd Merge pull request #77 from crazy-max/fix-tc-cache
buildx: set consistent platform when caching binary
2023-03-26 20:43:07 +02:00
CrazyMax
210b7421e4 Merge pull request #81 from crazy-max/bake-workdir
bake: workdir support for parsing definitions
2023-03-26 20:14:00 +02:00
CrazyMax
e9aa8365e3 bake: workdir support for parsing definitions
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-26 19:42:37 +02:00
CrazyMax
85557d0e0d Merge pull request #80 from crazy-max/fix-bake-def
bake: fix undefined output property
2023-03-26 19:36:31 +02:00
CrazyMax
a7448298e0 bake: fix undefined output property
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-26 19:26:59 +02:00
CrazyMax
d0929eeb16 Merge pull request #79 from crazy-max/itg
chore: rename e2e to itg tests
2023-03-26 19:12:40 +02:00
CrazyMax
da9600bbef docker: retries for install integration tests
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-26 19:03:34 +02:00
CrazyMax
70fba4e078 ci: concurrency check
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-26 19:03:34 +02:00
CrazyMax
a89868cdc5 ci: move validate to a dedicated workflow
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-26 19:03:34 +02:00
CrazyMax
49bde5a54a chore: rename e2e to itg tests
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-26 19:03:18 +02:00
CrazyMax
4fcbf75fc4 Merge pull request #78 from crazy-max/bake-remote-def
bake: support remote definition when parsing
2023-03-26 19:02:57 +02:00
CrazyMax
314f8f431e bake: support remote definition when parsing
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-25 17:06:09 +01:00
CrazyMax
7fb0476dc8 util: isValidRef method
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-25 16:01:24 +01:00
CrazyMax
9b9ff70b75 util: fix isValidURL
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-25 16:01:10 +01:00
CrazyMax
e7eee6e401 buildx: set consistent platform when caching binary
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-25 13:58:21 +01:00
CrazyMax
b2fd32e0ef Merge pull request #74 from docker/dependabot/npm_and_yarn/actions/io-1.1.3
build(deps): bump @actions/io from 1.1.2 to 1.1.3
2023-03-25 13:45:29 +01:00
CrazyMax
417136db1e Merge pull request #73 from docker/dependabot/github_actions/peter-evans/create-pull-request-4.2.4
build(deps): bump peter-evans/create-pull-request from 4.2.3 to 4.2.4
2023-03-16 10:07:40 +00:00
dependabot[bot]
e033e82024 build(deps): bump @actions/io from 1.1.2 to 1.1.3
Bumps [@actions/io](https://github.com/actions/toolkit/tree/HEAD/packages/io) from 1.1.2 to 1.1.3.
- [Release notes](https://github.com/actions/toolkit/releases)
- [Changelog](https://github.com/actions/toolkit/blob/main/packages/io/RELEASES.md)
- [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/io)

---
updated-dependencies:
- dependency-name: "@actions/io"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-15 23:07:27 +00:00
dependabot[bot]
b3328f5ec4 build(deps): bump peter-evans/create-pull-request from 4.2.3 to 4.2.4
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 4.2.3 to 4.2.4.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](2b011faafd...38e0b6e68b)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-15 23:04:20 +00:00
CrazyMax
b0518231d0 Merge pull request #72 from crazy-max/bump-csv-parse
Some checks failed
publish / publish (push) Has been cancelled
build(deps): bump csv-parse from 5.3.5 to 5.3.6
2023-03-13 09:55:51 +00:00
CrazyMax
c0da63f810 build(deps): bump csv-parse from 5.3.5 to 5.3.6
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-13 10:51:00 +01:00
CrazyMax
041d9693ab Merge pull request #71 from crazy-max/bake
bake class to parse definitions and handle exporters type
2023-03-13 09:49:01 +00:00
CrazyMax
39158d8047 bake class to parse definitions and handle exporters type
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-13 10:44:48 +01:00
CrazyMax
a6c94b5167 Merge pull request #70 from crazy-max/static-inputs
buildx: make inputs methods static
2023-03-13 09:42:37 +00:00
CrazyMax
a5943234fd Merge pull request #69 from crazy-max/bump-releases-json
Bump releases-json action to 6dc3187
2023-03-13 08:54:48 +00:00
CrazyMax
03977693c1 buildx: make inputs methods static
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-12 23:40:54 +01:00
CrazyMax
d6d770f303 Bump releases-json action to 6dc3187
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-12 13:13:02 +01:00
CrazyMax
8df8cee02f Merge pull request #68 from crazy-max/fix-driver-opts-parsing
Some checks failed
publish / publish (push) Has been cancelled
builder: fix regex to parse driver-opts
2023-03-11 16:47:42 +00:00
CrazyMax
94febd1da7 builder: fix regex to parse driver-opts
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-11 16:48:56 +01:00
CrazyMax
b7cdc617ce Merge pull request #65 from docker/dependabot/npm_and_yarn/csv-parse-5.3.6
build(deps): bump csv-parse from 5.3.5 to 5.3.6
2023-03-08 18:16:10 +00:00
CrazyMax
75c0c7fac0 Merge pull request #66 from docker/dependabot/npm_and_yarn/actions/http-client-2.1.0
build(deps): bump @actions/http-client from 2.0.1 to 2.1.0
2023-03-08 18:15:51 +00:00
CrazyMax
e9cfd63e16 Merge pull request #67 from docker/bot/buildx-releases-json
Some checks failed
publish / publish (push) Has been cancelled
Update `.github/buildx-releases.json`
2023-03-07 10:07:18 +01:00
crazy-max
ac61bd8949 github: update .github/buildx-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-03-07 00:18:02 +00:00
dependabot[bot]
7b50104faa build(deps): bump @actions/http-client from 2.0.1 to 2.1.0
Bumps [@actions/http-client](https://github.com/actions/toolkit/tree/HEAD/packages/http-client) from 2.0.1 to 2.1.0.
- [Release notes](https://github.com/actions/toolkit/releases)
- [Changelog](https://github.com/actions/toolkit/blob/main/packages/http-client/RELEASES.md)
- [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/http-client)

---
updated-dependencies:
- dependency-name: "@actions/http-client"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-06 23:20:20 +00:00
dependabot[bot]
d7735e9ddf build(deps): bump csv-parse from 5.3.5 to 5.3.6
Bumps [csv-parse](https://github.com/adaltas/node-csv/tree/HEAD/packages/csv-parse) from 5.3.5 to 5.3.6.
- [Release notes](https://github.com/adaltas/node-csv/releases)
- [Changelog](https://github.com/adaltas/node-csv/blob/master/packages/csv-parse/CHANGELOG.md)
- [Commits](https://github.com/adaltas/node-csv/commits/csv-parse@5.3.6/packages/csv-parse)

---
updated-dependencies:
- dependency-name: csv-parse
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-06 23:18:48 +00:00
CrazyMax
dd1544e1be Merge pull request #64 from crazy-max/builder-exists
builder: exists method
2023-03-03 15:24:01 +01:00
CrazyMax
32af66cb28 builder: exists method
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-03 14:49:22 +01:00
CrazyMax
2090433c0d Merge pull request #63 from crazy-max/docker-latest
docker: support latest on install
2023-03-03 14:15:40 +01:00
CrazyMax
50c11e6dce docker: support latest on install
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-03 14:07:27 +01:00
CrazyMax
0f9cc7c29f Merge pull request #62 from crazy-max/docker-custom-context
docker: allow custom context name on install
2023-03-03 14:00:23 +01:00
CrazyMax
dfc72fd31c docker: allow custom context name on install
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-03 10:40:00 +01:00
CrazyMax
317ef51ab5 Merge pull request #60 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2023-03-03 10:37:21 +01:00
crazy-max
3a30337d24 github: update .github/docker-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-03-03 09:36:41 +00:00
CrazyMax
fc16ecda91 Merge pull request #59 from crazy-max/docker-releases
ci: generate docker-releases.json
2023-03-03 10:36:10 +01:00
CrazyMax
48cefc1da0 ci: generate docker-releases.json
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-02 19:16:57 +01:00
CrazyMax
fda3be9699 Merge pull request #58 from crazy-max/docker-install
Some checks failed
publish / publish (push) Has been cancelled
docker: install, download and tearDown methods
2023-03-02 15:58:16 +01:00
CrazyMax
53ca96fcc4 Merge pull request #55 from crazy-max/git-context
git: alternative github context and additional methods
2023-03-02 15:50:12 +01:00
CrazyMax
70390c899b docker: tearDown method
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-02 15:39:26 +01:00
CrazyMax
ac9d9d9a1b docker: detach dockerd for linux install
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-02 15:39:26 +01:00
CrazyMax
3c2fe5ddb2 docker: move assets to ts
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-02 15:39:26 +01:00
CrazyMax
adad1e3786 ci: build workflow
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-02 15:39:25 +01:00
CrazyMax
3a0f4db686 fix license headers
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-02 15:39:25 +01:00
CrazyMax
2201fc1194 e2e: coverage reports
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-02 15:39:25 +01:00
CrazyMax
6210eb507a docker: print logs from windows service after install
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-02 15:39:25 +01:00
CrazyMax
3b532d1b91 docker: install with custom runDir
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-02 15:39:25 +01:00
CrazyMax
93fa96f54f docker: install for linux
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-02 15:39:24 +01:00
CrazyMax
3ec6f00f46 docker: custom colima cfg on install
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-02 15:39:24 +01:00
CrazyMax
4d66b2fa08 docker: install and download methods for macos and windows
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-02 15:39:24 +01:00
CrazyMax
964381b7e9 move docker under dedicated folder
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-03-02 15:39:24 +01:00
CrazyMax
f78f708678 Merge pull request #57 from crazy-max/fix-docker-context
Some checks failed
publish / publish (push) Has been cancelled
docker: fix context command
2023-02-25 17:50:03 +01:00
CrazyMax
6fe7d54029 docker: fix context command
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-25 16:40:35 +01:00
CrazyMax
8a69d6cb01 git: alternative github context and additional methods
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-25 12:37:09 +01:00
CrazyMax
1cc5fc87fb Merge pull request #56 from crazy-max/docker-context
Some checks failed
publish / publish (push) Has been cancelled
docker: context method
2023-02-25 12:24:04 +01:00
CrazyMax
97e647fdd0 docker: context method
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-25 12:20:06 +01:00
CrazyMax
e08fc168a1 Merge pull request #54 from crazy-max/fix-node
builder: fix breaking change on node fields
2023-02-25 12:06:41 +01:00
CrazyMax
9128f56258 builder: fix breaking change on node fields
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-24 19:41:10 +01:00
CrazyMax
2e59ae7030 Merge pull request #53 from crazy-max/docker-io
Some checks failed
publish / publish (push) Has been cancelled
docker: check command using actions/io module
2023-02-21 08:46:20 +01:00
CrazyMax
99487d6986 docker: check command using actions/io module
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-21 08:40:27 +01:00
CrazyMax
3d9ec9f02d Merge pull request #52 from crazy-max/index
run function to handle GitHub Action main and post runs
2023-02-21 08:21:59 +01:00
CrazyMax
f2b1224b00 run function to handle GitHub Action main and post runs
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-21 08:18:56 +01:00
CrazyMax
1383a2bcaf Merge pull request #51 from crazy-max/fix-docker-exporter
Some checks failed
publish / publish (push) Has been cancelled
buildx: fix docker exporter check
2023-02-20 10:28:01 +01:00
CrazyMax
1acd6c2fc0 buildx: fix docker exporter check
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-20 10:25:50 +01:00
CrazyMax
d153cfaf3c Merge pull request #50 from crazy-max/github-throw-runtime-token
github: throw if runtime token invalid
2023-02-20 10:17:13 +01:00
CrazyMax
d09114e0c5 Merge pull request #49 from crazy-max/buildx-version
buildx: fix version method
2023-02-20 10:17:01 +01:00
CrazyMax
c3aa7f205d github: throw if runtime token invalid
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-20 10:14:11 +01:00
CrazyMax
62f8c6bef6 buildkit: fix debug logs for versionSatisfies
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-20 10:13:04 +01:00
CrazyMax
a9ce06b57e docker: do not set undefined args for checking availability
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-20 10:13:04 +01:00
CrazyMax
cb6ca3829f buildx: fix version method
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-20 09:59:44 +01:00
CrazyMax
1098847fe7 Merge pull request #48 from crazy-max/exec
Exec class
2023-02-20 09:21:41 +01:00
CrazyMax
35a8193474 Exec class
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-20 09:18:53 +01:00
CrazyMax
2915834633 Merge pull request #47 from crazy-max/context-static
make Context static
2023-02-20 07:27:00 +01:00
CrazyMax
a0e8f0bf18 make Context static
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-20 07:24:32 +01:00
CrazyMax
580aee99c0 Merge pull request #46 from crazy-max/buildx-split-install
Some checks failed
publish / publish (push) Has been cancelled
buildx: split install from download and build methods
2023-02-19 03:39:55 +01:00
CrazyMax
89ecd37681 buildx: info logs on install
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-19 03:34:30 +01:00
CrazyMax
139fb39ab0 buildx: split install from download and build methods
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-19 03:25:07 +01:00
CrazyMax
67957d8c7a Merge pull request #45 from crazy-max/docker-fix
docker: various fixes
2023-02-19 02:57:48 +01:00
CrazyMax
768df5fbf4 buildx: debug logs in isAvailable method
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-19 02:54:07 +01:00
CrazyMax
e9db81b6a1 docker: fix printVersion and printInfo
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-19 02:54:06 +01:00
CrazyMax
cd825ae548 docker: remove singleton
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-19 02:54:06 +01:00
CrazyMax
28c11a1819 Merge pull request #44 from crazy-max/cleanup
chore: remove path sep conversion
2023-02-19 01:52:35 +01:00
CrazyMax
ed087e5b0d chore: remove path sep conversion
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-19 00:59:04 +01:00
CrazyMax
2038d87306 Merge pull request #43 from crazy-max/fix-standalone
Some checks failed
publish / publish (push) Has been cancelled
fix buildx standalone and check for docker availability
2023-02-18 10:15:26 +01:00
CrazyMax
252c717cc3 fix buildx standalone and check for docker availability
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-18 10:09:41 +01:00
CrazyMax
9b338b58a7 toolkit: docker property not needed
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-18 10:08:21 +01:00
CrazyMax
abe37ab72b Merge pull request #42 from crazy-max/buildkit-fix-version
Some checks failed
publish / publish (push) Has been cancelled
buildkit: use node info to retrieve version
2023-02-18 07:34:55 +01:00
CrazyMax
b3a30a9e32 Merge pull request #41 from crazy-max/fix-docker
docker: fix instance
2023-02-18 07:32:33 +01:00
CrazyMax
31e915c017 buildkit: use node info to retrieve version
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-18 07:31:21 +01:00
CrazyMax
05bbe49fe1 toolkit: add docker
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-18 07:06:29 +01:00
CrazyMax
c80fedbbae docker: fix instance
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-18 07:06:20 +01:00
CrazyMax
2c60cad840 Merge pull request #40 from crazy-max/debug
Some checks failed
publish / publish (push) Has been cancelled
some debug logs
2023-02-18 06:00:54 +01:00
CrazyMax
847887b312 some debug logs
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-18 04:36:32 +01:00
CrazyMax
d9984214c9 Merge pull request #39 from crazy-max/buildkit-ctn-prefix
buildx: make containerNamePrefix static and public
2023-02-18 02:20:37 +01:00
CrazyMax
33b4390bc2 buildx: make containerNamePrefix static and public
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-18 02:12:09 +01:00
CrazyMax
5e8f679709 Merge pull request #38 from crazy-max/util-quote
Some checks failed
publish / publish (push) Has been cancelled
util: handle quote opt with the same api for input list
2023-02-18 01:57:40 +01:00
CrazyMax
f288f4f7ea util: handle quote opt with the same api for input list
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-18 01:53:59 +01:00
CrazyMax
cb9121174a Merge pull request #37 from crazy-max/toolkit-builder
toolkit: add builder
2023-02-18 01:37:42 +01:00
CrazyMax
464dfbe1ec toolkit: add builder
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-18 01:33:37 +01:00
CrazyMax
5695c0049b Merge pull request #36 from crazy-max/update-input-list
Some checks failed
publish / publish (push) Has been cancelled
util: opt to escape quotes for input list
2023-02-18 01:12:26 +01:00
CrazyMax
44b1545abd util: opt to escape quotes for input list
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-18 01:02:56 +01:00
CrazyMax
4d9d62d542 Merge pull request #35 from crazy-max/node-type
builder: add Node type
2023-02-18 00:01:23 +01:00
CrazyMax
aa3c8ef106 Merge pull request #34 from crazy-max/buildx-optional-dest
buildx: dest dir optional on install
2023-02-17 23:58:35 +01:00
CrazyMax
259abb56df builder: add Node type
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-17 23:56:13 +01:00
CrazyMax
76e5a25cff buildx: dest dir optional on install
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-17 23:54:28 +01:00
CrazyMax
bb8a659d9e Merge pull request #33 from crazy-max/package-json-ver
Some checks failed
publish / publish (push) Has been cancelled
set dev version in package json
2023-02-17 22:34:10 +01:00
CrazyMax
6ab0483b34 set dev version in package json
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-17 22:31:14 +01:00
CrazyMax
d7dbf54456 Merge pull request #32 from crazy-max/buildx-build
buildx: build buildx as install method
2023-02-17 22:04:44 +01:00
CrazyMax
496d7e2c9d toolkit: add buildxInstall
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-17 21:56:55 +01:00
CrazyMax
094239d9eb buildx: build buildx as install method
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-17 21:56:41 +01:00
CrazyMax
c8a13a2352 buildx: remove install method from main module
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-17 21:52:11 +01:00
CrazyMax
875c6c9e95 Merge pull request #31 from crazy-max/buildx-install
buildx: install method
2023-02-17 20:14:42 +01:00
CrazyMax
12e3bd7469 cleanup temp dir after each test when installing buildx
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-17 20:00:56 +01:00
CrazyMax
2abe456e6b buildx: install method
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-17 20:00:18 +01:00
CrazyMax
80dc124c6b Merge pull request #30 from docker/bot/buildx-releases-json
Some checks failed
publish / publish (push) Has been cancelled
Update `.github/buildx-releases.json`
2023-02-17 07:02:51 +01:00
crazy-max
6ac2b2eb02 github: update .github/buildx-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-02-17 00:18:01 +00:00
CrazyMax
8cb1698b20 Merge pull request #29 from crazy-max/dockerhub-tags
dockerhub: getRepositoryTags
2023-02-14 04:44:42 +01:00
CrazyMax
b13d2bd668 Merge pull request #28 from docker/dependabot/github_actions/crazy-max/ghaction-dump-context-2
build(deps): bump crazy-max/ghaction-dump-context from 1 to 2
2023-02-14 04:42:16 +01:00
CrazyMax
c2dfc9dae8 dockerhub: getRepositoryTags
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-14 04:37:39 +01:00
dependabot[bot]
beff1d58b7 build(deps): bump crazy-max/ghaction-dump-context from 1 to 2
Bumps [crazy-max/ghaction-dump-context](https://github.com/crazy-max/ghaction-dump-context) from 1 to 2.
- [Release notes](https://github.com/crazy-max/ghaction-dump-context/releases)
- [Changelog](https://github.com/crazy-max/ghaction-dump-context/blob/master/CHANGELOG.md)
- [Commits](https://github.com/crazy-max/ghaction-dump-context/compare/v1...v2)

---
updated-dependencies:
- dependency-name: crazy-max/ghaction-dump-context
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-13 22:36:53 +00:00
CrazyMax
01219141e4 Merge pull request #27 from crazy-max/buildx-certs
buildx: resolveCertsDriverOpts
2023-02-12 18:14:23 +01:00
CrazyMax
ec7bb99421 buildx: resolveCertsDriverOpts
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-12 18:10:34 +01:00
CrazyMax
b223e0a42b buildx: certsDir
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-10 11:34:58 +01:00
CrazyMax
5e365b5a48 buildx: configDir
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-10 11:34:58 +01:00
CrazyMax
392903fad6 Merge pull request #26 from docker/dependabot/npm_and_yarn/csv-parse-5.3.5
build(deps): bump csv-parse from 5.3.4 to 5.3.5
2023-02-09 17:35:10 +01:00
dependabot[bot]
406e440bcb build(deps): bump csv-parse from 5.3.4 to 5.3.5
Bumps [csv-parse](https://github.com/adaltas/node-csv/tree/HEAD/packages/csv-parse) from 5.3.4 to 5.3.5.
- [Release notes](https://github.com/adaltas/node-csv/releases)
- [Changelog](https://github.com/adaltas/node-csv/blob/master/packages/csv-parse/CHANGELOG.md)
- [Commits](https://github.com/adaltas/node-csv/commits/csv-parse@5.3.5/packages/csv-parse)

---
updated-dependencies:
- dependency-name: csv-parse
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-08 22:21:53 +00:00
CrazyMax
64c6f33406 Merge pull request #25 from crazy-max/codecov
ci: upload coverage to codecov
2023-02-04 05:44:06 +01:00
CrazyMax
f0f0b76920 readme: badges
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-04 04:51:49 +01:00
CrazyMax
5e3916dce6 ci: upload coverage to codecov
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-04 04:42:47 +01:00
CrazyMax
815affc0ed Merge pull request #24 from crazy-max/dockerhub-api-client
dockerhub: api client to get repo details and update description
2023-02-04 03:33:00 +01:00
CrazyMax
96ad2a52f8 dockerhub: api client to get repo details and update description
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-04 03:06:55 +01:00
CrazyMax
556fff451f test: rename github repo fixture
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-04 03:03:11 +01:00
CrazyMax
d1181e8a16 chore: allow disabled tests
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-04 03:02:49 +01:00
CrazyMax
11bdb1082a buildkit(config): rename methods
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-03 14:45:32 +01:00
CrazyMax
fdfeb2486a Merge pull request #23 from crazy-max/github-print-art
github: printActionsRuntimeTokenACs
2023-02-03 13:22:41 +01:00
CrazyMax
7a9a28cd90 github: handle malformed runtime token
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-03 13:17:00 +01:00
CrazyMax
3e2548a8ed github: translate access controls permissions
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-03 04:11:14 +01:00
CrazyMax
ad59af8cf2 github: printActionsRuntimeToken
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-03 03:33:22 +01:00
CrazyMax
40e9a15129 buildx(inputs): rename some methods
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-03 03:33:09 +01:00
CrazyMax
7d5ed416da Merge pull request #22 from crazy-max/fix-buildx-install
Some checks failed
publish / publish (push) Has been cancelled
buildx: use correct url for getRelease
2023-02-02 17:21:34 +01:00
CrazyMax
87a4161671 buildx: use correct url for getRelease
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-02 17:19:28 +01:00
CrazyMax
63427f8ff1 Merge pull request #21 from docker/bot/buildx-releases-json
Update `.github/buildx-releases.json`
2023-02-02 17:14:33 +01:00
crazy-max
77bb494420 github: update .github/buildx-releases.json
Signed-off-by: GitHub <noreply@github.com>
2023-02-02 16:14:09 +00:00
CrazyMax
48addf39b6 Merge pull request #20 from crazy-max/fix-ci
ci: fix releases-json workflow
2023-02-02 17:13:40 +01:00
CrazyMax
efe21e504c ci: fix releases-json workflow
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-02 17:10:36 +01:00
CrazyMax
7fb4112dd4 Merge pull request #19 from crazy-max/enable-openpr-job
ci: enable open-pr job
2023-02-02 17:09:12 +01:00
CrazyMax
a14339c1d2 ci: enable open-pr job
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-02 17:04:52 +01:00
CrazyMax
c8e980fc49 Merge pull request #18 from crazy-max/fix-publish
Some checks failed
publish / publish (push) Has been cancelled
chore: fix publish
2023-02-01 17:30:39 +01:00
CrazyMax
3f81bea2c1 chore: fix publish
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-01 17:27:24 +01:00
CrazyMax
d21d31d108 Merge pull request #17 from crazy-max/docker-configdir
docker: configDir
2023-02-01 17:06:03 +01:00
CrazyMax
765b23685c docker: isAvailable use get
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-01 16:49:46 +01:00
CrazyMax
c89aa60986 docker: configDir
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-01 16:47:01 +01:00
CrazyMax
3150492079 Merge pull request #16 from crazy-max/buildx-install
buildx: install
2023-02-01 15:39:08 +01:00
CrazyMax
b193ec6e9e common base tmpDir for tests
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-01 15:37:03 +01:00
CrazyMax
257dd09431 buildx: install
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-01 14:21:44 +01:00
CrazyMax
e47d166c4f fix jest config
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-01 14:18:45 +01:00
CrazyMax
98e69d9e72 toolkit: remove unneeded exports
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-01 13:41:44 +01:00
CrazyMax
81d78d2ce7 Merge pull request #15 from crazy-max/split
Split some logic
2023-02-01 13:12:21 +01:00
CrazyMax
fe8b21ecf5 github: move types
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-01 13:06:20 +01:00
CrazyMax
dea2294b93 buildkit: split module
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-01 12:58:12 +01:00
CrazyMax
cc48ecede1 buildx: split module
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-01 12:58:12 +01:00
CrazyMax
388280c282 Merge pull request #14 from crazy-max/fix-lint
fix eslint config and lint issues
2023-02-01 12:53:46 +01:00
CrazyMax
c11b80183c fix eslint config and lint issues
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-01 12:51:48 +01:00
CrazyMax
ae3911e977 Merge pull request #13 from crazy-max/yarn-cfg
chore: tweak yarn config
2023-02-01 02:04:18 +01:00
CrazyMax
535aedce51 chore: discard some specific yarn logs
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-01 02:00:56 +01:00
CrazyMax
104c7babf8 chore: use yarn to publish module
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-01 01:51:34 +01:00
CrazyMax
c617b15f70 Merge pull request #12 from crazy-max/github-apiurl
github: apiUrl
2023-02-01 01:46:12 +01:00
CrazyMax
17f9c80d9c github: apiURL
Also took the opportunity to make some methods static

Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-01 01:42:10 +01:00
CrazyMax
ffdd47b148 Merge pull request #11 from docker/dependabot/npm_and_yarn/csv-parse-5.3.4
build(deps): bump csv-parse from 5.3.3 to 5.3.4
2023-01-31 23:26:06 +01:00
dependabot[bot]
eca9342d11 build(deps): bump csv-parse from 5.3.3 to 5.3.4
Bumps [csv-parse](https://github.com/adaltas/node-csv/tree/HEAD/packages/csv-parse) from 5.3.3 to 5.3.4.
- [Release notes](https://github.com/adaltas/node-csv/releases)
- [Changelog](https://github.com/adaltas/node-csv/blob/master/packages/csv-parse/CHANGELOG.md)
- [Commits](https://github.com/adaltas/node-csv/commits/csv-parse@5.3.4/packages/csv-parse)

---
updated-dependencies:
- dependency-name: csv-parse
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-31 22:13:33 +00:00
93 changed files with 20814 additions and 4419 deletions

4
.eslintignore Normal file
View File

@@ -0,0 +1,4 @@
/.yarn/**
/lib/**
/coverage/**
/node_modules/**

View File

@@ -1,23 +1,36 @@
{
"env": {
"node": true,
"es2021": true,
"jest/globals": true
"es6": true,
"mocha": true,
"jest": true
},
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended",
"plugin:import/errors",
"plugin:import/typescript", // this is needed to allow importing typescript files from JS
"plugin:import/warnings",
"plugin:jest/recommended",
"plugin:prettier/recommended"
],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": "latest",
"ecmaVersion": "2023",
"sourceType": "module"
},
"plugins": [
"@typescript-eslint",
"jest",
"prettier"
]
],
"rules": {
"import/no-unresolved": [
"error", {
"ignore": ["csv-parse/sync", "@octokit/openapi-types"]
}
],
"jest/no-disabled-tests": 0
}
}

207
.github/buildx-lab-releases.json vendored Normal file
View File

@@ -0,0 +1,207 @@
{
"latest": {
"id": 123496811,
"tag_name": "v0.11.2-desktop.5",
"html_url": "https://github.com/docker/buildx-desktop/releases/tag/v0.11.2-desktop.5",
"assets": [
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.darwin-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.darwin-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.darwin-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.darwin-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.darwin-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.darwin-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-arm-v6",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-arm-v7",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-ppc64le",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-riscv64",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-riscv64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-riscv64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-s390x",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-s390x.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-s390x.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.windows-amd64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.windows-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.windows-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.windows-arm64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.windows-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.windows-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/checksums.txt"
]
},
"v0.12.0-desktop.1": {
"id": 130699107,
"tag_name": "v0.12.0-desktop.1",
"html_url": "https://github.com/docker/buildx-desktop/releases/tag/v0.12.0-desktop.1",
"assets": [
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.darwin-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.darwin-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.darwin-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.darwin-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.darwin-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.darwin-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.linux-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.linux-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.linux-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.linux-arm-v6",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.linux-arm-v7",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.linux-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.linux-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.linux-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.linux-ppc64le",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.linux-riscv64",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.linux-riscv64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.linux-riscv64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.linux-s390x",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.linux-s390x.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.linux-s390x.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.windows-amd64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.windows-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.windows-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.windows-arm64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.windows-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/buildx-v0.12.0-desktop.1.windows-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.0-desktop.1/checksums.txt"
]
},
"v0.11.2-desktop.5": {
"id": 123496811,
"tag_name": "v0.11.2-desktop.5",
"html_url": "https://github.com/docker/buildx-desktop/releases/tag/v0.11.2-desktop.5",
"assets": [
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.darwin-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.darwin-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.darwin-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.darwin-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.darwin-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.darwin-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-arm-v6",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-arm-v7",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-ppc64le",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-riscv64",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-riscv64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-riscv64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-s390x",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-s390x.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.linux-s390x.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.windows-amd64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.windows-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.windows-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.windows-arm64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.windows-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/buildx-v0.11.2-desktop.5.windows-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.5/checksums.txt"
]
},
"v0.11.2-desktop.4": {
"id": 119399782,
"tag_name": "v0.11.2-desktop.4",
"html_url": "https://github.com/docker/buildx-desktop/releases/tag/v0.11.2-desktop.4",
"assets": [
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.darwin-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.darwin-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.darwin-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.darwin-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.darwin-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.darwin-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.linux-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.linux-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.linux-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.linux-arm-v6",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.linux-arm-v7",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.linux-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.linux-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.linux-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.linux-ppc64le",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.linux-riscv64",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.linux-riscv64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.linux-riscv64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.linux-s390x",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.linux-s390x.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.linux-s390x.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.windows-amd64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.windows-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.windows-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.windows-arm64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.windows-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/buildx-v0.11.2-desktop.4.windows-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.4/checksums.txt"
]
},
"v0.11.2-desktop.2": {
"id": 118213369,
"tag_name": "v0.11.2-desktop.2",
"html_url": "https://github.com/docker/buildx-desktop/releases/tag/v0.11.2-desktop.2",
"assets": [
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.darwin-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.darwin-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.darwin-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.darwin-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.darwin-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.darwin-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.linux-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.linux-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.linux-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.linux-arm-v6",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.linux-arm-v7",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.linux-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.linux-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.linux-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.linux-ppc64le",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.linux-riscv64",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.linux-riscv64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.linux-riscv64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.linux-s390x",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.linux-s390x.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.linux-s390x.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.windows-amd64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.windows-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.windows-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.windows-arm64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.windows-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/buildx-v0.11.2-desktop.2.windows-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.11.2-desktop.2/checksums.txt"
]
}
}

1186
.github/buildx-releases.json vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -11,6 +11,7 @@ updates:
directory: "/"
schedule:
interval: "daily"
versioning-strategy: "increase"
allow:
- dependency-type: "production"
labels:

872
.github/docker-releases.json vendored Normal file
View File

@@ -0,0 +1,872 @@
{
"latest": {
"id": 126933125,
"tag_name": "v24.0.7",
"html_url": "https://github.com/moby/moby/releases/tag/v24.0.7",
"assets": []
},
"v25.0.0-beta.1": {
"id": 129244747,
"tag_name": "v25.0.0-beta.1",
"html_url": "https://github.com/moby/moby/releases/tag/v25.0.0-beta.1",
"assets": []
},
"v24.0.7": {
"id": 126933125,
"tag_name": "v24.0.7",
"html_url": "https://github.com/moby/moby/releases/tag/v24.0.7",
"assets": []
},
"v23.0.7": {
"id": 122845906,
"tag_name": "v23.0.7",
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.7",
"assets": []
},
"v20.10.26": {
"id": 122843129,
"tag_name": "v20.10.26",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.26",
"assets": []
},
"v24.0.6": {
"id": 120021175,
"tag_name": "v24.0.6",
"html_url": "https://github.com/moby/moby/releases/tag/v24.0.6",
"assets": []
},
"v24.0.5": {
"id": 113348684,
"tag_name": "v24.0.5",
"html_url": "https://github.com/moby/moby/releases/tag/v24.0.5",
"assets": []
},
"v24.0.4": {
"id": 111464537,
"tag_name": "v24.0.4",
"html_url": "https://github.com/moby/moby/releases/tag/v24.0.4",
"assets": []
},
"v24.0.3": {
"id": 111300256,
"tag_name": "v24.0.3",
"html_url": "https://github.com/moby/moby/releases/tag/v24.0.3",
"assets": []
},
"v24.0.2": {
"id": 104366762,
"tag_name": "v24.0.2",
"html_url": "https://github.com/moby/moby/releases/tag/v24.0.2",
"assets": []
},
"v24.0.1": {
"id": 103671743,
"tag_name": "v24.0.1",
"html_url": "https://github.com/moby/moby/releases/tag/v24.0.1",
"assets": []
},
"v24.0.0": {
"id": 103200193,
"tag_name": "v24.0.0",
"html_url": "https://github.com/moby/moby/releases/tag/v24.0.0",
"assets": []
},
"v20.10.25": {
"id": 103070540,
"tag_name": "v20.10.25",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.25",
"assets": []
},
"v24.0.0-rc.4": {
"id": 102846110,
"tag_name": "v24.0.0-rc.4",
"html_url": "https://github.com/moby/moby/releases/tag/v24.0.0-rc.4",
"assets": []
},
"v24.0.0-rc.3": {
"id": 102708870,
"tag_name": "v24.0.0-rc.3",
"html_url": "https://github.com/moby/moby/releases/tag/v24.0.0-rc.3",
"assets": []
},
"v23.0.6": {
"id": 102196340,
"tag_name": "v23.0.6",
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.6",
"assets": []
},
"v24.0.0-rc.2": {
"id": 102091676,
"tag_name": "v24.0.0-rc.2",
"html_url": "https://github.com/moby/moby/releases/tag/v24.0.0-rc.2",
"assets": []
},
"v24.0.0-rc.1": {
"id": 101305950,
"tag_name": "v24.0.0-rc.1",
"html_url": "https://github.com/moby/moby/releases/tag/v24.0.0-rc.1",
"assets": []
},
"v23.0.5": {
"id": 101005794,
"tag_name": "v23.0.5",
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.5",
"assets": []
},
"v23.0.4": {
"id": 99811576,
"tag_name": "v23.0.4",
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.4",
"assets": []
},
"v24.0.0-beta.2": {
"id": 99544545,
"tag_name": "v24.0.0-beta.2",
"html_url": "https://github.com/moby/moby/releases/tag/v24.0.0-beta.2",
"assets": []
},
"v23.0.3": {
"id": 98122882,
"tag_name": "v23.0.3",
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.3",
"assets": []
},
"v20.10.24": {
"id": 98096018,
"tag_name": "v20.10.24",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.24",
"assets": []
},
"v24.0.0-beta.1": {
"id": 97703002,
"tag_name": "v24.0.0-beta.1",
"html_url": "https://github.com/moby/moby/releases/tag/v24.0.0-beta.1",
"assets": []
},
"v23.0.2": {
"id": 97163508,
"tag_name": "v23.0.2",
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.2",
"assets": []
},
"v23.0.1": {
"id": 91964526,
"tag_name": "v23.0.1",
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.1",
"assets": []
},
"v23.0.0": {
"id": 91109643,
"tag_name": "v23.0.0",
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.0",
"assets": []
},
"v23.0.0-rc.4": {
"id": 91003797,
"tag_name": "v23.0.0-rc.4",
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.0-rc.4",
"assets": []
},
"v23.0.0-rc.3": {
"id": 89780703,
"tag_name": "v23.0.0-rc.3",
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.0-rc.3",
"assets": []
},
"v20.10.23": {
"id": 89647366,
"tag_name": "v20.10.23",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.23",
"assets": []
},
"v23.0.0-rc.2": {
"id": 88712255,
"tag_name": "v23.0.0-rc.2",
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.0-rc.2",
"assets": []
},
"v23.0.0-rc.1": {
"id": 87299039,
"tag_name": "v23.0.0-rc.1",
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.0-rc.1",
"assets": []
},
"v20.10.22": {
"id": 86325342,
"tag_name": "v20.10.22",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.22",
"assets": []
},
"v23.0.0-beta.1": {
"id": 85159482,
"tag_name": "v23.0.0-beta.1",
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.0-beta.1",
"assets": []
},
"v20.10.21": {
"id": 80977884,
"tag_name": "v20.10.21",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.21",
"assets": []
},
"v20.10.20": {
"id": 80248420,
"tag_name": "v20.10.20",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.20",
"assets": []
},
"v20.10.19": {
"id": 79847378,
"tag_name": "v20.10.19",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.19",
"assets": []
},
"v20.10.18": {
"id": 76694729,
"tag_name": "v20.10.18",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.18",
"assets": []
},
"v20.10.17": {
"id": 68777665,
"tag_name": "v20.10.17",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.17",
"assets": []
},
"v22.06.0-beta.0": {
"id": 68600276,
"tag_name": "v22.06.0-beta.0",
"html_url": "https://github.com/moby/moby/releases/tag/v22.06.0-beta.0",
"assets": []
},
"v20.10.16": {
"id": 66708640,
"tag_name": "v20.10.16",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.16",
"assets": []
},
"v20.10.15": {
"id": 66170410,
"tag_name": "v20.10.15",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.15",
"assets": []
},
"v20.10.14": {
"id": 62642891,
"tag_name": "v20.10.14",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.14",
"assets": []
},
"v20.10.13": {
"id": 61523032,
"tag_name": "v20.10.13",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.13",
"assets": []
},
"v20.10.12": {
"id": 56724849,
"tag_name": "v20.10.12",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.12",
"assets": []
},
"v20.10.11": {
"id": 53604359,
"tag_name": "v20.10.11",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.11",
"assets": []
},
"v20.10.10": {
"id": 51991530,
"tag_name": "v20.10.10",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.10",
"assets": []
},
"v20.10.9": {
"id": 50763745,
"tag_name": "v20.10.9",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.9",
"assets": []
},
"v20.10.8": {
"id": 47261111,
"tag_name": "v20.10.8",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.8",
"assets": []
},
"v20.10.7": {
"id": 44002175,
"tag_name": "v20.10.7",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.7",
"assets": []
},
"v20.10.6": {
"id": 41439201,
"tag_name": "v20.10.6",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.6",
"assets": []
},
"v20.10.5": {
"id": 39216180,
"tag_name": "v20.10.5",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.5",
"assets": []
},
"v20.10.4": {
"id": 39014860,
"tag_name": "v20.10.4",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.4",
"assets": []
},
"v20.10.3": {
"id": 37231470,
"tag_name": "v20.10.3",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.3",
"assets": []
},
"v19.03.15": {
"id": 37231443,
"tag_name": "v19.03.15",
"html_url": "https://github.com/moby/moby/releases/tag/v19.03.15",
"assets": []
},
"v20.10.2": {
"id": 35990169,
"tag_name": "v20.10.2",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.2",
"assets": []
},
"v20.10.1": {
"id": 35281927,
"tag_name": "v20.10.1",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.1",
"assets": []
},
"v20.10.0": {
"id": 35069369,
"tag_name": "v20.10.0",
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.0",
"assets": []
},
"v19.03.14": {
"id": 34677482,
"tag_name": "v19.03.14",
"html_url": "https://github.com/moby/moby/releases/tag/v19.03.14",
"assets": []
},
"v19.03.13": {
"id": 31493434,
"tag_name": "v19.03.13",
"html_url": "https://github.com/moby/moby/releases/tag/v19.03.13",
"assets": []
},
"v19.03.12": {
"id": 28065393,
"tag_name": "v19.03.12",
"html_url": "https://github.com/moby/moby/releases/tag/v19.03.12",
"assets": []
},
"v19.03.11": {
"id": 27237950,
"tag_name": "v19.03.11",
"html_url": "https://github.com/moby/moby/releases/tag/v19.03.11",
"assets": []
},
"v19.03.10": {
"id": 27043306,
"tag_name": "v19.03.10",
"html_url": "https://github.com/moby/moby/releases/tag/v19.03.10",
"assets": []
},
"v19.03.9": {
"id": 27002855,
"tag_name": "v19.03.9",
"html_url": "https://github.com/moby/moby/releases/tag/v19.03.9",
"assets": []
},
"v19.03.8": {
"id": 25372883,
"tag_name": "v19.03.8",
"html_url": "https://github.com/moby/moby/releases/tag/v19.03.8",
"assets": []
},
"v17.03.2-ce": {
"id": 6858533,
"tag_name": "v17.03.2-ce",
"html_url": "https://github.com/moby/moby/releases/tag/v17.03.2-ce",
"assets": []
},
"v17.03.2-ce-rc1": {
"id": 6547028,
"tag_name": "v17.03.2-ce-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v17.03.2-ce-rc1",
"assets": []
},
"v17.05.0-ce": {
"id": 6295254,
"tag_name": "v17.05.0-ce",
"html_url": "https://github.com/moby/moby/releases/tag/v17.05.0-ce",
"assets": []
},
"v17.05.0-ce-rc3": {
"id": 6259851,
"tag_name": "v17.05.0-ce-rc3",
"html_url": "https://github.com/moby/moby/releases/tag/v17.05.0-ce-rc3",
"assets": []
},
"v17.05.0-ce-rc2": {
"id": 6216216,
"tag_name": "v17.05.0-ce-rc2",
"html_url": "https://github.com/moby/moby/releases/tag/v17.05.0-ce-rc2",
"assets": []
},
"v17.05.0-ce-rc1": {
"id": 6066291,
"tag_name": "v17.05.0-ce-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v17.05.0-ce-rc1",
"assets": []
},
"v17.04.0-ce": {
"id": 5992837,
"tag_name": "v17.04.0-ce",
"html_url": "https://github.com/moby/moby/releases/tag/v17.04.0-ce",
"assets": []
},
"v17.04.0-ce-rc2": {
"id": 5930499,
"tag_name": "v17.04.0-ce-rc2",
"html_url": "https://github.com/moby/moby/releases/tag/v17.04.0-ce-rc2",
"assets": []
},
"v17.03.1-ce": {
"id": 5889333,
"tag_name": "v17.03.1-ce",
"html_url": "https://github.com/moby/moby/releases/tag/v17.03.1-ce",
"assets": []
},
"v17.04.0-ce-rc1": {
"id": 5821903,
"tag_name": "v17.04.0-ce-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v17.04.0-ce-rc1",
"assets": []
},
"v17.03.1-ce-rc1": {
"id": 5787909,
"tag_name": "v17.03.1-ce-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v17.03.1-ce-rc1",
"assets": []
},
"v17.03.0-ce": {
"id": 5616072,
"tag_name": "v17.03.0-ce",
"html_url": "https://github.com/moby/moby/releases/tag/v17.03.0-ce",
"assets": []
},
"v17.03.0-ce-rc1": {
"id": 5516127,
"tag_name": "v17.03.0-ce-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v17.03.0-ce-rc1",
"assets": []
},
"v1.13.1": {
"id": 5400129,
"tag_name": "v1.13.1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.1",
"assets": []
},
"v1.13.1-rc2": {
"id": 5385634,
"tag_name": "v1.13.1-rc2",
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.1-rc2",
"assets": []
},
"v1.13.1-rc1": {
"id": 5307652,
"tag_name": "v1.13.1-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.1-rc1",
"assets": []
},
"v1.13.0": {
"id": 5196571,
"tag_name": "v1.13.0",
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.0",
"assets": []
},
"v1.13.0-rc7": {
"id": 5157693,
"tag_name": "v1.13.0-rc7",
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.0-rc7",
"assets": []
},
"v1.13.0-rc6": {
"id": 5135134,
"tag_name": "v1.13.0-rc6",
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.0-rc6",
"assets": []
},
"v1.12.6": {
"id": 5123890,
"tag_name": "v1.12.6",
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.6",
"assets": []
},
"v1.13.0-rc5": {
"id": 5080578,
"tag_name": "v1.13.0-rc5",
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.0-rc5",
"assets": []
},
"v1.13.0-rc4": {
"id": 4948866,
"tag_name": "v1.13.0-rc4",
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.0-rc4",
"assets": []
},
"v1.12.5": {
"id": 4938198,
"tag_name": "v1.12.5",
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.5",
"assets": []
},
"v1.12.5-rc1": {
"id": 4926422,
"tag_name": "v1.12.5-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.5-rc1",
"assets": []
},
"v1.12.4": {
"id": 4901878,
"tag_name": "v1.12.4",
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.4",
"assets": []
},
"v1.12.4-rc1": {
"id": 4863914,
"tag_name": "v1.12.4-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.4-rc1",
"assets": []
},
"v1.13.0-rc3": {
"id": 4840704,
"tag_name": "v1.13.0-rc3",
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.0-rc3",
"assets": []
},
"v1.13.0-rc2": {
"id": 4744761,
"tag_name": "v1.13.0-rc2",
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.0-rc2",
"assets": []
},
"v1.13.0-rc1": {
"id": 4641203,
"tag_name": "v1.13.0-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.0-rc1",
"assets": []
},
"v1.12.3": {
"id": 4495222,
"tag_name": "v1.12.3",
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.3",
"assets": []
},
"v1.12.3-rc1": {
"id": 4481016,
"tag_name": "v1.12.3-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.3-rc1",
"assets": []
},
"v1.12.2": {
"id": 4364345,
"tag_name": "v1.12.2",
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.2",
"assets": []
},
"v1.12.2-rc3": {
"id": 4336430,
"tag_name": "v1.12.2-rc3",
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.2-rc3",
"assets": []
},
"v1.12.2-rc2": {
"id": 4304701,
"tag_name": "v1.12.2-rc2",
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.2-rc2",
"assets": []
},
"v1.12.2-rc1": {
"id": 4246481,
"tag_name": "v1.12.2-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.2-rc1",
"assets": []
},
"v1.12.1": {
"id": 3919520,
"tag_name": "v1.12.1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.1",
"assets": []
},
"v1.12.1-rc2": {
"id": 3909470,
"tag_name": "v1.12.1-rc2",
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.1-rc2",
"assets": []
},
"v1.12.1-rc1": {
"id": 3879305,
"tag_name": "v1.12.1-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.1-rc1",
"assets": []
},
"v1.12.0": {
"id": 3766135,
"tag_name": "v1.12.0",
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.0",
"assets": []
},
"v1.12.0-rc5": {
"id": 3744904,
"tag_name": "v1.12.0-rc5",
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.0-rc5",
"assets": []
},
"v1.12.0-rc4": {
"id": 3644623,
"tag_name": "v1.12.0-rc4",
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.0-rc4",
"assets": []
},
"v1.12.0-rc3": {
"id": 3573896,
"tag_name": "v1.12.0-rc3",
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.0-rc3",
"assets": []
},
"v1.12.0-rc2": {
"id": 3471944,
"tag_name": "v1.12.0-rc2",
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.0-rc2",
"assets": []
},
"v1.12.0-rc1": {
"id": 3447699,
"tag_name": "v1.12.0-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.0-rc1",
"assets": []
},
"v1.11.2": {
"id": 3354503,
"tag_name": "v1.11.2",
"html_url": "https://github.com/moby/moby/releases/tag/v1.11.2",
"assets": []
},
"v1.11.2-rc1": {
"id": 3327300,
"tag_name": "v1.11.2-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.11.2-rc1",
"assets": []
},
"v1.11.1": {
"id": 3105125,
"tag_name": "v1.11.1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.11.1",
"assets": []
},
"v1.11.1-rc1": {
"id": 3097597,
"tag_name": "v1.11.1-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.11.1-rc1",
"assets": []
},
"v1.11.0": {
"id": 3014278,
"tag_name": "v1.11.0",
"html_url": "https://github.com/moby/moby/releases/tag/v1.11.0",
"assets": []
},
"v1.11.0-rc5": {
"id": 2998258,
"tag_name": "v1.11.0-rc5",
"html_url": "https://github.com/moby/moby/releases/tag/v1.11.0-rc5",
"assets": []
},
"v1.11.0-rc4": {
"id": 2968912,
"tag_name": "v1.11.0-rc4",
"html_url": "https://github.com/moby/moby/releases/tag/v1.11.0-rc4",
"assets": []
},
"v1.11.0-rc3": {
"id": 2937939,
"tag_name": "v1.11.0-rc3",
"html_url": "https://github.com/moby/moby/releases/tag/v1.11.0-rc3",
"assets": []
},
"v1.11.0-rc2": {
"id": 2890861,
"tag_name": "v1.11.0-rc2",
"html_url": "https://github.com/moby/moby/releases/tag/v1.11.0-rc2",
"assets": []
},
"v1.11.0-rc1": {
"id": 2875983,
"tag_name": "v1.11.0-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.11.0-rc1",
"assets": []
},
"v1.10.3": {
"id": 2788494,
"tag_name": "v1.10.3",
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.3",
"assets": []
},
"v1.10.3-rc2": {
"id": 2780060,
"tag_name": "v1.10.3-rc2",
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.3-rc2",
"assets": []
},
"v1.10.3-rc1": {
"id": 2777835,
"tag_name": "v1.10.3-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.3-rc1",
"assets": []
},
"v1.10.2": {
"id": 2666504,
"tag_name": "v1.10.2",
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.2",
"assets": []
},
"v1.10.2-rc1": {
"id": 2652399,
"tag_name": "v1.10.2-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.2-rc1",
"assets": []
},
"v1.10.1": {
"id": 2598018,
"tag_name": "v1.10.1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.1",
"assets": []
},
"v1.10.1-rc1": {
"id": 2590708,
"tag_name": "v1.10.1-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.1-rc1",
"assets": []
},
"v1.10.0": {
"id": 2555659,
"tag_name": "v1.10.0",
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.0",
"assets": []
},
"v1.10.0-rc4": {
"id": 2549294,
"tag_name": "v1.10.0-rc4",
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.0-rc4",
"assets": []
},
"v1.10.0-rc3": {
"id": 2541607,
"tag_name": "v1.10.0-rc3",
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.0-rc3",
"assets": []
},
"v1.10.0-rc2": {
"id": 2505382,
"tag_name": "v1.10.0-rc2",
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.0-rc2",
"assets": []
},
"v1.10.0-rc1": {
"id": 2437435,
"tag_name": "v1.10.0-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.0-rc1",
"assets": []
},
"v1.9.1": {
"id": 2161885,
"tag_name": "v1.9.1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.9.1",
"assets": []
},
"v1.9.1-rc1": {
"id": 2124307,
"tag_name": "v1.9.1-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.9.1-rc1",
"assets": []
},
"v1.9.0": {
"id": 2065556,
"tag_name": "v1.9.0",
"html_url": "https://github.com/moby/moby/releases/tag/v1.9.0",
"assets": []
},
"v1.9.0-rc5": {
"id": 2063038,
"tag_name": "v1.9.0-rc5",
"html_url": "https://github.com/moby/moby/releases/tag/v1.9.0-rc5",
"assets": []
},
"v1.9.0-rc4": {
"id": 2051407,
"tag_name": "v1.9.0-rc4",
"html_url": "https://github.com/moby/moby/releases/tag/v1.9.0-rc4",
"assets": []
},
"v1.9.0-rc3": {
"id": 2030176,
"tag_name": "v1.9.0-rc3",
"html_url": "https://github.com/moby/moby/releases/tag/v1.9.0-rc3",
"assets": []
},
"v1.9.0-rc2": {
"id": 2006252,
"tag_name": "v1.9.0-rc2",
"html_url": "https://github.com/moby/moby/releases/tag/v1.9.0-rc2",
"assets": []
},
"v1.9.0-rc1": {
"id": 1960642,
"tag_name": "v1.9.0-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.9.0-rc1",
"assets": []
},
"v1.8.3": {
"id": 1948004,
"tag_name": "v1.8.3",
"html_url": "https://github.com/moby/moby/releases/tag/v1.8.3",
"assets": []
},
"v1.8.2": {
"id": 1796575,
"tag_name": "v1.8.2",
"html_url": "https://github.com/moby/moby/releases/tag/v1.8.2",
"assets": []
},
"v1.8.2-rc1": {
"id": 1765231,
"tag_name": "v1.8.2-rc1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.8.2-rc1",
"assets": []
},
"v1.8.1": {
"id": 1665370,
"tag_name": "v1.8.1",
"html_url": "https://github.com/moby/moby/releases/tag/v1.8.1",
"assets": []
},
"v1.8.0": {
"id": 1657439,
"tag_name": "v1.8.0",
"html_url": "https://github.com/moby/moby/releases/tag/v1.8.0",
"assets": []
},
"v1.8.0-rc3": {
"id": 1643499,
"tag_name": "v1.8.0-rc3",
"html_url": "https://github.com/moby/moby/releases/tag/v1.8.0-rc3",
"assets": []
}
}

26
.github/workflows/build.yml vendored Normal file
View File

@@ -0,0 +1,26 @@
name: build
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on:
push:
branches:
- 'main'
pull_request:
paths-ignore:
- '.github/*-releases.json'
jobs:
build:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v4
-
name: Build
uses: docker/bake-action@v4
with:
targets: build

View File

@@ -0,0 +1,58 @@
name: buildx-lab-releases-json
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on:
workflow_dispatch:
schedule:
- cron: '0 */12 * * *'
push:
branches:
- 'main'
pull_request:
paths-ignore:
- '.github/*-releases.json'
jobs:
generate:
uses: crazy-max/.github/.github/workflows/releases-json.yml@6dc31870ca6c4f8489bf5a408ab38fae60f47eec
with:
repository: docker/buildx-desktop
artifact_name: buildx-lab-releases-json
filename: buildx-lab-releases.json
secrets: inherit
open-pr:
runs-on: ubuntu-22.04
if: github.event_name != 'pull_request'
needs:
- generate
steps:
-
name: Checkout
uses: actions/checkout@v4
-
name: Download
uses: actions/download-artifact@v3
with:
name: buildx-lab-releases-json
path: .github
-
name: Commit changes
run: |
git add -A .
-
name: Create PR
uses: peter-evans/create-pull-request@153407881ec5c347639a548ade7d8ad1d6740e38
with:
base: main
branch: bot/buildx-lab-releases-json
commit-message: "github: update .github/buildx-lab-releases.json"
signoff: true
delete-branch: true
title: "Update `.github/buildx-lab-releases.json`"
body: |
Update `.github/buildx-lab-releases.json` to keep in sync with [https://github.com/docker/buildx-desktop](https://github.com/docker/buildx-desktop).
draft: false

View File

@@ -13,47 +13,46 @@ on:
- 'main'
pull_request:
paths-ignore:
- '.github/buildx-releases.json'
- '.github/*-releases.json'
jobs:
generate:
uses: crazy-max/.github/.github/workflows/releases-json.yml@2a596c917a8ad3e6203ae99b777148525a2e00d5
uses: crazy-max/.github/.github/workflows/releases-json.yml@6dc31870ca6c4f8489bf5a408ab38fae60f47eec
with:
repository: docker/buildx
artifact_name: buildx-releases-json
filename: buildx-releases.json
secrets: inherit
# FIXME: Uncomment when repo public
# open-pr:
# runs-on: ubuntu-22.04
# if: github.event_name != 'pull_request'
# needs:
# - generate
# steps:
# -
# name: Checkout
# uses: actions/checkout@v3
# -
# name: Download
# uses: actions/download-artifact@v3
# with:
# name: buildx-releases-json
# path: .github
# -
# name: Commit changes
# run: |
# git add -A .
# -
# name: Create PR
# uses: peter-evans/create-pull-request@2b011faafdcbc9ceb11414d64d0573f37c774b04
# with:
# base: master
# branch: bot/buildx-releases-json
# commit-message: "github: update .github/buildx-releases.json"
# signoff: true
# delete-branch: true
# title: "Update `.github/buildx-releases.json`"
# body: |
# Update `.github/buildx-releases.json` to keep in sync with [https://github.com/docker/buildx](https://github.com/docker/buildx).
# draft: false
open-pr:
runs-on: ubuntu-22.04
if: github.event_name != 'pull_request'
needs:
- generate
steps:
-
name: Checkout
uses: actions/checkout@v4
-
name: Download
uses: actions/download-artifact@v3
with:
name: buildx-releases-json
path: .github
-
name: Commit changes
run: |
git add -A .
-
name: Create PR
uses: peter-evans/create-pull-request@153407881ec5c347639a548ade7d8ad1d6740e38
with:
base: main
branch: bot/buildx-releases-json
commit-message: "github: update .github/buildx-releases.json"
signoff: true
delete-branch: true
title: "Update `.github/buildx-releases.json`"
body: |
Update `.github/buildx-releases.json` to keep in sync with [https://github.com/docker/buildx](https://github.com/docker/buildx).
draft: false

41
.github/workflows/codeql.yml vendored Normal file
View File

@@ -0,0 +1,41 @@
name: codeql
on:
push:
branches:
- 'main'
pull_request:
permissions:
actions: read
contents: read
security-events: write
env:
NODE_VERSION: 20
jobs:
analyze:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v4
-
name: Set up Node
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
-
name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: javascript-typescript
-
name: Autobuild
uses: github/codeql-action/autobuild@v2
-
name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
with:
category: "/language:javascript-typescript"

View File

@@ -0,0 +1,58 @@
name: docker-releases-json
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on:
workflow_dispatch:
schedule:
- cron: '0 */12 * * *'
push:
branches:
- 'main'
pull_request:
paths-ignore:
- '.github/*-releases.json'
jobs:
generate:
uses: crazy-max/.github/.github/workflows/releases-json.yml@6dc31870ca6c4f8489bf5a408ab38fae60f47eec
with:
repository: moby/moby
artifact_name: docker-releases-json
filename: docker-releases.json
secrets: inherit
open-pr:
runs-on: ubuntu-22.04
if: github.event_name != 'pull_request'
needs:
- generate
steps:
-
name: Checkout
uses: actions/checkout@v4
-
name: Download
uses: actions/download-artifact@v3
with:
name: docker-releases-json
path: .github
-
name: Commit changes
run: |
git add -A .
-
name: Create PR
uses: peter-evans/create-pull-request@153407881ec5c347639a548ade7d8ad1d6740e38
with:
base: main
branch: bot/docker-releases-json
commit-message: "github: update .github/docker-releases.json"
signoff: true
delete-branch: true
title: "Update `.github/docker-releases.json`"
body: |
Update `.github/docker-releases.json` to keep in sync with [https://github.com/moby/moby](https://github.com/moby/moby).
draft: false

View File

@@ -1,5 +1,9 @@
name: publish
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on:
push:
tags:
@@ -11,13 +15,13 @@ jobs:
steps:
-
name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
uses: docker/setup-buildx-action@v3
-
name: Publish
uses: docker/bake-action@v2
uses: docker/bake-action@v4
with:
targets: publish
env:

View File

@@ -1,48 +1,114 @@
name: test
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on:
workflow_dispatch:
push:
branches:
- 'main'
pull_request:
paths-ignore:
- '.github/buildx-releases.json'
- '.github/*-releases.json'
env:
NODE_VERSION: "20"
jobs:
validate:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
target:
- lint
- vendor-validate
- license-validate
steps:
-
name: Checkout
uses: actions/checkout@v3
-
name: Validate
uses: docker/bake-action@v2
with:
targets: ${{ matrix.target }}
test:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
-
name: Test
uses: docker/bake-action@v2
uses: docker/bake-action@v4
with:
targets: test-coverage
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# -
# name: Upload coverage
# uses: codecov/codecov-action@v3
# with:
# file: ./coverage/clover.xml
-
name: Upload coverage
uses: codecov/codecov-action@v3
with:
file: ./coverage/clover.xml
flags: unit
prepare-itg:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.tests.outputs.matrix }}
steps:
-
name: Checkout
uses: actions/checkout@v4
-
name: Setup Node
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'yarn'
-
name: Install
run: yarn install
-
name: Create matrix
id: tests
run: |
declare -a tests
for test in $(yarn run test:itg-list); do
tests+=("${test#$(pwd)/__tests__/}")
done
echo "matrix=$(echo ${tests[@]} | jq -cR 'split(" ")')" >>${GITHUB_OUTPUT}
-
name: Show matrix
run: |
echo ${{ steps.tests.outputs.matrix }}
test-itg:
runs-on: ${{ matrix.os }}
needs:
- prepare-itg
strategy:
fail-fast: false
matrix:
test: ${{ fromJson(needs.prepare-itg.outputs.matrix) }}
os:
- ubuntu-latest
- macos-13
- macos-latest
- windows-latest
exclude:
- os: macos-13
test: buildx/bake.test.itg.ts
- os: macos-latest
test: buildx/bake.test.itg.ts
- os: windows-latest
test: buildx/bake.test.itg.ts
steps:
-
name: Checkout
uses: actions/checkout@v4
-
name: Setup Node
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'yarn'
-
name: Install
run: yarn install
-
name: Test
run: yarn test:itg-coverage --runTestsByPath __tests__/${{ matrix.test }} --coverageDirectory=./coverage
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-
name: Upload coverage
uses: codecov/codecov-action@v3
with:
file: ./coverage/clover.xml
flags: itg

47
.github/workflows/validate.yml vendored Normal file
View File

@@ -0,0 +1,47 @@
name: validate
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on:
workflow_dispatch:
push:
branches:
- 'main'
pull_request:
paths-ignore:
- '.github/*-releases.json'
jobs:
prepare:
runs-on: ubuntu-20.04
outputs:
targets: ${{ steps.targets.outputs.matrix }}
steps:
-
name: Checkout
uses: actions/checkout@v4
-
name: Matrix
id: targets
run: |
echo "matrix=$(docker buildx bake validate --print | jq -cr '.group.validate.targets')" >> $GITHUB_OUTPUT
validate:
runs-on: ubuntu-latest
needs:
- prepare
strategy:
fail-fast: false
matrix:
target: ${{ fromJson(needs.prepare.outputs.targets) }}
steps:
-
name: Checkout
uses: actions/checkout@v4
-
name: Validate
uses: docker/bake-action@v4
with:
targets: ${{ matrix.target }}

View File

@@ -23,7 +23,6 @@ jobs:
- ubuntu-latest
- ubuntu-22.04
- ubuntu-20.04
- ubuntu-18.04
steps:
-
name: File system
@@ -67,4 +66,4 @@ jobs:
-
name: Dump context
if: always()
uses: crazy-max/ghaction-dump-context@v1
uses: crazy-max/ghaction-dump-context@v2

View File

@@ -1,6 +1,9 @@
# Dependency directories
node_modules/
jspm_packages/
/node_modules/**
/jspm_packages/**
# yarn v2
.yarn/
/.yarn/**
# build
/lib/**

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

874
.yarn/releases/yarn-3.6.3.cjs vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,15 @@
logFilters:
- code: YN0013
level: discard
- code: YN0076
level: discard
nodeLinker: node-modules
npmAuthToken: "${NODE_AUTH_TOKEN:-fallback}"
plugins:
- path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
spec: "@yarnpkg/plugin-interactive-tools"
yarnPath: .yarn/releases/yarn-3.3.1.cjs
yarnPath: .yarn/releases/yarn-3.6.3.cjs

View File

@@ -1,3 +1,10 @@
[![Version](https://img.shields.io/npm/v/@docker/actions-toolkit?label=version&logo=npm&style=flat-square)](https://www.npmjs.com/package/@docker/actions-toolkit)
[![Downloads](https://img.shields.io/npm/dw/@docker/actions-toolkit?logo=npm&style=flat-square)](https://www.npmjs.com/package/@docker/actions-toolkit)
[![Build workflow](https://img.shields.io/github/actions/workflow/status/docker/actions-toolkit/build.yml?label=build&logo=github&style=flat-square)](https://github.com/docker/actions-toolkit/actions?workflow=build)
[![Test workflow](https://img.shields.io/github/actions/workflow/status/docker/actions-toolkit/test.yml?label=test&logo=github&style=flat-square)](https://github.com/docker/actions-toolkit/actions?workflow=test)
[![Validate workflow](https://img.shields.io/github/actions/workflow/status/docker/actions-toolkit/validate.yml?label=validate&logo=github&style=flat-square)](https://github.com/docker/actions-toolkit/actions?workflow=validate)
[![Codecov](https://img.shields.io/codecov/c/github/docker/actions-toolkit?logo=codecov&style=flat-square)](https://codecov.io/gh/docker/actions-toolkit)
# Actions Toolkit
Toolkit for Docker (GitHub) Actions.
@@ -34,7 +41,7 @@ $ npm install @docker/actions-toolkit
## Usage
```js
const { Toolkit } = require('@docker/actions-toolkit')
const { Toolkit } = require('@docker/actions-toolkit/lib/toolkit')
const toolkit = new Toolkit()
```

View File

@@ -1,201 +0,0 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {beforeEach, describe, expect, it, jest, test} from '@jest/globals';
import * as fs from 'fs';
import * as path from 'path';
import {Builder, BuilderInfo} from '../src/builder';
import {Context} from '../src/context';
beforeEach(() => {
jest.clearAllMocks();
});
jest.spyOn(Builder.prototype, 'inspect').mockImplementation(async (): Promise<BuilderInfo> => {
return {
name: 'builder2',
driver: 'docker-container',
lastActivity: new Date('2023-01-16 09:45:23 +0000 UTC'),
nodes: [
{
buildkitVersion: 'v0.11.0',
buildkitdFlags: '--debug --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host',
driverOpts: ['BUILDKIT_STEP_LOG_MAX_SIZE=10485760', 'BUILDKIT_STEP_LOG_MAX_SPEED=10485760', 'JAEGER_TRACE=localhost:6831', 'image=moby/buildkit:latest', 'network=host'],
endpoint: 'unix:///var/run/docker.sock',
name: 'builder20',
platforms: 'linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6',
status: 'running'
}
]
};
});
describe('inspect', () => {
it('valid', async () => {
const builder = new Builder({
context: new Context()
});
const builderInfo = await builder.inspect('');
expect(builderInfo).not.toBeUndefined();
expect(builderInfo.name).not.toEqual('');
expect(builderInfo.driver).not.toEqual('');
expect(builderInfo.nodes).not.toEqual({});
}, 100000);
});
describe('parseInspect', () => {
// prettier-ignore
test.each([
[
'inspect1.txt',
{
"name": "builder-5cb467f7-0940-47e1-b94b-d51f54054d62",
"driver": "docker-container",
"nodes": [
{
"name": "builder-5cb467f7-0940-47e1-b94b-d51f54054d620",
"endpoint": "unix:///var/run/docker.sock",
"status": "running",
"buildkitdFlags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
"buildkitVersion": "v0.10.4",
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/amd64/v4,linux/arm64,linux/riscv64,linux/386,linux/arm/v7,linux/arm/v6"
}
]
}
],
[
'inspect2.txt',
{
"name": "builder-5f449644-ff29-48af-8344-abb0292d0673",
"driver": "docker-container",
"nodes": [
{
"name": "builder-5f449644-ff29-48af-8344-abb0292d06730",
"endpoint": "unix:///var/run/docker.sock",
"driverOpts": [
"image=moby/buildkit:latest"
],
"status": "running",
"buildkitdFlags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
"buildkitVersion": "v0.10.4",
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/amd64/v4,linux/386"
}
]
}
],
[
'inspect3.txt',
{
"name": "builder-9929e463-7954-4dc3-89cd-514cca29ff80",
"driver": "docker-container",
"nodes": [
{
"name": "builder-9929e463-7954-4dc3-89cd-514cca29ff800",
"endpoint": "unix:///var/run/docker.sock",
"driverOpts": [
"image=moby/buildkit:master",
"network=host"
],
"status": "running",
"buildkitdFlags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
"buildkitVersion": "3fab389",
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/amd64/v4,linux/386"
}
]
}
],
[
'inspect4.txt',
{
"name": "default",
"driver": "docker",
"nodes": [
{
"name": "default",
"endpoint": "default",
"status": "running",
"buildkitVersion": "20.10.17",
"platforms": "linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/arm/v7,linux/arm/v6"
}
]
}
],
[
'inspect5.txt',
{
"name": "remote-builder",
"driver": "remote",
"nodes": [
{
"name": "aws_graviton2",
"endpoint": "tcp://1.23.45.67:1234",
"driverOpts": [
"cert=/home/user/.certs/aws_graviton2/cert.pem",
"key=/home/user/.certs/aws_graviton2/key.pem",
"cacert=/home/user/.certs/aws_graviton2/ca.pem"
],
"status": "running",
"platforms": "darwin/arm64,linux/arm64,linux/arm/v5,linux/arm/v6,linux/arm/v7,windows/arm64"
}
]
}
],
[
'inspect6.txt',
{
"nodes": [
{
"name": "builder-17cfff01-48d9-4c3d-9332-9992e308a5100",
"endpoint": "unix:///var/run/docker.sock",
"status": "running",
"buildkitdFlags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/386"
}
],
"name": "builder-17cfff01-48d9-4c3d-9332-9992e308a510",
"driver": "docker-container"
}
],
[
'inspect7.txt',
{
"name": "builder2",
"driver": "docker-container",
"lastActivity": new Date("2023-01-16T09:45:23.000Z"),
"nodes": [
{
"buildkitVersion": "v0.11.0",
"buildkitdFlags": "--debug --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
"driverOpts": [
"BUILDKIT_STEP_LOG_MAX_SIZE=10485760",
"BUILDKIT_STEP_LOG_MAX_SPEED=10485760",
"JAEGER_TRACE=localhost:6831",
"image=moby/buildkit:latest",
"network=host"
],
"endpoint": "unix:///var/run/docker.sock",
"name": "builder20",
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6",
"status": "running"
}
]
}
]
])('given %p', async (inspectFile, expected) => {
expect(await Builder.parseInspect(fs.readFileSync(path.join(__dirname, 'fixtures', inspectFile)).toString())).toEqual(expected);
});
});

View File

@@ -1,121 +0,0 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {describe, expect, it, jest, test, beforeEach, afterEach} from '@jest/globals';
import * as fs from 'fs';
import * as path from 'path';
import rimraf from 'rimraf';
import * as semver from 'semver';
import {BuildKit} from '../src/buildkit';
import {Builder, BuilderInfo} from '../src/builder';
import {Context} from '../src/context';
const tmpDir = path.join('/tmp/.docker-actions-toolkit-jest').split(path.sep).join(path.posix.sep);
const tmpName = path.join(tmpDir, '.tmpname-jest').split(path.sep).join(path.posix.sep);
jest.spyOn(Context.prototype as any, 'tmpDir').mockImplementation((): string => {
if (!fs.existsSync(tmpDir)) {
fs.mkdirSync(tmpDir, {recursive: true});
}
return tmpDir;
});
jest.spyOn(Context.prototype as any, 'tmpName').mockImplementation((): string => {
return tmpName;
});
beforeEach(() => {
jest.clearAllMocks();
});
afterEach(() => {
rimraf.sync(tmpDir);
});
jest.spyOn(Builder.prototype, 'inspect').mockImplementation(async (): Promise<BuilderInfo> => {
return {
name: 'builder2',
driver: 'docker-container',
lastActivity: new Date('2023-01-16 09:45:23 +0000 UTC'),
nodes: [
{
buildkitVersion: 'v0.11.0',
buildkitdFlags: '--debug --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host',
driverOpts: ['BUILDKIT_STEP_LOG_MAX_SIZE=10485760', 'BUILDKIT_STEP_LOG_MAX_SPEED=10485760', 'JAEGER_TRACE=localhost:6831', 'image=moby/buildkit:latest', 'network=host'],
endpoint: 'unix:///var/run/docker.sock',
name: 'builder20',
platforms: 'linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6',
status: 'running'
}
]
};
});
describe('getVersion', () => {
it('valid', async () => {
const buildkit = new BuildKit({
context: new Context()
});
const version = await buildkit.getVersion('builder2');
expect(semver.valid(version)).not.toBeNull();
});
});
describe('satisfies', () => {
test.each([
['builder2', '>=0.10.0', true],
['builder2', '>0.11.0', false]
])('given %p', async (builderName, range, expected) => {
const buildkit = new BuildKit({
context: new Context()
});
expect(await buildkit.versionSatisfies(builderName, range)).toBe(expected);
});
});
describe('generateConfig', () => {
test.each([
['debug = true', false, 'debug = true', null],
[`notfound.toml`, true, '', new Error('config file notfound.toml not found')],
[
`${path.join(__dirname, 'fixtures', 'buildkitd.toml').split(path.sep).join(path.posix.sep)}`,
true,
`debug = true
[registry."docker.io"]
mirrors = ["mirror.gcr.io"]
`,
null
]
])('given %p config', async (val, file, exValue, error: Error) => {
try {
const buildkit = new BuildKit({
context: new Context()
});
let config: string;
if (file) {
config = buildkit.generateConfigFile(val);
} else {
config = buildkit.generateConfigInline(val);
}
expect(config).toEqual(tmpName);
const configValue = fs.readFileSync(tmpName, 'utf-8');
expect(configValue).toEqual(exValue);
} catch (e) {
// eslint-disable-next-line jest/no-conditional-expect
expect(e.message).toEqual(error?.message);
}
});
});

View File

@@ -0,0 +1,65 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {beforeEach, describe, expect, it, jest, test} from '@jest/globals';
import {BuildKit} from '../../src/buildkit/buildkit';
import {Builder} from '../../src/buildx/builder';
import {BuilderInfo} from '../../src/types/builder';
beforeEach(() => {
jest.clearAllMocks();
});
jest.spyOn(Builder.prototype, 'inspect').mockImplementation(async (): Promise<BuilderInfo> => {
return {
name: 'builder2',
driver: 'docker-container',
lastActivity: new Date('2023-01-16 09:45:23 +0000 UTC'),
nodes: [
{
buildkit: 'v0.11.0',
'buildkitd-flags': '--debug --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host',
'driver-opts': ['BUILDKIT_STEP_LOG_MAX_SIZE=10485760', 'BUILDKIT_STEP_LOG_MAX_SPEED=10485760', 'JAEGER_TRACE=localhost:6831', 'image=moby/buildkit:latest', 'network=host'],
endpoint: 'unix:///var/run/docker.sock',
name: 'builder20',
platforms: 'linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6',
status: 'running'
}
]
};
});
describe('getVersion', () => {
it('valid', async () => {
const builder = new Builder();
const builderInfo = await builder.inspect('builder2');
const buildkit = new BuildKit();
const version = await buildkit.getVersion(builderInfo.nodes[0]);
expect(version).toBe('v0.11.0');
});
});
describe('satisfies', () => {
test.each([
['builder2', '>=0.10.0', true],
['builder2', '>0.11.0', false]
])('given %p', async (builderName, range, expected) => {
const buildkit = new BuildKit();
expect(await buildkit.versionSatisfies(builderName, range)).toBe(expected);
});
});

View File

@@ -0,0 +1,79 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {describe, expect, jest, test, beforeEach, afterEach} from '@jest/globals';
import * as fs from 'fs';
import * as path from 'path';
import * as rimraf from 'rimraf';
import {BuildKit} from '../../src/buildkit/buildkit';
import {Context} from '../../src/context';
const fixturesDir = path.join(__dirname, '..', 'fixtures');
// prettier-ignore
const tmpDir = path.join(process.env.TEMP || '/tmp', 'buildkit-config-jest');
const tmpName = path.join(tmpDir, '.tmpname-jest');
jest.spyOn(Context, 'tmpDir').mockImplementation((): string => {
if (!fs.existsSync(tmpDir)) {
fs.mkdirSync(tmpDir, {recursive: true});
}
return tmpDir;
});
jest.spyOn(Context, 'tmpName').mockImplementation((): string => {
return tmpName;
});
beforeEach(() => {
jest.clearAllMocks();
});
afterEach(() => {
rimraf.sync(tmpDir);
});
describe('resolve', () => {
test.each([
['debug = true', false, 'debug = true', null],
[`notfound.toml`, true, '', new Error('config file notfound.toml not found')],
[
`${path.join(fixturesDir, 'buildkitd.toml')}`,
true,
`debug = true
[registry."docker.io"]
mirrors = ["mirror.gcr.io"]
`,
null
]
])('given %p config', async (val: string, file: boolean, exValue: string, error: Error | null) => {
try {
const buildkit = new BuildKit();
let config: string;
if (file) {
config = buildkit.config.resolveFromFile(val);
} else {
config = buildkit.config.resolveFromString(val);
}
expect(config).toEqual(tmpName);
const configValue = fs.readFileSync(tmpName, 'utf-8');
expect(configValue).toEqual(exValue);
} catch (e) {
// eslint-disable-next-line jest/no-conditional-expect
expect(e.message).toEqual(error?.message);
}
});
});

View File

@@ -0,0 +1,43 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {beforeEach, describe, expect, jest, test} from '@jest/globals';
import * as fs from 'fs';
import * as path from 'path';
import {Bake} from '../../src/buildx/bake';
import {BakeDefinition} from '../../src/types/bake';
const fixturesDir = path.join(__dirname, '..', 'fixtures');
beforeEach(() => {
jest.clearAllMocks();
});
describe('parseDefinitions', () => {
// prettier-ignore
test.each([
[
['https://github.com/docker/buildx.git#v0.10.4'],
['binaries-cross'],
path.join(fixturesDir, 'bake-buildx-0.10.4-binaries-cross.json')
]
])('given %p', async (sources: string[], targets: string[], out: string) => {
const bake = new Bake();
const expectedDef = <BakeDefinition>JSON.parse(fs.readFileSync(out, {encoding: 'utf-8'}).trim())
expect(await bake.parseDefinitions(sources, targets)).toEqual(expectedDef);
});
});

View File

@@ -0,0 +1,430 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {beforeEach, describe, expect, jest, test} from '@jest/globals';
import * as fs from 'fs';
import * as path from 'path';
import {Bake} from '../../src/buildx/bake';
import {BakeDefinition} from '../../src/types/bake';
const fixturesDir = path.join(__dirname, '..', 'fixtures');
beforeEach(() => {
jest.clearAllMocks();
});
describe('parseDefinitions', () => {
// prettier-ignore
test.each([
[
[path.join(fixturesDir, 'bake-01.hcl')],
['validate'],
[],
path.join(fixturesDir, 'bake-01-validate.json')
],
[
[path.join(fixturesDir, 'bake-02.hcl')],
['build'],
[],
path.join(fixturesDir, 'bake-02-build.json')
],
[
[path.join(fixturesDir, 'bake-01.hcl')],
['image'],
['*.output=type=docker', '*.platform=linux/amd64'],
path.join(fixturesDir, 'bake-01-overrides.json')
]
])('given %p', async (sources: string[], targets: string[], overrides: string[], out: string) => {
const bake = new Bake();
const expectedDef = <BakeDefinition>JSON.parse(fs.readFileSync(out, {encoding: 'utf-8'}).trim())
expect(await bake.parseDefinitions(sources, targets, overrides)).toEqual(expectedDef);
});
});
describe('hasLocalExporter', () => {
// prettier-ignore
test.each([
[
{
"target": {
"build": {
"output": [
"type=docker"
]
},
}
} as unknown as BakeDefinition,
false
],
[
{
"target": {
"build": {
"target": "build"
},
}
} as unknown as BakeDefinition,
false
],
[
{
"target": {
"local": {
"output": [
"type=local,dest=./release-out"
]
},
}
} as unknown as BakeDefinition,
true
],
[
{
"target": {
"tar": {
"output": [
"type=tar,dest=/tmp/image.tar"
]
},
}
} as unknown as BakeDefinition,
false
],
[
{
"target": {
"tar": {
"output": [
'"type=tar","dest=/tmp/image.tar"',
]
},
}
} as unknown as BakeDefinition,
false
],
[
{
"target": {
"local": {
"output": [
'" type= local" , dest=./release-out',
]
},
}
} as unknown as BakeDefinition,
true
],
[
{
"target": {
"local": {
"output": [
".",
]
},
}
} as unknown as BakeDefinition,
true
]
])('given %o returns %p', async (def: BakeDefinition, expected: boolean) => {
expect(Bake.hasLocalExporter(def)).toEqual(expected);
});
});
describe('hasTarExporter', () => {
// prettier-ignore
test.each([
[
{
"target": {
"reg": {
"output": [
"type=registry,ref=user/app"
]
},
}
} as unknown as BakeDefinition,
false
],
[
{
"target": {
"build": {
"output": [
"type=docker"
]
},
}
} as unknown as BakeDefinition,
false
],
[
{
"target": {
"local": {
"output": [
"type=local,dest=./release-out"
]
},
}
} as unknown as BakeDefinition,
false
],
[
{
"target": {
"tar": {
"output": [
"type=tar,dest=/tmp/image.tar"
]
},
}
} as unknown as BakeDefinition,
true
],
[
{
"target": {
"multi": {
"output": [
"type=docker",
"type=tar,dest=/tmp/image.tar"
]
},
}
} as unknown as BakeDefinition,
true
],
[
{
"target": {
"tar": {
"output": [
'"type=tar","dest=/tmp/image.tar"',
]
},
}
} as unknown as BakeDefinition,
true
],
[
{
"target": {
"local": {
"output": [
'" type= local" , dest=./release-out',
]
},
}
} as unknown as BakeDefinition,
false
],
[
{
"target": {
"local": {
"output": [
".",
]
},
}
} as unknown as BakeDefinition,
false
],
])('given %o returns %p', async (def: BakeDefinition, expected: boolean) => {
expect(Bake.hasTarExporter(def)).toEqual(expected);
});
});
describe('hasDockerExporter', () => {
// prettier-ignore
test.each([
[
{
"target": {
"reg": {
"output": [
"type=registry,ref=user/app"
]
},
}
} as unknown as BakeDefinition,
false,
undefined
],
[
{
"target": {
"build": {
"output": [
"type=docker"
]
},
}
} as unknown as BakeDefinition,
true,
undefined
],
[
{
"target": {
"multi": {
"output": [
"type=docker",
"type=tar,dest=/tmp/image.tar"
]
},
}
} as unknown as BakeDefinition,
true,
undefined
],
[
{
"target": {
"local": {
"output": [
'" type= local" , dest=./release-out'
]
},
}
} as unknown as BakeDefinition,
false,
undefined
],
[
{
"target": {
"local": {
"output": [
"type=local,dest=./release-out"
]
},
}
} as unknown as BakeDefinition,
false,
undefined
],
[
{
"target": {
"tar": {
"output": [
"type=tar,dest=/tmp/image.tar"
]
},
}
} as unknown as BakeDefinition,
false,
undefined
],
[
{
"target": {
"multi": {
"output": [
"type=docker",
"type=tar,dest=/tmp/image.tar"
]
},
}
} as unknown as BakeDefinition,
true,
undefined
],
[
{
"target": {
"tar": {
"output": [
'"type=tar","dest=/tmp/image.tar"'
]
},
}
} as unknown as BakeDefinition,
false,
undefined
],
[
{
"target": {
"tar": {
"output": [
'"type=tar","dest=/tmp/image.tar"'
]
},
}
} as unknown as BakeDefinition,
false,
undefined
],
[
{
"target": {
"local": {
"output": [
'" type= local" , dest=./release-out'
]
},
}
} as unknown as BakeDefinition,
false,
undefined
],
[
{
"target": {
"build": {
"output": [
"type=docker"
]
},
}
} as unknown as BakeDefinition,
true,
false
],
[
{
"target": {
"build": {
"output": [
"type=docker"
]
},
}
} as unknown as BakeDefinition,
true,
true
],
[
{
"target": {
"build": {
"output": [
"."
]
},
}
} as unknown as BakeDefinition,
true,
true
],
])('given %o and load:%p returns %p', async (def: BakeDefinition, expected: boolean, load: boolean | undefined) => {
expect(Bake.hasDockerExporter(def, load)).toEqual(expected);
});
});

View File

@@ -0,0 +1,400 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {beforeEach, describe, expect, it, jest, test} from '@jest/globals';
import * as fs from 'fs';
import * as path from 'path';
import {Builder} from '../../src/buildx/builder';
import {Exec} from '../../src/exec';
import {BuilderInfo} from '../../src/types/builder';
const fixturesDir = path.join(__dirname, '..', 'fixtures');
beforeEach(() => {
jest.clearAllMocks();
});
jest.spyOn(Builder.prototype, 'inspect').mockImplementation(async (): Promise<BuilderInfo> => {
return {
name: 'builder2',
driver: 'docker-container',
lastActivity: new Date('2023-01-16 09:45:23 +0000 UTC'),
nodes: [
{
buildkit: 'v0.11.0',
'buildkitd-flags': '--debug --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host',
'driver-opts': ['BUILDKIT_STEP_LOG_MAX_SIZE=10485760', 'BUILDKIT_STEP_LOG_MAX_SPEED=10485760', 'JAEGER_TRACE=localhost:6831', 'image=moby/buildkit:latest', 'network=host', 'qemu.install=true'],
endpoint: 'unix:///var/run/docker.sock',
name: 'builder20',
platforms: 'linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6',
status: 'running'
}
]
};
});
describe('exists', () => {
it('valid', async () => {
const execSpy = jest.spyOn(Exec, 'getExecOutput');
const builder = new Builder();
await builder.exists('foo');
// eslint-disable-next-line jest/no-standalone-expect
expect(execSpy).toHaveBeenCalledWith(`docker`, ['buildx', 'inspect', 'foo'], {
silent: true,
ignoreReturnCode: true
});
});
});
describe('inspect', () => {
it('valid', async () => {
const builder = new Builder();
const builderInfo = await builder.inspect('');
expect(builderInfo).not.toBeUndefined();
expect(builderInfo.name).not.toEqual('');
expect(builderInfo.driver).not.toEqual('');
expect(builderInfo.nodes).not.toEqual({});
}, 100000);
});
describe('parseInspect', () => {
// prettier-ignore
test.each([
[
'inspect1.txt',
{
"name": "builder-5cb467f7-0940-47e1-b94b-d51f54054d62",
"driver": "docker-container",
"nodes": [
{
"name": "builder-5cb467f7-0940-47e1-b94b-d51f54054d620",
"endpoint": "unix:///var/run/docker.sock",
"status": "running",
"buildkitd-flags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
"buildkit": "v0.10.4",
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/amd64/v4,linux/arm64,linux/riscv64,linux/386,linux/arm/v7,linux/arm/v6"
}
]
}
],
[
'inspect2.txt',
{
"name": "builder-5f449644-ff29-48af-8344-abb0292d0673",
"driver": "docker-container",
"nodes": [
{
"name": "builder-5f449644-ff29-48af-8344-abb0292d06730",
"endpoint": "unix:///var/run/docker.sock",
"driver-opts": [
"image=moby/buildkit:latest"
],
"status": "running",
"buildkitd-flags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
"buildkit": "v0.10.4",
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/amd64/v4,linux/386"
}
]
}
],
[
'inspect3.txt',
{
"name": "builder-9929e463-7954-4dc3-89cd-514cca29ff80",
"driver": "docker-container",
"nodes": [
{
"name": "builder-9929e463-7954-4dc3-89cd-514cca29ff800",
"endpoint": "unix:///var/run/docker.sock",
"driver-opts": [
"image=moby/buildkit:master",
"network=host"
],
"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"
}
]
}
],
[
'inspect4.txt',
{
"name": "default",
"driver": "docker",
"nodes": [
{
"name": "default",
"endpoint": "default",
"status": "running",
"buildkit": "20.10.17",
"platforms": "linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/arm/v7,linux/arm/v6"
}
]
}
],
[
'inspect5.txt',
{
"name": "remote-builder",
"driver": "remote",
"nodes": [
{
"name": "aws_graviton2",
"endpoint": "tcp://1.23.45.67:1234",
"driver-opts": [
"cert=/home/user/.certs/aws_graviton2/cert.pem",
"key=/home/user/.certs/aws_graviton2/key.pem",
"cacert=/home/user/.certs/aws_graviton2/ca.pem"
],
"status": "running",
"platforms": "darwin/arm64,linux/arm64,linux/arm/v5,linux/arm/v6,linux/arm/v7,windows/arm64"
}
]
}
],
[
'inspect6.txt',
{
"nodes": [
{
"name": "builder-17cfff01-48d9-4c3d-9332-9992e308a5100",
"endpoint": "unix:///var/run/docker.sock",
"status": "running",
"buildkitd-flags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/386"
}
],
"name": "builder-17cfff01-48d9-4c3d-9332-9992e308a510",
"driver": "docker-container"
}
],
[
'inspect7.txt',
{
"name": "builder2",
"driver": "docker-container",
"lastActivity": new Date("2023-01-16T09:45:23.000Z"),
"nodes": [
{
"buildkit": "v0.11.0",
"buildkitd-flags": "--debug --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
"driver-opts": [
"env.BUILDKIT_STEP_LOG_MAX_SIZE=10485760",
"env.BUILDKIT_STEP_LOG_MAX_SPEED=10485760",
"env.JAEGER_TRACE=localhost:6831",
"image=moby/buildkit:latest",
"network=host",
"qemu.install=true"
],
"endpoint": "unix:///var/run/docker.sock",
"name": "builder20",
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6",
"status": "running"
}
]
}
],
[
'inspect8.txt',
{
"name": "builder-52aa0611-faf0-42ac-a940-461e4e287d68",
"driver": "docker-container",
"lastActivity": new Date("2023-06-13T13:52:31.000Z"),
"nodes": [
{
"buildkit": "v0.11.6",
"buildkitd-flags": "--debug --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
"driver-opts": [
"image=moby/buildkit:buildx-stable-1",
"network=host",
],
"endpoint": "unix:///var/run/docker.sock",
"name": "builder-52aa0611-faf0-42ac-a940-461e4e287d680",
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/amd64/v4,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6",
"status": "running",
"labels": {
"org.mobyproject.buildkit.worker.executor": "oci",
"org.mobyproject.buildkit.worker.hostname": "fv-az572-38",
"org.mobyproject.buildkit.worker.network": "host",
"org.mobyproject.buildkit.worker.oci.process-mode": "sandbox",
"org.mobyproject.buildkit.worker.selinux.enabled": "false",
"org.mobyproject.buildkit.worker.snapshotter": "overlayfs",
},
"gcPolicy": [
{
"all": false,
"filter": [
"type==source.local",
"type==exec.cachemount",
"type==source.git.checkout"
],
"keepDuration": "48h0m0s",
"keepBytes": "488.3MiB",
},
{
"all": false,
"keepDuration": "1440h0m0s",
"keepBytes": "8.382GiB",
},
{
"all": false,
"keepBytes": "8.382GiB",
},
{
"all": true,
"keepBytes": "8.382GiB",
}
]
}
]
}
],
[
'inspect9.txt',
{
"name": "default",
"driver": "docker",
"lastActivity": new Date("2023-06-13T18:13:43.000Z"),
"nodes": [
{
"buildkit": "v0.11.7-0.20230525183624-798ad6b0ce9f",
"endpoint": "default",
"name": "default",
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6",
"status": "running",
"gcPolicy": [
{
"all": true,
"keepBytes": "100GiB",
}
]
}
]
}
],
[
'inspect10.txt',
{
"name": "remote-builder",
"driver": "remote",
"lastActivity": new Date("2023-04-20T12:47:49.000Z"),
"nodes": [
{
"name": "remote-builder0",
"endpoint": "docker-container://buildx_buildkit_dk-remote-builder0",
"status": "inactive"
},
{
"name": "aws_graviton2",
"endpoint": "tcp://10.0.0.1:1234",
"driver-opts": [
"cacert=/home/user/.certs/aws_graviton2/ca.pem",
"cert=/home/user/.certs/aws_graviton2/cert.pem",
"key=/home/user/.certs/aws_graviton2/key.pem"
],
"status": "running",
"buildkit": "v0.11.6",
"platforms": "darwin/arm64,linux/arm64,linux/arm/v5,linux/arm/v6,linux/arm/v7,windows/arm64",
"labels": {
"org.mobyproject.buildkit.worker.executor": "oci",
"org.mobyproject.buildkit.worker.hostname": "77ebc22e2d82",
"org.mobyproject.buildkit.worker.network": "host",
"org.mobyproject.buildkit.worker.oci.process-mode": "sandbox",
"org.mobyproject.buildkit.worker.selinux.enabled": "false",
"org.mobyproject.buildkit.worker.snapshotter": "overlayfs"
},
"gcPolicy": [
{
"all": false,
"filter": [
"type==source.local",
"type==exec.cachemount",
"type==source.git.checkout"
],
"keepDuration": "48h0m0s",
"keepBytes": "488.3MiB"
},
{
"all": false,
"keepDuration": "1440h0m0s",
"keepBytes": "23.28GiB"
},
{
"all": false,
"keepBytes": "23.28GiB"
},
{
"all": true,
"keepBytes": "23.28GiB"
}
]
},
{
"name": "linuxone_s390x",
"endpoint": "tcp://10.0.0.2:1234",
"driver-opts": [
"cacert=/home/user/.certs/linuxone_s390x/ca.pem",
"cert=/home/user/.certs/linuxone_s390x/cert.pem",
"key=/home/user/.certs/linuxone_s390x/key.pem"
],
"status": "running",
"buildkit": "v0.11.6",
"platforms": "linux/s390x",
"labels": {
"org.mobyproject.buildkit.worker.executor": "oci",
"org.mobyproject.buildkit.worker.hostname": "9d0d62a96818",
"org.mobyproject.buildkit.worker.network": "host",
"org.mobyproject.buildkit.worker.oci.process-mode": "sandbox",
"org.mobyproject.buildkit.worker.selinux.enabled": "false",
"org.mobyproject.buildkit.worker.snapshotter": "overlayfs"
},
"gcPolicy": [
{
"all": false,
"keepBytes": "488.3MiB",
"filter": [
"type==source.local",
"type==exec.cachemount",
"type==source.git.checkout"
],
"keepDuration": "48h0m0s"
},
{
"all": false,
"keepDuration": "1440h0m0s",
"keepBytes": "9.313GiB"
},
{
"all": false,
"keepBytes": "9.313GiB"
},
{
"all": true,
"keepBytes": "9.313GiB"
}
]
}
],
}
]
])('given %p', async (inspectFile, expected) => {
expect(await Builder.parseInspect(fs.readFileSync(path.join(fixturesDir, inspectFile)).toString())).toEqual(expected);
});
});

View File

@@ -0,0 +1,269 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {describe, expect, it, jest, test, beforeEach, afterEach} from '@jest/globals';
import * as fs from 'fs';
import * as path from 'path';
import * as rimraf from 'rimraf';
import * as semver from 'semver';
import {Buildx} from '../../src/buildx/buildx';
import {Context} from '../../src/context';
import {Exec} from '../../src/exec';
import {Cert} from '../../src/types/buildx';
// prettier-ignore
const tmpDir = path.join(process.env.TEMP || '/tmp', 'buildx-jest');
const tmpName = path.join(tmpDir, '.tmpname-jest');
jest.spyOn(Context, 'tmpDir').mockImplementation((): string => {
if (!fs.existsSync(tmpDir)) {
fs.mkdirSync(tmpDir, {recursive: true});
}
return tmpDir;
});
jest.spyOn(Context, 'tmpName').mockImplementation((): string => {
return tmpName;
});
beforeEach(() => {
jest.clearAllMocks();
});
afterEach(() => {
rimraf.sync(tmpDir);
});
describe('configDir', () => {
const originalEnv = process.env;
beforeEach(() => {
jest.resetModules();
process.env = {
...originalEnv,
BUILDX_CONFIG: '/var/docker/buildx',
DOCKER_CONFIG: '/var/docker/config'
};
});
afterEach(() => {
process.env = originalEnv;
});
it('returns default', async () => {
process.env.BUILDX_CONFIG = '';
expect(Buildx.configDir).toEqual(path.join('/var/docker/config', 'buildx'));
});
it('returns from env', async () => {
expect(Buildx.configDir).toEqual('/var/docker/buildx');
});
});
describe('certsDir', () => {
const originalEnv = process.env;
beforeEach(() => {
jest.resetModules();
process.env = {
...originalEnv,
BUILDX_CONFIG: '/var/docker/buildx'
};
});
afterEach(() => {
process.env = originalEnv;
});
it('returns default', async () => {
process.env.BUILDX_CONFIG = '/var/docker/buildx';
expect(Buildx.certsDir).toEqual(path.join('/var/docker/buildx', 'certs'));
});
});
describe('isAvailable', () => {
it('docker cli', async () => {
const execSpy = jest.spyOn(Exec, 'getExecOutput');
const buildx = new Buildx({
standalone: false
});
await buildx.isAvailable();
// eslint-disable-next-line jest/no-standalone-expect
expect(execSpy).toHaveBeenCalledWith(`docker`, ['buildx'], {
silent: true,
ignoreReturnCode: true
});
});
it('standalone', async () => {
const execSpy = jest.spyOn(Exec, 'getExecOutput');
const buildx = new Buildx({
standalone: true
});
await buildx.isAvailable();
// eslint-disable-next-line jest/no-standalone-expect
expect(execSpy).toHaveBeenCalledWith(`buildx`, [], {
silent: true,
ignoreReturnCode: true
});
});
});
describe('printInspect', () => {
it('prints builder2 instance', async () => {
const execSpy = jest.spyOn(Exec, 'exec');
const buildx = new Buildx({
standalone: true
});
await buildx.printInspect('builder2').catch(() => {
// noop
});
expect(execSpy).toHaveBeenCalledWith(`buildx`, ['inspect', 'builder2'], {
failOnStdErr: false
});
});
});
describe('printVersion', () => {
it('docker cli', async () => {
const execSpy = jest.spyOn(Exec, 'exec');
const buildx = new Buildx({
standalone: false
});
await buildx.printVersion();
expect(execSpy).toHaveBeenCalledWith(`docker`, ['buildx', 'version'], {
failOnStdErr: false
});
});
it('standalone', async () => {
const execSpy = jest.spyOn(Exec, 'exec');
const buildx = new Buildx({
standalone: true
});
await buildx.printVersion();
expect(execSpy).toHaveBeenCalledWith(`buildx`, ['version'], {
failOnStdErr: false
});
});
});
describe('version', () => {
it('valid', async () => {
const buildx = new Buildx();
expect(semver.valid(await buildx.version())).not.toBeUndefined();
});
});
describe('parseVersion', () => {
test.each([
['github.com/docker/buildx 0.4.1+azure bda4882a65349ca359216b135896bddc1d92461c', '0.4.1'],
['github.com/docker/buildx v0.4.1 bda4882a65349ca359216b135896bddc1d92461c', '0.4.1'],
['github.com/docker/buildx v0.4.2 fb7b670b764764dc4716df3eba07ffdae4cc47b2', '0.4.2'],
['github.com/docker/buildx f117971 f11797113e5a9b86bd976329c5dbb8a8bfdfadfa', 'f117971']
])('given %p', async (stdout, expected) => {
expect(Buildx.parseVersion(stdout)).toEqual(expected);
});
});
describe('versionSatisfies', () => {
test.each([
['0.4.1', '>=0.3.2', true],
['bda4882a65349ca359216b135896bddc1d92461c', '>0.1.0', false],
['f117971', '>0.6.0', true]
])('given %p', async (version, range, expected) => {
const buildx = new Buildx();
expect(await buildx.versionSatisfies(range, version)).toBe(expected);
});
});
describe('resolveCertsDriverOpts', () => {
const originalEnv = process.env;
beforeEach(() => {
jest.resetModules();
process.env = {
...originalEnv,
BUILDX_CONFIG: path.join(tmpDir, 'resolveCertsDriverOpts', 'buildx')
};
});
afterEach(() => {
process.env = originalEnv;
rimraf.sync(path.join(tmpDir, 'resolveCertsDriverOpts', 'buildx'));
});
// prettier-ignore
test.each([
[
1,
'mycontext',
'docker-container',
{},
[],
[]
],
[
2,
'docker-container://mycontainer',
'docker-container',
{},
[],
[]
],
[
3,
'tcp://graviton2:1234',
'remote',
{},
[],
[]
],
[
4,
'tcp://graviton2:1234',
'remote',
{
cacert: 'foo',
cert: 'foo',
key: 'foo',
} as Cert,
[
path.join(tmpDir, 'resolveCertsDriverOpts', 'buildx', 'certs', 'cacert_graviton2-1234.pem'),
path.join(tmpDir, 'resolveCertsDriverOpts', 'buildx', 'certs', 'cert_graviton2-1234.pem'),
path.join(tmpDir, 'resolveCertsDriverOpts', 'buildx', 'certs', 'key_graviton2-1234.pem')
],
[
`cacert=${path.join(tmpDir, 'resolveCertsDriverOpts', 'buildx', 'certs', 'cacert_graviton2-1234.pem')}`,
`cert=${path.join(tmpDir, 'resolveCertsDriverOpts', 'buildx', 'certs', 'cert_graviton2-1234.pem')}`,
`key=${path.join(tmpDir, 'resolveCertsDriverOpts', 'buildx', 'certs', 'key_graviton2-1234.pem')}`
]
],
[
5,
'tcp://mybuilder:1234',
'docker-container',
{
cacert: 'foo',
cert: 'foo',
key: 'foo',
} as Cert,
[
path.join(tmpDir, 'resolveCertsDriverOpts', 'buildx', 'certs', 'cacert_mybuilder-1234.pem'),
path.join(tmpDir, 'resolveCertsDriverOpts', 'buildx', 'certs', 'cert_mybuilder-1234.pem'),
path.join(tmpDir, 'resolveCertsDriverOpts', 'buildx', 'certs', 'key_mybuilder-1234.pem')
],
[]
],
])('%p. given %p endpoint, %p driver', async (id: number, endpoint: string, driver: string, cert: Cert, expectedFiles: Array<string>, expectedOpts: Array<string>) => {
fs.mkdirSync(Buildx.certsDir, {recursive: true});
expect(Buildx.resolveCertsDriverOpts(driver, endpoint, cert)).toEqual(expectedOpts);
for (const k in expectedFiles) {
const file = expectedFiles[k];
expect(fs.existsSync(file)).toBe(true);
}
});
});

View File

@@ -14,30 +14,31 @@
* limitations under the License.
*/
import {describe, expect, it, jest, test, beforeEach, afterEach} from '@jest/globals';
import {afterEach, beforeEach, describe, expect, it, jest, test} from '@jest/globals';
import * as fs from 'fs';
import * as path from 'path';
import rimraf from 'rimraf';
import * as semver from 'semver';
import * as exec from '@actions/exec';
import * as rimraf from 'rimraf';
import {Buildx} from '../src/buildx';
import {Context} from '../src/context';
import {Context} from '../../src/context';
import {Inputs} from '../../src/buildx/inputs';
const tmpDir = path.join('/tmp/.docker-actions-toolkit-jest').split(path.sep).join(path.posix.sep);
const tmpName = path.join(tmpDir, '.tmpname-jest').split(path.sep).join(path.posix.sep);
const fixturesDir = path.join(__dirname, '..', 'fixtures');
// prettier-ignore
const tmpDir = path.join(process.env.TEMP || '/tmp', 'buildx-inputs-jest');
const tmpName = path.join(tmpDir, '.tmpname-jest');
const metadata = `{
"containerimage.config.digest": "sha256:059b68a595b22564a1cbc167af369349fdc2ecc1f7bc092c2235cbf601a795fd",
"containerimage.digest": "sha256:b09b9482c72371486bb2c1d2c2a2633ed1d0b8389e12c8d52b9e052725c0c83c"
}`;
jest.spyOn(Context.prototype as any, 'tmpDir').mockImplementation((): string => {
jest.spyOn(Context, 'tmpDir').mockImplementation((): string => {
if (!fs.existsSync(tmpDir)) {
fs.mkdirSync(tmpDir, {recursive: true});
}
return tmpDir;
});
jest.spyOn(Context.prototype as any, 'tmpName').mockImplementation((): string => {
jest.spyOn(Context, 'tmpName').mockImplementation((): string => {
return tmpName;
});
@@ -49,146 +50,30 @@ afterEach(() => {
rimraf.sync(tmpDir);
});
describe('isAvailable', () => {
it('docker cli', async () => {
const execSpy = jest.spyOn(exec, 'getExecOutput');
const buildx = new Buildx({
context: new Context(),
standalone: false
});
buildx.isAvailable().catch(() => {
// noop
});
// eslint-disable-next-line jest/no-standalone-expect
expect(execSpy).toHaveBeenCalledWith(`docker`, ['buildx'], {
silent: true,
ignoreReturnCode: true
});
});
it('standalone', async () => {
const execSpy = jest.spyOn(exec, 'getExecOutput');
const buildx = new Buildx({
context: new Context(),
standalone: true
});
buildx.isAvailable().catch(() => {
// noop
});
// eslint-disable-next-line jest/no-standalone-expect
expect(execSpy).toHaveBeenCalledWith(`buildx`, [], {
silent: true,
ignoreReturnCode: true
});
});
});
describe('printInspect', () => {
it('prints builder2 instance', () => {
const execSpy = jest.spyOn(exec, 'exec');
const buildx = new Buildx({
context: new Context(),
standalone: true
});
buildx.printInspect('builder2').catch(() => {
// noop
});
expect(execSpy).toHaveBeenCalledWith(`buildx`, ['inspect', 'builder2'], {
failOnStdErr: false
});
});
});
describe('printVersion', () => {
it('docker cli', () => {
const execSpy = jest.spyOn(exec, 'exec');
const buildx = new Buildx({
context: new Context(),
standalone: false
});
buildx.printVersion();
expect(execSpy).toHaveBeenCalledWith(`docker`, ['buildx', 'version'], {
failOnStdErr: false
});
});
it('standalone', () => {
const execSpy = jest.spyOn(exec, 'exec');
const buildx = new Buildx({
context: new Context(),
standalone: true
});
buildx.printVersion();
expect(execSpy).toHaveBeenCalledWith(`buildx`, ['version'], {
failOnStdErr: false
});
});
});
describe('version', () => {
it('valid', async () => {
const buildx = new Buildx({
context: new Context()
});
expect(semver.valid(await buildx.version)).not.toBeUndefined();
});
});
describe('parseVersion', () => {
test.each([
['github.com/docker/buildx 0.4.1+azure bda4882a65349ca359216b135896bddc1d92461c', '0.4.1'],
['github.com/docker/buildx v0.4.1 bda4882a65349ca359216b135896bddc1d92461c', '0.4.1'],
['github.com/docker/buildx v0.4.2 fb7b670b764764dc4716df3eba07ffdae4cc47b2', '0.4.2'],
['github.com/docker/buildx f117971 f11797113e5a9b86bd976329c5dbb8a8bfdfadfa', 'f117971']
])('given %p', async (stdout, expected) => {
expect(Buildx.parseVersion(stdout)).toEqual(expected);
});
});
describe('versionSatisfies', () => {
test.each([
['0.4.1', '>=0.3.2', true],
['bda4882a65349ca359216b135896bddc1d92461c', '>0.1.0', false],
['f117971', '>0.6.0', true]
])('given %p', async (version, range, expected) => {
const buildx = new Buildx({
context: new Context()
});
expect(await buildx.versionSatisfies(range, version)).toBe(expected);
});
});
describe('getBuildImageID', () => {
describe('resolveBuildImageID', () => {
it('matches', async () => {
const buildx = new Buildx({
context: new Context()
});
const imageID = 'sha256:bfb45ab72e46908183546477a08f8867fc40cebadd00af54b071b097aed127a9';
const imageIDFile = buildx.getBuildImageIDFilePath();
const imageIDFile = Inputs.getBuildImageIDFilePath();
await fs.writeFileSync(imageIDFile, imageID);
const expected = buildx.getBuildImageID();
const expected = Inputs.resolveBuildImageID();
expect(expected).toEqual(imageID);
});
});
describe('getBuildMetadata', () => {
describe('resolveBuildMetadata', () => {
it('matches', async () => {
const buildx = new Buildx({
context: new Context()
});
const metadataFile = buildx.getBuildMetadataFilePath();
const metadataFile = Inputs.getBuildMetadataFilePath();
await fs.writeFileSync(metadataFile, metadata);
const expected = buildx.getBuildMetadata();
const expected = Inputs.resolveBuildMetadata();
expect(expected).toEqual(metadata);
});
});
describe('getDigest', () => {
describe('resolveDigest', () => {
it('matches', async () => {
const buildx = new Buildx({
context: new Context()
});
const metadataFile = buildx.getBuildMetadataFilePath();
const metadataFile = Inputs.getBuildMetadataFilePath();
await fs.writeFileSync(metadataFile, metadata);
const expected = buildx.getDigest();
const expected = Inputs.resolveDigest();
expect(expected).toEqual('sha256:b09b9482c72371486bb2c1d2c2a2633ed1d0b8389e12c8d52b9e052725c0c83c');
});
});
@@ -235,14 +120,11 @@ describe('getProvenanceInput', () => {
],
])('given input %p', async (input: string, expected: string) => {
await setInput('provenance', input);
const buildx = new Buildx({
context: new Context()
});
expect(buildx.getProvenanceInput('provenance')).toEqual(expected);
expect(Inputs.getProvenanceInput('provenance')).toEqual(expected);
});
});
describe('getProvenanceAttrs', () => {
describe('resolveProvenanceAttrs', () => {
// prettier-ignore
test.each([
[
@@ -266,42 +148,11 @@ describe('getProvenanceAttrs', () => {
'builder-id=https://github.com/docker/actions-toolkit/actions/runs/123'
],
])('given %p', async (input: string, expected: string) => {
const buildx = new Buildx({
context: new Context()
});
expect(buildx.getProvenanceAttrs(input)).toEqual(expected);
expect(Inputs.resolveProvenanceAttrs(input)).toEqual(expected);
});
});
describe('getRelease', () => {
it('returns latest buildx GitHub release', async () => {
const release = await Buildx.getRelease('latest');
expect(release).not.toBeNull();
expect(release?.tag_name).not.toEqual('');
});
it('returns v0.10.1 buildx GitHub release', async () => {
const release = await Buildx.getRelease('v0.10.1');
expect(release).not.toBeNull();
expect(release?.id).toEqual(90346950);
expect(release?.tag_name).toEqual('v0.10.1');
expect(release?.html_url).toEqual('https://github.com/docker/buildx/releases/tag/v0.10.1');
});
it('returns v0.2.2 buildx GitHub release', async () => {
const release = await Buildx.getRelease('v0.2.2');
expect(release).not.toBeNull();
expect(release?.id).toEqual(17671545);
expect(release?.tag_name).toEqual('v0.2.2');
expect(release?.html_url).toEqual('https://github.com/docker/buildx/releases/tag/v0.2.2');
});
it('unknown release', async () => {
await expect(Buildx.getRelease('foo')).rejects.toThrowError(new Error('Cannot find Buildx release foo in https://raw.githubusercontent.com/docker/buildx/master/.github/releases.json'));
});
});
describe('generateBuildSecret', () => {
describe('resolveBuildSecret', () => {
test.each([
['A_SECRET=abcdef0123456789', false, 'A_SECRET', 'abcdef0123456789', null],
['GIT_AUTH_TOKEN=abcdefghijklmno=0123456789', false, 'GIT_AUTH_TOKEN', 'abcdefghijklmno=0123456789', null],
@@ -309,18 +160,15 @@ describe('generateBuildSecret', () => {
['aaaaaaaa', false, '', '', new Error('aaaaaaaa is not a valid secret')],
['aaaaaaaa=', false, '', '', new Error('aaaaaaaa= is not a valid secret')],
['=bbbbbbb', false, '', '', new Error('=bbbbbbb is not a valid secret')],
[`foo=${path.join(__dirname, 'fixtures', 'secret.txt').split(path.sep).join(path.posix.sep)}`, true, 'foo', 'bar', null],
[`foo=${path.join(fixturesDir, 'secret.txt')}`, true, 'foo', 'bar', null],
[`notfound=secret`, true, '', '', new Error('secret file secret not found')]
])('given %p key and %p secret', async (kvp: string, file: boolean, exKey: string, exValue: string, error: Error) => {
])('given %p key and %p secret', async (kvp: string, file: boolean, exKey: string, exValue: string, error: Error | null) => {
try {
const buildx = new Buildx({
context: new Context()
});
let secret: string;
if (file) {
secret = buildx.generateBuildSecretFile(kvp);
secret = Inputs.resolveBuildSecretFile(kvp);
} else {
secret = buildx.generateBuildSecretString(kvp);
secret = Inputs.resolveBuildSecretString(kvp);
}
expect(secret).toEqual(`id=${exKey},src=${tmpName}`);
expect(fs.readFileSync(tmpName, 'utf-8')).toEqual(exValue);
@@ -329,6 +177,21 @@ describe('generateBuildSecret', () => {
expect(e.message).toEqual(error?.message);
}
});
test.each([
['FOO=bar', 'FOO', 'bar', null],
['FOO=', 'FOO', '', new Error('FOO= is not a valid secret')],
['=bar', '', '', new Error('=bar is not a valid secret')],
['FOO=bar=baz', 'FOO', 'bar=baz', null]
])('given %p key and %p env', async (kvp: string, exKey: string, exValue: string, error: Error | null) => {
try {
const secret = Inputs.resolveBuildSecretEnv(kvp);
expect(secret).toEqual(`id=${exKey},env=${exValue}`);
} catch (e) {
// eslint-disable-next-line jest/no-conditional-expect
expect(e.message).toEqual(error?.message);
}
});
});
describe('hasLocalExporter', () => {
@@ -343,7 +206,7 @@ describe('hasLocalExporter', () => {
[['" type= local" , dest=./release-out'], true],
[['.'], true]
])('given %p returns %p', async (exporters: Array<string>, expected: boolean) => {
expect(Buildx.hasLocalExporter(exporters)).toEqual(expected);
expect(Inputs.hasLocalExporter(exporters)).toEqual(expected);
});
});
@@ -359,7 +222,7 @@ describe('hasTarExporter', () => {
[['" type= local" , dest=./release-out'], false],
[['.'], false]
])('given %p returns %p', async (exporters: Array<string>, expected: boolean) => {
expect(Buildx.hasTarExporter(exporters)).toEqual(expected);
expect(Inputs.hasTarExporter(exporters)).toEqual(expected);
});
});
@@ -373,9 +236,11 @@ describe('hasDockerExporter', () => {
[['type=docker', 'type=tar,dest=/tmp/image.tar'], true, undefined],
[['"type=tar","dest=/tmp/image.tar"'], false, undefined],
[['" type= local" , dest=./release-out'], false, undefined],
[['type=docker'], true, false],
[['type=docker'], true, true],
[['.'], true, true],
])('given %p returns %p', async (exporters: Array<string>, expected: boolean, load: boolean | undefined) => {
expect(Buildx.hasDockerExporter(exporters, load)).toEqual(expected);
expect(Inputs.hasDockerExporter(exporters, load)).toEqual(expected);
});
});
@@ -385,7 +250,7 @@ describe('hasGitAuthTokenSecret', () => {
[['A_SECRET=abcdef0123456789'], false],
[['GIT_AUTH_TOKEN=abcdefghijklmno=0123456789'], true],
])('given %p secret', async (kvp: Array<string>, expected: boolean) => {
expect(Buildx.hasGitAuthTokenSecret(kvp)).toBe(expected);
expect(Inputs.hasGitAuthTokenSecret(kvp)).toBe(expected);
});
});

View File

@@ -0,0 +1,181 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {describe, expect, it, jest, test, beforeEach, afterEach} from '@jest/globals';
import * as fs from 'fs';
import * as path from 'path';
import * as rimraf from 'rimraf';
import osm = require('os');
import {Install} from '../../src/buildx/install';
// prettier-ignore
const tmpDir = path.join(process.env.TEMP || '/tmp', 'buildx-jest');
beforeEach(() => {
jest.clearAllMocks();
});
afterEach(function () {
rimraf.sync(tmpDir);
});
describe('download', () => {
// prettier-ignore
test.each([
['v0.9.0', false],
['v0.10.5', true],
['latest', true]
])(
'acquires %p of buildx (standalone: %p)', async (version, standalone) => {
const install = new Install({standalone: standalone});
const toolPath = await install.download(version);
expect(fs.existsSync(toolPath)).toBe(true);
let buildxBin: string;
if (standalone) {
buildxBin = await install.installStandalone(toolPath, tmpDir);
} else {
buildxBin = await install.installPlugin(toolPath, tmpDir);
}
expect(fs.existsSync(buildxBin)).toBe(true);
},
100000
);
// prettier-ignore
test.each([
// following versions are already cached to htc from previous test cases
['v0.9.0'],
['v0.10.5'],
])(
'acquires %p of buildx with cache', async (version) => {
const install = new Install({standalone: false});
const toolPath = await install.download(version);
expect(fs.existsSync(toolPath)).toBe(true);
});
// TODO: add tests for arm
// prettier-ignore
test.each([
['win32', 'x64'],
['win32', 'arm64'],
['darwin', 'x64'],
['darwin', 'arm64'],
['linux', 'x64'],
['linux', 'arm64'],
['linux', 'ppc64'],
['linux', 's390x'],
])(
'acquires buildx for %s/%s', async (os, arch) => {
jest.spyOn(osm, 'platform').mockImplementation(() => os as NodeJS.Platform);
jest.spyOn(osm, 'arch').mockImplementation(() => arch);
const install = new Install();
const buildxBin = await install.download('latest');
expect(fs.existsSync(buildxBin)).toBe(true);
},
100000
);
});
describe('build', () => {
// eslint-disable-next-line jest/no-disabled-tests
it.skip('builds refs/pull/648/head', async () => {
const install = new Install();
const toolPath = await install.build('https://github.com/docker/buildx.git#refs/pull/648/head');
expect(fs.existsSync(toolPath)).toBe(true);
const buildxBin = await install.installStandalone(toolPath, tmpDir);
expect(fs.existsSync(buildxBin)).toBe(true);
}, 100000);
// eslint-disable-next-line jest/no-disabled-tests
it.skip('builds 67bd6f4dc82a9cd96f34133dab3f6f7af803bb14', async () => {
const install = new Install();
const toolPath = await install.build('https://github.com/docker/buildx.git#67bd6f4dc82a9cd96f34133dab3f6f7af803bb14');
expect(fs.existsSync(toolPath)).toBe(true);
const buildxBin = await install.installPlugin(toolPath, tmpDir);
expect(fs.existsSync(buildxBin)).toBe(true);
}, 100000);
});
describe('getDownloadVersion', () => {
it('returns official latest download version', async () => {
const version = await Install.getDownloadVersion('latest');
expect(version.key).toEqual('official');
expect(version.version).toEqual('latest');
expect(version.downloadURL).toEqual('https://github.com/docker/buildx/releases/download/v%s/%s');
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/buildx-releases.json');
});
it('returns official v0.10.1 download version', async () => {
const version = await Install.getDownloadVersion('v0.10.1');
expect(version.key).toEqual('official');
expect(version.version).toEqual('v0.10.1');
expect(version.downloadURL).toEqual('https://github.com/docker/buildx/releases/download/v%s/%s');
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/buildx-releases.json');
});
it('returns lab latest download version', async () => {
const version = await Install.getDownloadVersion('lab:latest');
expect(version.key).toEqual('lab');
expect(version.version).toEqual('latest');
expect(version.downloadURL).toEqual('https://github.com/docker/buildx-desktop/releases/download/v%s/%s');
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/buildx-lab-releases.json');
});
it('returns lab v0.11.2-desktop.2 download version', async () => {
const version = await Install.getDownloadVersion('lab:v0.11.2-desktop.2');
expect(version.key).toEqual('lab');
expect(version.version).toEqual('v0.11.2-desktop.2');
expect(version.downloadURL).toEqual('https://github.com/docker/buildx-desktop/releases/download/v%s/%s');
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/buildx-lab-releases.json');
});
it('unknown repo', async () => {
await expect(Install.getDownloadVersion('foo:bar')).rejects.toThrow(new Error('Cannot find buildx version for foo:bar'));
});
});
describe('getRelease', () => {
it('returns latest official GitHub release', async () => {
const version = await Install.getDownloadVersion('latest');
const release = await Install.getRelease(version);
expect(release).not.toBeNull();
expect(release?.tag_name).not.toEqual('');
});
it('returns v0.10.1 official GitHub release', async () => {
const version = await Install.getDownloadVersion('v0.10.1');
const release = await Install.getRelease(version);
expect(release).not.toBeNull();
expect(release?.id).toEqual(90346950);
expect(release?.tag_name).toEqual('v0.10.1');
expect(release?.html_url).toEqual('https://github.com/docker/buildx/releases/tag/v0.10.1');
});
it('returns v0.11.2-desktop.2 lab GitHub release', async () => {
const version = await Install.getDownloadVersion('lab:v0.11.2-desktop.2');
const release = await Install.getRelease(version);
expect(release).not.toBeNull();
expect(release?.id).toEqual(118213369);
expect(release?.tag_name).toEqual('v0.11.2-desktop.2');
expect(release?.html_url).toEqual('https://github.com/docker/buildx-desktop/releases/tag/v0.11.2-desktop.2');
});
it('unknown release', async () => {
const version = await Install.getDownloadVersion('foo');
await expect(Install.getRelease(version)).rejects.toThrow(new Error('Cannot find Buildx release foo in https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/buildx-releases.json'));
});
});

View File

@@ -14,23 +14,25 @@
* limitations under the License.
*/
import fs from 'fs';
import path from 'path';
import rimraf from 'rimraf';
import * as fs from 'fs';
import * as path from 'path';
import * as rimraf from 'rimraf';
import {describe, expect, jest, it, beforeEach, afterEach} from '@jest/globals';
import {Context} from '../src/context';
const tmpDir = path.join('/tmp/.docker-actions-toolkit-jest').split(path.sep).join(path.posix.sep);
const tmpName = path.join(tmpDir, '.tmpname-jest').split(path.sep).join(path.posix.sep);
// prettier-ignore
const tmpDir = path.join(process.env.TEMP || '/tmp', 'context-jest');
const tmpName = path.join(tmpDir, '.tmpname-jest');
jest.spyOn(Context.prototype, 'tmpDir').mockImplementation((): string => {
jest.spyOn(Context, 'tmpDir').mockImplementation((): string => {
if (!fs.existsSync(tmpDir)) {
fs.mkdirSync(tmpDir, {recursive: true});
}
return tmpDir;
});
jest.spyOn(Context.prototype, 'tmpName').mockImplementation((): string => {
jest.spyOn(Context, 'tmpName').mockImplementation((): string => {
return tmpName;
});
@@ -42,16 +44,20 @@ afterEach(() => {
rimraf.sync(tmpDir);
});
describe('gitRef', () => {
it('returns refs/heads/master', async () => {
expect(Context.gitRef()).toEqual('refs/heads/master');
});
});
describe('gitContext', () => {
it('returns refs/heads/master', async () => {
const context = new Context();
expect(context.buildGitContext).toEqual('https://github.com/docker/actions-toolkit.git#refs/heads/master');
expect(Context.gitContext()).toEqual('https://github.com/docker/actions-toolkit.git#refs/heads/master');
});
});
describe('provenanceBuilderID', () => {
it('returns 123', async () => {
const context = new Context();
expect(context.provenanceBuilderID).toEqual('https://github.com/docker/actions-toolkit/actions/runs/123');
expect(Context.provenanceBuilderID()).toEqual('https://github.com/docker/actions-toolkit/actions/runs/123');
});
});

View File

@@ -1,78 +0,0 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {beforeEach, describe, expect, it, jest} from '@jest/globals';
import * as exec from '@actions/exec';
import {Docker} from '../src/docker';
beforeEach(() => {
jest.clearAllMocks();
});
describe('isAvailable', () => {
it('cli', () => {
const execSpy = jest.spyOn(exec, 'getExecOutput');
Docker.isAvailable();
// eslint-disable-next-line jest/no-standalone-expect
expect(execSpy).toHaveBeenCalledWith(`docker`, undefined, {
silent: true,
ignoreReturnCode: true
});
});
});
describe('printVersion', () => {
it('docker cli', () => {
const execSpy = jest.spyOn(exec, 'exec');
Docker.printVersion(false).catch(() => {
// noop
});
expect(execSpy).toHaveBeenCalledWith(`docker`, ['version'], {
failOnStdErr: false
});
});
it('standalone', () => {
const execSpy = jest.spyOn(exec, 'exec');
Docker.printVersion(true).catch(() => {
// noop
});
expect(execSpy).not.toHaveBeenCalledWith(`docker`, ['version'], {
failOnStdErr: false
});
});
});
describe('printInfo', () => {
it('docker cli', () => {
const execSpy = jest.spyOn(exec, 'exec');
Docker.printInfo(false).catch(() => {
// noop
});
expect(execSpy).toHaveBeenCalledWith(`docker`, ['info'], {
failOnStdErr: false
});
});
it('standalone', () => {
const execSpy = jest.spyOn(exec, 'exec');
Docker.printInfo(true).catch(() => {
// noop
});
expect(execSpy).not.toHaveBeenCalledWith(`docker`, ['info'], {
failOnStdErr: false
});
});
});

View File

@@ -0,0 +1,143 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {afterEach, beforeEach, describe, expect, it, jest} from '@jest/globals';
import * as fs from 'fs';
import path from 'path';
import * as io from '@actions/io';
import osm = require('os');
import * as rimraf from 'rimraf';
import {Docker} from '../../src/docker/docker';
import {Exec} from '../../src/exec';
import {ConfigFile} from '../../src/types/docker';
const fixturesDir = path.join(__dirname, '..', 'fixtures');
// prettier-ignore
const tmpDir = path.join(process.env.TEMP || '/tmp', 'docker-jest');
beforeEach(() => {
jest.clearAllMocks();
});
afterEach(function () {
rimraf.sync(tmpDir);
});
describe('configDir', () => {
const originalEnv = process.env;
beforeEach(() => {
jest.resetModules();
process.env = {
...originalEnv,
DOCKER_CONFIG: '/var/docker/config'
};
});
afterEach(() => {
process.env = originalEnv;
});
it('returns default', async () => {
process.env.DOCKER_CONFIG = '';
jest.spyOn(osm, 'homedir').mockImplementation(() => path.join('/tmp', 'home'));
expect(Docker.configDir).toEqual(path.join('/tmp', 'home', '.docker'));
});
it('returns from env', async () => {
expect(Docker.configDir).toEqual('/var/docker/config');
});
});
describe('configFile', () => {
const originalEnv = process.env;
beforeEach(() => {
jest.resetModules();
if (!fs.existsSync(tmpDir)) {
fs.mkdirSync(tmpDir, {recursive: true});
}
process.env = {
...originalEnv,
DOCKER_CONFIG: tmpDir
};
});
afterEach(() => {
process.env = originalEnv;
});
it('auths', async () => {
fs.copyFileSync(path.join(fixturesDir, 'docker-config-auths.json'), path.join(tmpDir, 'config.json'));
expect(Docker.configFile()).toEqual({
auths: {
'https://index.docker.io/v1/': {
auth: 'am9lam9lOmhlbGxv',
email: 'user@example.com'
}
}
} as unknown as ConfigFile);
});
it('proxies', async () => {
fs.copyFileSync(path.join(fixturesDir, 'docker-config-proxies.json'), path.join(tmpDir, 'config.json'));
expect(Docker.configFile()).toEqual({
proxies: {
default: {
httpProxy: 'http://127.0.0.1:3128',
httpsProxy: 'http://127.0.0.1:3128'
}
}
} as unknown as ConfigFile);
});
});
describe('isAvailable', () => {
it('cli', async () => {
const ioWhichSpy = jest.spyOn(io, 'which');
await Docker.isAvailable();
expect(ioWhichSpy).toHaveBeenCalledTimes(1);
expect(ioWhichSpy).toHaveBeenCalledWith('docker', true);
});
});
describe('context', () => {
it('call docker context show', async () => {
const execSpy = jest.spyOn(Exec, 'getExecOutput');
await Docker.context().catch(() => {
// noop
});
expect(execSpy).toHaveBeenCalledWith(`docker`, ['context', 'inspect', '--format', '{{.Name}}'], {
ignoreReturnCode: true,
silent: true
});
});
});
describe('printVersion', () => {
it('call docker version', async () => {
const execSpy = jest.spyOn(Exec, 'exec');
await Docker.printVersion().catch(() => {
// noop
});
expect(execSpy).toHaveBeenCalledWith(`docker`, ['version']);
});
});
describe('printInfo', () => {
it('call docker info', async () => {
const execSpy = jest.spyOn(Exec, 'exec');
await Docker.printInfo().catch(() => {
// noop
});
expect(execSpy).toHaveBeenCalledWith(`docker`, ['info']);
});
});

View File

@@ -0,0 +1,55 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import path from 'path';
import {jest, describe, expect, test, beforeEach, afterEach} from '@jest/globals';
import {Install} from '../../src/docker/install';
import {Docker} from '../../src/docker/docker';
// prettier-ignore
const tmpDir = path.join(process.env.TEMP || '/tmp', 'docker-install-jest');
describe('install', () => {
const originalEnv = process.env;
beforeEach(() => {
jest.resetModules();
process.env = {
...originalEnv,
LIMA_START_ARGS: '--cpus 4 --memory 8'
};
});
afterEach(() => {
process.env = originalEnv;
});
// prettier-ignore
test.each(['v24.0.4'])(
'install docker %s', async (version) => {
await expect((async () => {
const install = new Install({
version: version,
runDir: tmpDir,
contextName: 'foo',
daemonConfig: `{"debug":true,"features":{"containerd-snapshotter":true}}`
});
await install.download();
await install.install();
await Docker.printVersion();
await Docker.printInfo();
await install.tearDown();
})()).resolves.not.toThrow();
}, 1200000);
});

View File

@@ -0,0 +1,73 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {describe, expect, jest, test, beforeEach, afterEach, it} from '@jest/globals';
import * as fs from 'fs';
import * as path from 'path';
import * as rimraf from 'rimraf';
import osm = require('os');
import {Install} from '../../src/docker/install';
// prettier-ignore
const tmpDir = path.join(process.env.TEMP || '/tmp', 'docker-install-jest');
beforeEach(() => {
jest.clearAllMocks();
});
afterEach(function () {
rimraf.sync(tmpDir);
});
describe('download', () => {
// prettier-ignore
test.each([
['v19.03.14', 'linux'],
['v20.10.22', 'linux'],
['v20.10.22', 'darwin'],
['v20.10.22', 'win32'],
])(
'acquires %p of docker (%s)', async (version, platformOS) => {
jest.spyOn(osm, 'platform').mockImplementation(() => platformOS as NodeJS.Platform);
const install = new Install({
version: version,
runDir: tmpDir,
});
const toolPath = await install.download();
expect(fs.existsSync(toolPath)).toBe(true);
}, 100000);
});
describe('getRelease', () => {
it('returns latest docker GitHub release', async () => {
const release = await Install.getRelease('latest');
expect(release).not.toBeNull();
expect(release?.tag_name).not.toEqual('');
});
it('returns v23.0.0 buildx GitHub release', async () => {
const release = await Install.getRelease('v23.0.0');
expect(release).not.toBeNull();
expect(release?.id).toEqual(91109643);
expect(release?.tag_name).toEqual('v23.0.0');
expect(release?.html_url).toEqual('https://github.com/moby/moby/releases/tag/v23.0.0');
});
it('unknown release', async () => {
await expect(Install.getRelease('foo')).rejects.toThrow(new Error('Cannot find Docker release foo in https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/docker-releases.json'));
});
});

121
__tests__/dockerhub.test.ts Normal file
View File

@@ -0,0 +1,121 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {describe, expect, jest, it, beforeEach} from '@jest/globals';
import * as fs from 'fs';
import * as path from 'path';
import {DockerHub} from '../src/dockerhub';
import {RepositoryResponse, RepositoryTagsResponse} from '../src/types/dockerhub';
beforeEach(() => {
jest.clearAllMocks();
});
import repoInfoFixture from './fixtures/dockerhub-repoinfo.json';
import repoTagsFixture from './fixtures/dockerhub-repotags.json';
import repoAllTagsFixture from './fixtures/dockerhub-repoalltags.json';
describe('getRepository', () => {
it('returns repo info', async () => {
jest.spyOn(DockerHub.prototype, 'getRepository').mockImplementation((): Promise<RepositoryResponse> => {
return <Promise<RepositoryResponse>>(repoInfoFixture as unknown);
});
// eslint-disable-next-line @typescript-eslint/no-explicit-any
jest.spyOn(DockerHub as any, 'login').mockReturnValue('jwt_token');
const dockerhub = await DockerHub.build({
credentials: {
username: 'foo',
password: '0123456-7890-0000-1111-222222222'
}
});
const repoinfo = await dockerhub.getRepository({
namespace: 'foo',
name: 'bar'
});
expect(repoinfo.namespace).toEqual('foo');
expect(repoinfo.name).toEqual('bar');
expect(repoinfo.repository_type).toEqual('image');
});
});
describe('getRepositoryTags', () => {
it('return repo tags', async () => {
jest.spyOn(DockerHub.prototype, 'getRepositoryTags').mockImplementation((): Promise<RepositoryTagsResponse> => {
return <Promise<RepositoryTagsResponse>>(repoTagsFixture as unknown);
});
// eslint-disable-next-line @typescript-eslint/no-explicit-any
jest.spyOn(DockerHub as any, 'login').mockReturnValue('jwt_token');
const dockerhub = await DockerHub.build({
credentials: {
username: 'foo',
password: '0123456-7890-0000-1111-222222222'
}
});
const resp = await dockerhub.getRepositoryTags({
namespace: 'crazymax',
name: 'diun'
});
expect(resp.count).toBeGreaterThan(0);
expect(resp.next).not.toBeNull();
expect(resp.results.length).toBeGreaterThan(0);
expect(resp.results[0].last_updater_username).toEqual('crazymax');
});
});
describe('getRepositoryAllTags', () => {
it('return repo all tags', async () => {
jest.spyOn(DockerHub.prototype, 'getRepositoryAllTags').mockImplementation((): Promise<RepositoryTagsResponse> => {
return <Promise<RepositoryTagsResponse>>(repoAllTagsFixture as unknown);
});
// eslint-disable-next-line @typescript-eslint/no-explicit-any
jest.spyOn(DockerHub as any, 'login').mockReturnValue('jwt_token');
const dockerhub = await DockerHub.build({
credentials: {
username: 'foo',
password: '0123456-7890-0000-1111-222222222'
}
});
const resp = await dockerhub.getRepositoryAllTags({
namespace: 'crazymax',
name: 'diun'
});
expect(resp.count).toBeGreaterThan(0);
expect(resp.next).toBeNull();
expect(resp.results.length).toBeGreaterThan(0);
expect(resp.results[0].last_updater_username).toEqual('crazymax');
});
});
describe('updateRepoDescription', () => {
it.skip('set repo description', async () => {
const dockerhub = await DockerHub.build({
credentials: {
username: 'foo',
password: 'bar'
}
});
const resp = await dockerhub.updateRepoDescription({
namespace: 'crazymax',
name: 'test-toolkit',
description: 'Hello-World',
full_description: fs.readFileSync(path.join(__dirname, '..', 'README.md'), 'utf-8')
});
expect(resp.namespace).toEqual('foo');
expect(resp.name).toEqual('bar');
expect(resp.description).toEqual('Hello-World');
});
});

51
__tests__/exec.test.ts Normal file
View File

@@ -0,0 +1,51 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {beforeEach, describe, expect, it, jest} from '@jest/globals';
import {Exec} from '../src/exec';
beforeEach(() => {
jest.clearAllMocks();
});
describe('exec', () => {
it('returns docker version', async () => {
const execSpy = jest.spyOn(Exec, 'exec');
await Exec.exec('docker', ['version'], {
ignoreReturnCode: true,
silent: true
});
expect(execSpy).toHaveBeenCalledWith(`docker`, ['version'], {
ignoreReturnCode: true,
silent: true
});
});
});
describe('getExecOutput', () => {
it('returns docker version', async () => {
const execSpy = jest.spyOn(Exec, 'getExecOutput');
await Exec.getExecOutput('docker', ['version'], {
ignoreReturnCode: true,
silent: true
});
expect(execSpy).toHaveBeenCalledWith(`docker`, ['version'], {
ignoreReturnCode: true,
silent: true
});
});
});

View File

@@ -0,0 +1,29 @@
{
"group": {
"default": {
"targets": [
"image"
]
}
},
"target": {
"image": {
"context": ".",
"dockerfile": "Dockerfile",
"args": {
"BUILDKIT_CONTEXT_KEEP_GIT_DIR": "1",
"GO_VERSION": "1.20"
},
"tags": [
"docker/buildx-bin:local"
],
"target": "binaries",
"platforms": [
"linux/amd64"
],
"output": [
"type=docker"
]
}
}
}

View File

@@ -0,0 +1,55 @@
{
"group": {
"default": {
"targets": [
"validate"
]
},
"validate": {
"targets": [
"lint",
"validate-vendor",
"validate-docs"
]
}
},
"target": {
"lint": {
"context": ".",
"dockerfile": "./hack/dockerfiles/lint.Dockerfile",
"args": {
"BUILDKIT_CONTEXT_KEEP_GIT_DIR": "1",
"GO_VERSION": "1.20"
},
"output": [
"type=cacheonly"
]
},
"validate-docs": {
"context": ".",
"dockerfile": "./hack/dockerfiles/docs.Dockerfile",
"args": {
"BUILDKIT_CONTEXT_KEEP_GIT_DIR": "1",
"BUILDX_EXPERIMENTAL": "1",
"FORMATS": "md",
"GO_VERSION": "1.20"
},
"target": "validate",
"output": [
"type=cacheonly"
]
},
"validate-vendor": {
"context": ".",
"dockerfile": "./hack/dockerfiles/vendor.Dockerfile",
"args": {
"BUILDKIT_CONTEXT_KEEP_GIT_DIR": "1",
"GO_VERSION": "1.20"
},
"target": "validate",
"output": [
"type=cacheonly"
]
}
}
}

View File

@@ -0,0 +1,172 @@
// Copyright 2023 actions-toolkit authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
variable "GO_VERSION" {
default = "1.20"
}
variable "DOCS_FORMATS" {
default = "md"
}
variable "DESTDIR" {
default = "./bin"
}
# Special target: https://github.com/docker/metadata-action#bake-definition
target "meta-helper" {
tags = ["docker/buildx-bin:local"]
}
target "_common" {
args = {
GO_VERSION = GO_VERSION
BUILDKIT_CONTEXT_KEEP_GIT_DIR = 1
}
}
group "default" {
targets = ["binaries"]
}
group "validate" {
targets = ["lint", "validate-vendor", "validate-docs"]
}
target "lint" {
inherits = ["_common"]
dockerfile = "./hack/dockerfiles/lint.Dockerfile"
output = ["type=cacheonly"]
}
target "validate-vendor" {
inherits = ["_common"]
dockerfile = "./hack/dockerfiles/vendor.Dockerfile"
target = "validate"
output = ["type=cacheonly"]
}
target "validate-docs" {
inherits = ["_common"]
args = {
FORMATS = DOCS_FORMATS
BUILDX_EXPERIMENTAL = 1 // enables experimental cmds/flags for docs generation
}
dockerfile = "./hack/dockerfiles/docs.Dockerfile"
target = "validate"
output = ["type=cacheonly"]
}
target "validate-authors" {
inherits = ["_common"]
dockerfile = "./hack/dockerfiles/authors.Dockerfile"
target = "validate"
output = ["type=cacheonly"]
}
target "validate-generated-files" {
inherits = ["_common"]
dockerfile = "./hack/dockerfiles/generated-files.Dockerfile"
target = "validate"
output = ["type=cacheonly"]
}
target "update-vendor" {
inherits = ["_common"]
dockerfile = "./hack/dockerfiles/vendor.Dockerfile"
target = "update"
output = ["."]
}
target "update-docs" {
inherits = ["_common"]
args = {
FORMATS = DOCS_FORMATS
BUILDX_EXPERIMENTAL = 1 // enables experimental cmds/flags for docs generation
}
dockerfile = "./hack/dockerfiles/docs.Dockerfile"
target = "update"
output = ["./docs/reference"]
}
target "update-authors" {
inherits = ["_common"]
dockerfile = "./hack/dockerfiles/authors.Dockerfile"
target = "update"
output = ["."]
}
target "update-generated-files" {
inherits = ["_common"]
dockerfile = "./hack/dockerfiles/generated-files.Dockerfile"
target = "update"
output = ["."]
}
target "mod-outdated" {
inherits = ["_common"]
dockerfile = "./hack/dockerfiles/vendor.Dockerfile"
target = "outdated"
no-cache-filter = ["outdated"]
output = ["type=cacheonly"]
}
target "test" {
inherits = ["_common"]
target = "test-coverage"
output = ["${DESTDIR}/coverage"]
}
target "binaries" {
inherits = ["_common"]
target = "binaries"
output = ["${DESTDIR}/build"]
platforms = ["local"]
}
target "binaries-cross" {
inherits = ["binaries"]
platforms = [
"darwin/amd64",
"darwin/arm64",
"linux/amd64",
"linux/arm/v6",
"linux/arm/v7",
"linux/arm64",
"linux/ppc64le",
"linux/riscv64",
"linux/s390x",
"windows/amd64",
"windows/arm64"
]
}
target "release" {
inherits = ["binaries-cross"]
target = "release"
output = ["${DESTDIR}/release"]
}
target "image" {
inherits = ["meta-helper", "binaries"]
output = ["type=image"]
}
target "image-cross" {
inherits = ["meta-helper", "binaries-cross"]
output = ["type=image"]
}
target "image-local" {
inherits = ["image"]
output = ["type=docker"]
}

View File

@@ -0,0 +1,20 @@
{
"group": {
"default": {
"targets": [
"build"
]
}
},
"target": {
"build": {
"context": ".",
"dockerfile": "Dockerfile",
"args": {
"BUILDKIT_CONTEXT_KEEP_GIT_DIR": "1",
"GO_VERSION": "1.20"
},
"target": "build"
}
}
}

View File

@@ -0,0 +1,33 @@
// Copyright 2023 actions-toolkit authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
variable "GO_VERSION" {
default = "1.20"
}
target "_common" {
args = {
GO_VERSION = GO_VERSION
BUILDKIT_CONTEXT_KEEP_GIT_DIR = 1
}
}
group "default" {
targets = ["build"]
}
target "build" {
inherits = ["_common"]
target = "build"
}

View File

@@ -0,0 +1,36 @@
{
"group": {
"default": {
"targets": [
"binaries-cross"
]
}
},
"target": {
"binaries-cross": {
"context": "https://github.com/docker/buildx.git#v0.10.4",
"dockerfile": "Dockerfile",
"args": {
"BUILDKIT_CONTEXT_KEEP_GIT_DIR": "1",
"GO_VERSION": "1.19"
},
"target": "binaries",
"platforms": [
"darwin/amd64",
"darwin/arm64",
"linux/amd64",
"linux/arm/v6",
"linux/arm/v7",
"linux/arm64",
"linux/ppc64le",
"linux/riscv64",
"linux/s390x",
"windows/amd64",
"windows/arm64"
],
"output": [
"./bin/build"
]
}
}
}

View File

@@ -0,0 +1,8 @@
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "am9lam9lOmhlbGxv",
"email": "user@example.com"
}
}
}

View File

@@ -0,0 +1,8 @@
{
"proxies": {
"default": {
"httpProxy": "http://127.0.0.1:3128",
"httpsProxy": "http://127.0.0.1:3128"
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,34 @@
{
"user": "foo",
"name": "bar",
"namespace": "foo",
"repository_type": "image",
"status": 1,
"status_description": "active",
"description": "Bar",
"is_private": false,
"is_automated": false,
"can_edit": true,
"star_count": 68,
"pull_count": 178255909,
"last_updated": "2023-02-02T14:22:31.184404Z",
"date_registered": "2019-06-04T20:08:57.306333Z",
"collaborator_count": 0,
"affiliation": "owner",
"hub_user": "foo",
"has_starred": false,
"full_description": "This is the full description of the repo.",
"permissions": {
"read": true,
"write": true,
"admin": true
},
"media_types": [
"application/vnd.docker.container.image.v1+json",
"application/vnd.docker.distribution.manifest.list.v2+json",
"application/vnd.oci.image.index.v1+json"
],
"content_types": [
"image"
]
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,67 @@
Name: remote-builder
Driver: remote
Last Activity: 2023-04-20 12:47:49 +0000 UTC
Nodes:
Name: remote-builder0
Endpoint: docker-container://buildx_buildkit_dk-remote-builder0
Status: inactive
Platforms:
Name: aws_graviton2
Endpoint: tcp://10.0.0.1:1234
Driver Options: cacert="/home/user/.certs/aws_graviton2/ca.pem" cert="/home/user/.certs/aws_graviton2/cert.pem" key="/home/user/.certs/aws_graviton2/key.pem"
Status: running
Buildkit: v0.11.6
Platforms: darwin/arm64*, linux/arm64*, linux/arm/v5*, linux/arm/v6*, linux/arm/v7*, windows/arm64*
Labels:
org.mobyproject.buildkit.worker.executor: oci
org.mobyproject.buildkit.worker.hostname: 77ebc22e2d82
org.mobyproject.buildkit.worker.network: host
org.mobyproject.buildkit.worker.oci.process-mode: sandbox
org.mobyproject.buildkit.worker.selinux.enabled: false
org.mobyproject.buildkit.worker.snapshotter: overlayfs
GC Policy rule#0:
All: false
Filters: type==source.local,type==exec.cachemount,type==source.git.checkout
Keep Duration: 48h0m0s
Keep Bytes: 488.3MiB
GC Policy rule#1:
All: false
Keep Duration: 1440h0m0s
Keep Bytes: 23.28GiB
GC Policy rule#2:
All: false
Keep Bytes: 23.28GiB
GC Policy rule#3:
All: true
Keep Bytes: 23.28GiB
Name: linuxone_s390x
Endpoint: tcp://10.0.0.2:1234
Driver Options: cacert="/home/user/.certs/linuxone_s390x/ca.pem" cert="/home/user/.certs/linuxone_s390x/cert.pem" key="/home/user/.certs/linuxone_s390x/key.pem"
Status: running
Buildkit: v0.11.6
Platforms: linux/s390x*
Labels:
org.mobyproject.buildkit.worker.executor: oci
org.mobyproject.buildkit.worker.hostname: 9d0d62a96818
org.mobyproject.buildkit.worker.network: host
org.mobyproject.buildkit.worker.oci.process-mode: sandbox
org.mobyproject.buildkit.worker.selinux.enabled: false
org.mobyproject.buildkit.worker.snapshotter: overlayfs
GC Policy rule#0:
All: false
Filters: type==source.local,type==exec.cachemount,type==source.git.checkout
Keep Duration: 48h0m0s
Keep Bytes: 488.3MiB
GC Policy rule#1:
All: false
Keep Duration: 1440h0m0s
Keep Bytes: 9.313GiB
GC Policy rule#2:
All: false
Keep Bytes: 9.313GiB
GC Policy rule#3:
All: true
Keep Bytes: 9.313GiB

View File

@@ -5,7 +5,7 @@ Last Activity: 2023-01-16 09:45:23 +0000 UTC
Nodes:
Name: builder20
Endpoint: unix:///var/run/docker.sock
Driver Options: env.BUILDKIT_STEP_LOG_MAX_SIZE="10485760" env.BUILDKIT_STEP_LOG_MAX_SPEED="10485760" env.JAEGER_TRACE="localhost:6831" image="moby/buildkit:latest" network="host"
Driver Options: env.BUILDKIT_STEP_LOG_MAX_SIZE="10485760" env.BUILDKIT_STEP_LOG_MAX_SPEED="10485760" env.JAEGER_TRACE="localhost:6831" image="moby/buildkit:latest" network="host" qemu.install="true"
Status: running
Flags: --debug --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host
Buildkit: v0.11.0

View File

@@ -0,0 +1,34 @@
Name: builder-52aa0611-faf0-42ac-a940-461e4e287d68
Driver: docker-container
Last Activity: 2023-06-13 13:52:31 +0000 UTC
Nodes:
Name: builder-52aa0611-faf0-42ac-a940-461e4e287d680
Endpoint: unix:///var/run/docker.sock
Driver Options: image="moby/buildkit:buildx-stable-1" network="host"
Status: running
Flags: --debug --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host
Buildkit: v0.11.6
Platforms: linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/amd64/v4, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
Labels:
org.mobyproject.buildkit.worker.executor: oci
org.mobyproject.buildkit.worker.hostname: fv-az572-38
org.mobyproject.buildkit.worker.network: host
org.mobyproject.buildkit.worker.oci.process-mode: sandbox
org.mobyproject.buildkit.worker.selinux.enabled: false
org.mobyproject.buildkit.worker.snapshotter: overlayfs
GC Policy rule#0:
All: false
Filters: type==source.local,type==exec.cachemount,type==source.git.checkout
Keep Duration: 48h0m0s
Keep Bytes: 488.3MiB
GC Policy rule#1:
All: false
Keep Duration: 1440h0m0s
Keep Bytes: 8.382GiB
GC Policy rule#2:
All: false
Keep Bytes: 8.382GiB
GC Policy rule#3:
All: true
Keep Bytes: 8.382GiB

View File

@@ -0,0 +1,14 @@
Name: default
Driver: docker
Last Activity: 2023-06-13 18:13:43 +0000 UTC
Nodes:
Name: default
Endpoint: default
Status: running
Buildkit: v0.11.7-0.20230525183624-798ad6b0ce9f
Platforms: linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
GC Policy rule#0:
All: true
Filters:
Keep Bytes: 100GiB

View File

@@ -17,18 +17,196 @@
import {beforeEach, describe, expect, it, jest} from '@jest/globals';
import {Git} from '../src/git';
import {Exec} from '../src/exec';
import {ExecOutput} from '@actions/exec';
beforeEach(() => {
jest.clearAllMocks();
jest.restoreAllMocks();
});
describe('git', () => {
it('returns git remote ref', async () => {
try {
expect(await Git.getRemoteSha('https://github.com/docker/buildx.git', 'refs/pull/648/head')).toEqual('f11797113e5a9b86bd976329c5dbb8a8bfdfadfa');
} catch (e) {
// eslint-disable-next-line jest/no-conditional-expect
expect(e).toEqual(null);
}
describe('context', () => {
it('returns mocked ref and sha', async () => {
jest.spyOn(Exec, 'getExecOutput').mockImplementation((cmd, args): Promise<ExecOutput> => {
const fullCmd = `${cmd} ${args?.join(' ')}`;
let result = '';
switch (fullCmd) {
case 'git show --format=%H HEAD --quiet --':
result = 'test-sha';
break;
case 'git branch --show-current':
result = 'test';
break;
case 'git symbolic-ref HEAD':
result = 'refs/heads/test';
break;
}
return Promise.resolve({
stdout: result,
stderr: '',
exitCode: 0
});
});
const ctx = await Git.context();
expect(ctx.ref).toEqual('refs/heads/test');
expect(ctx.sha).toEqual('test-sha');
});
});
describe('isInsideWorkTree', () => {
it('have been called', async () => {
const execSpy = jest.spyOn(Exec, 'getExecOutput');
try {
await Git.isInsideWorkTree();
} catch (err) {
// noop
}
expect(execSpy).toHaveBeenCalledWith(`git`, ['rev-parse', '--is-inside-work-tree'], {
silent: true,
ignoreReturnCode: true
});
});
});
describe('remoteSha', () => {
it('returns sha using git ls-remote', async () => {
expect(await Git.remoteSha('https://github.com/docker/buildx.git', 'refs/pull/648/head')).toEqual('f11797113e5a9b86bd976329c5dbb8a8bfdfadfa');
});
it('returns sha using github api', async () => {
expect(await Git.remoteSha('https://github.com/docker/buildx.git', 'refs/pull/648/head', process.env.GITHUB_TOKEN)).toEqual('f11797113e5a9b86bd976329c5dbb8a8bfdfadfa');
});
});
describe('remoteURL', () => {
it('have been called', async () => {
const execSpy = jest.spyOn(Exec, 'getExecOutput');
try {
await Git.remoteURL();
} catch (err) {
// noop
}
expect(execSpy).toHaveBeenCalledWith(`git`, ['remote', 'get-url', 'origin'], {
silent: true,
ignoreReturnCode: true
});
});
});
describe('ref', () => {
it('returns mocked ref', async () => {
jest.spyOn(Exec, 'getExecOutput').mockImplementation((cmd, args): Promise<ExecOutput> => {
const fullCmd = `${cmd} ${args?.join(' ')}`;
let result = '';
switch (fullCmd) {
case 'git branch --show-current':
result = 'test';
break;
case 'git symbolic-ref HEAD':
result = 'refs/heads/test';
break;
}
return Promise.resolve({
stdout: result,
stderr: '',
exitCode: 0
});
});
const ref = await Git.ref();
expect(ref).toEqual('refs/heads/test');
});
it('returns mocked detached tag ref', async () => {
jest.spyOn(Exec, 'getExecOutput').mockImplementation((cmd, args): Promise<ExecOutput> => {
const fullCmd = `${cmd} ${args?.join(' ')}`;
let result = '';
switch (fullCmd) {
case 'git branch --show-current':
result = '';
break;
case 'git show -s --pretty=%D':
result = 'HEAD, tag: 8.0.0';
break;
}
return Promise.resolve({
stdout: result,
stderr: '',
exitCode: 0
});
});
const ref = await Git.ref();
expect(ref).toEqual('refs/tags/8.0.0');
});
it('returns mocked detached branch ref', async () => {
jest.spyOn(Exec, 'getExecOutput').mockImplementation((cmd, args): Promise<ExecOutput> => {
const fullCmd = `${cmd} ${args?.join(' ')}`;
let result = '';
switch (fullCmd) {
case 'git branch --show-current':
result = '';
break;
case 'git show -s --pretty=%D':
result = 'HEAD, origin/test, test';
break;
}
return Promise.resolve({
stdout: result,
stderr: '',
exitCode: 0
});
});
const ref = await Git.ref();
expect(ref).toEqual('refs/heads/test');
});
});
describe('fullCommit', () => {
it('have been called', async () => {
const execSpy = jest.spyOn(Exec, 'getExecOutput');
try {
await Git.fullCommit();
} catch (err) {
// noop
}
expect(execSpy).toHaveBeenCalledWith(`git`, ['show', '--format=%H', 'HEAD', '--quiet', '--'], {
silent: true,
ignoreReturnCode: true
});
});
});
describe('shortCommit', () => {
it('have been called', async () => {
const execSpy = jest.spyOn(Exec, 'getExecOutput');
try {
await Git.shortCommit();
} catch (err) {
// noop
}
expect(execSpy).toHaveBeenCalledWith(`git`, ['show', '--format=%h', 'HEAD', '--quiet', '--'], {
silent: true,
ignoreReturnCode: true
});
});
});
describe('tag', () => {
it('have been called', async () => {
const execSpy = jest.spyOn(Exec, 'getExecOutput');
try {
await Git.tag();
} catch (err) {
// noop
}
expect(execSpy).toHaveBeenCalledWith(`git`, ['tag', '--points-at', 'HEAD', '--sort', '-version:creatordate'], {
silent: true,
ignoreReturnCode: true
});
});
});

View File

@@ -17,26 +17,33 @@
import {describe, expect, jest, it, beforeEach, afterEach} from '@jest/globals';
import * as fs from 'fs';
import * as path from 'path';
import * as core from '@actions/core';
import {GitHub, GitHubRepo} from '../src/github';
import {GitHub} from '../src/github';
import {GitHubRepo} from '../src/types/github';
beforeEach(() => {
jest.clearAllMocks();
});
import * as repoFixture from './fixtures/repo.json';
import repoFixture from './fixtures/github-repo.json';
jest.spyOn(GitHub.prototype, 'repoData').mockImplementation((): Promise<GitHubRepo> => {
return <Promise<GitHubRepo>>(repoFixture as unknown);
});
describe('repoData', () => {
it('returns GitHub repository', async () => {
const github = new GitHub();
expect((await github.repoData()).name).toEqual('Hello-World');
});
});
describe('context', () => {
it('returns repository name from payload', async () => {
const github = new GitHub();
expect(github.context.payload.repository?.name).toEqual('test-docker-action');
expect(GitHub.context.payload.repository?.name).toEqual('test-docker-action');
});
it('is repository private', async () => {
const github = new GitHub();
expect(github.context.payload.repository?.private).toEqual(true);
expect(GitHub.context.payload.repository?.private).toEqual(true);
});
});
@@ -54,12 +61,31 @@ describe('serverURL', () => {
});
it('returns default', async () => {
process.env.GITHUB_SERVER_URL = '';
const github = new GitHub();
expect(github.serverURL).toEqual('https://github.com');
expect(GitHub.serverURL).toEqual('https://github.com');
});
it('returns from env', async () => {
const github = new GitHub();
expect(github.serverURL).toEqual('https://foo.github.com');
expect(GitHub.serverURL).toEqual('https://foo.github.com');
});
});
describe('apiURL', () => {
const originalEnv = process.env;
beforeEach(() => {
jest.resetModules();
process.env = {
...originalEnv,
GITHUB_API_URL: 'https://bar.github.com'
};
});
afterEach(() => {
process.env = originalEnv;
});
it('returns default', async () => {
process.env.GITHUB_API_URL = '';
expect(GitHub.apiURL).toEqual('https://api.github.com');
});
it('returns from env', async () => {
expect(GitHub.apiURL).toEqual('https://bar.github.com');
});
});
@@ -76,21 +102,52 @@ describe('actionsRuntimeToken', () => {
});
it('empty', async () => {
process.env.ACTIONS_RUNTIME_TOKEN = '';
const github = new GitHub();
expect(github.actionsRuntimeToken).toEqual({});
expect(GitHub.actionsRuntimeToken).toBeUndefined();
});
it('malformed', async () => {
process.env.ACTIONS_RUNTIME_TOKEN = 'foo';
expect(() => {
GitHub.actionsRuntimeToken;
}).toThrow();
});
it('fixture', async () => {
process.env.ACTIONS_RUNTIME_TOKEN = fs.readFileSync(path.join(__dirname, 'fixtures', 'runtimeToken.txt')).toString().trim();
const github = new GitHub();
const runtimeToken = github.actionsRuntimeToken;
expect(runtimeToken.ac).toEqual('[{"Scope":"refs/heads/master","Permission":3}]');
expect(runtimeToken.iss).toEqual('vstoken.actions.githubusercontent.com');
process.env.ACTIONS_RUNTIME_TOKEN = fs
.readFileSync(path.join(__dirname, 'fixtures', 'runtimeToken.txt'))
.toString()
.trim();
const runtimeToken = GitHub.actionsRuntimeToken;
expect(runtimeToken?.ac).toEqual('[{"Scope":"refs/heads/master","Permission":3}]');
expect(runtimeToken?.iss).toEqual('vstoken.actions.githubusercontent.com');
});
});
describe('repoData', () => {
it('returns GitHub repository', async () => {
const github = new GitHub();
expect((await github.repoData()).name).toEqual('Hello-World');
describe('printActionsRuntimeTokenACs', () => {
const originalEnv = process.env;
beforeEach(() => {
jest.resetModules();
process.env = {
...originalEnv
};
});
afterEach(() => {
process.env = originalEnv;
});
it('empty', async () => {
process.env.ACTIONS_RUNTIME_TOKEN = '';
await expect(GitHub.printActionsRuntimeTokenACs()).rejects.toThrow(new Error('ACTIONS_RUNTIME_TOKEN not set'));
});
it('malformed', async () => {
process.env.ACTIONS_RUNTIME_TOKEN = 'foo';
await expect(GitHub.printActionsRuntimeTokenACs()).rejects.toThrow(new Error('Cannot parse GitHub Actions Runtime Token: Invalid token specified: missing part #2'));
});
it('refs/heads/master', async () => {
const infoSpy = jest.spyOn(core, 'info');
process.env.ACTIONS_RUNTIME_TOKEN = fs
.readFileSync(path.join(__dirname, 'fixtures', 'runtimeToken.txt'))
.toString()
.trim();
await GitHub.printActionsRuntimeTokenACs();
expect(infoSpy).toHaveBeenCalledTimes(1);
expect(infoSpy).toHaveBeenCalledWith(`refs/heads/master: read/write`);
});
});

View File

@@ -69,16 +69,40 @@ describe('getInputList', () => {
it('multiline and ignoring comma correctly', async () => {
setInput('cache-from', 'user/app:cache\ntype=local,src=path/to/dir');
const res = Util.getInputList('cache-from', true);
const res = Util.getInputList('cache-from', {ignoreComma: true});
expect(res).toEqual(['user/app:cache', 'type=local,src=path/to/dir']);
});
it('multiline and ignoring comment correctly', async () => {
setInput('labels', 'foo=bar\nbar=qux#baz');
const res = Util.getInputList('labels');
expect(res).toEqual(['foo=bar', 'bar=qux#baz']);
});
it('multiline with comment', async () => {
setInput('labels', 'foo=bar\nbar=qux#baz');
const res = Util.getInputList('labels', {comment: '#'});
expect(res).toEqual(['foo=bar', 'bar=qux']);
});
it('different new lines and ignoring comma correctly', async () => {
setInput('cache-from', 'user/app:cache\r\ntype=local,src=path/to/dir');
const res = Util.getInputList('cache-from', true);
const res = Util.getInputList('cache-from', {ignoreComma: true});
expect(res).toEqual(['user/app:cache', 'type=local,src=path/to/dir']);
});
it('do not escape surrounding quotes', async () => {
setInput('driver-opts', `"env.no_proxy=localhost,127.0.0.1,.mydomain"`);
const res = Util.getInputList('driver-opts', {ignoreComma: true, quote: false});
expect(res).toEqual(['"env.no_proxy=localhost,127.0.0.1,.mydomain"']);
});
it('escape surrounding quotes', async () => {
setInput('platforms', 'linux/amd64\n"linux/arm64,linux/arm/v7"');
const res = Util.getInputList('platforms');
expect(res).toEqual(['linux/amd64', 'linux/arm64', 'linux/arm/v7']);
});
it('multiline values', async () => {
setInput(
'secrets',
@@ -88,7 +112,7 @@ bbbbbbb
ccccccccc"
FOO=bar`
);
const res = Util.getInputList('secrets', true);
const res = Util.getInputList('secrets', {ignoreComma: true});
expect(res).toEqual([
'GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789',
`MYSECRET=aaaaaaaa
@@ -111,7 +135,7 @@ FOO=bar
bbbb
ccc"`
);
const res = Util.getInputList('secrets', true);
const res = Util.getInputList('secrets', {ignoreComma: true});
expect(res).toEqual([
'GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789',
`MYSECRET=aaaaaaaa
@@ -134,7 +158,7 @@ bbbbbbb
ccccccccc
FOO=bar`
);
const res = Util.getInputList('secrets', true);
const res = Util.getInputList('secrets', {ignoreComma: true});
expect(res).toEqual(['GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789', 'MYSECRET=aaaaaaaa', 'bbbbbbb', 'ccccccccc', 'FOO=bar']);
});
@@ -145,7 +169,7 @@ FOO=bar`
`"GPG_KEY=${pgp}"
FOO=bar`
);
const res = Util.getInputList('secrets', true);
const res = Util.getInputList('secrets', {ignoreComma: true});
expect(res).toEqual([`GPG_KEY=${pgp}`, 'FOO=bar']);
});
@@ -158,7 +182,7 @@ bbbb""bbb
ccccccccc"
FOO=bar`
);
const res = Util.getInputList('secrets', true);
const res = Util.getInputList('secrets', {ignoreComma: true});
expect(res).toEqual([
'GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789',
`MYSECRET=aaaaaaaa
@@ -182,13 +206,64 @@ describe('asyncForEach', () => {
});
});
describe('isValidUrl', () => {
describe('isValidURL', () => {
test.each([
['https://github.com/docker/buildx.git', true],
['https://github.com/docker/buildx.git#refs/pull/648/head', true],
['git@github.com:moby/buildkit.git', false],
['git://github.com/user/repo.git', false],
['github.com/moby/buildkit.git#main', false],
['v0.4.1', false]
])('given %p', async (url, expected) => {
expect(Util.isValidUrl(url)).toEqual(expected);
expect(Util.isValidURL(url)).toEqual(expected);
});
});
describe('isValidRef', () => {
test.each([
['https://github.com/docker/buildx.git', true],
['https://github.com/docker/buildx.git#refs/pull/648/head', true],
['git@github.com:moby/buildkit.git', true],
['git://github.com/user/repo.git', true],
['github.com/moby/buildkit.git#main', true],
['v0.4.1', false]
])('given %p', async (url, expected) => {
expect(Util.isValidRef(url)).toEqual(expected);
});
});
describe('trimPrefix', () => {
test.each([
['', 'abc', ''],
['abc', 'a', 'bc'],
['abc', 'ab', 'c'],
['abc', '', 'abc'],
['abc', '', 'abc'],
['abc', 'd', 'abc'],
['abc', 'abc', ''],
['abc', 'abcd', 'abc'],
['abcdabc', 'abc', 'dabc'],
['abcabc', 'abc', 'abc'],
['abcdabc', 'd', 'abcdabc']
])('given %p', async (str, prefix, expected) => {
expect(Util.trimPrefix(str, prefix)).toEqual(expected);
});
});
describe('trimSuffix', () => {
test.each([
['', 'abc', ''],
['abc', 'c', 'ab'],
['abc', '', 'abc'],
['abc', 'bc', 'a'],
['abc', 'abc', ''],
['abc', 'abcd', 'abc'],
['abc', 'aabc', 'abc'],
['abcdabc', 'abc', 'abcd'],
['abcabc', 'abc', 'abc'],
['abcdabc', 'd', 'abcdabc']
])('given %p', async (str, suffix, expected) => {
expect(Util.trimSuffix(str, suffix)).toEqual(expected);
});
});

View File

@@ -14,9 +14,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.
ARG NODE_VERSION=16
ARG DOCKER_VERSION=20.10.22
ARG BUILDX_VERSION=0.10.0
ARG NODE_VERSION=20
ARG DOCKER_VERSION=24.0.5
ARG BUILDX_VERSION=0.11.2
FROM node:${NODE_VERSION}-alpine AS base
RUN apk add --no-cache cpio findutils git
@@ -79,7 +79,7 @@ RUN --mount=type=bind,target=.,rw \
--mount=type=bind,from=buildx,source=/buildx,target=/usr/libexec/docker/cli-plugins/docker-buildx \
--mount=type=bind,from=buildx,source=/buildx,target=/usr/bin/buildx \
--mount=type=secret,id=GITHUB_TOKEN \
GITHUB_TOKEN=$(cat /run/secrets/GITHUB_TOKEN) yarn run test-coverage --coverageDirectory=/tmp/coverage
GITHUB_TOKEN=$(cat /run/secrets/GITHUB_TOKEN) yarn run test:coverage --coverageDirectory=/tmp/coverage
FROM scratch AS test-coverage
COPY --from=test /tmp/coverage /

View File

@@ -16,7 +16,7 @@
ARG LICENSE_HOLDER="actions-toolkit authors"
ARG LICENSE_TYPE="apache"
ARG LICENSE_FILES=".*\(Dockerfile\|Makefile\|\.js\|\.ts\|\.hcl\|\.sh\)"
ARG LICENSE_FILES=".*\(Dockerfile\|Makefile\|\.js\|\.ts\|\.hcl\|\.sh|\.ps1\)"
ARG ADDLICENSE_VERSION="v1.0.0"
FROM ghcr.io/google/addlicense:${ADDLICENSE_VERSION} AS addlicense

31
jest.config.itg.ts Normal file
View File

@@ -0,0 +1,31 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
module.exports = {
clearMocks: true,
testEnvironment: 'node',
moduleFileExtensions: ['js', 'ts'],
setupFiles: ['dotenv/config'],
testMatch: ['**/*.test.itg.ts'],
testTimeout: 1800000, // 30 minutes
transform: {
'^.+\\.ts$': 'ts-jest'
},
moduleNameMapper: {
'^csv-parse/sync': '<rootDir>/node_modules/csv-parse/dist/cjs/sync.cjs'
},
verbose: false
};

View File

@@ -14,10 +14,17 @@
* limitations under the License.
*/
import fs from 'fs';
import os from 'os';
import path from 'path';
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'docker-actions-toolkit-'));
process.env = Object.assign({}, process.env, {
TEMP: tmpDir,
GITHUB_REPOSITORY: 'docker/actions-toolkit',
RUNNER_TEMP: '/tmp/github_runner',
RUNNER_TOOL_CACHE: '/tmp/github_tool_cache'
RUNNER_TEMP: path.join(tmpDir, 'runner-temp'),
RUNNER_TOOL_CACHE: path.join(tmpDir, 'runner-tool-cache')
}) as {
[key: string]: string;
};
@@ -34,7 +41,7 @@ module.exports = {
moduleNameMapper: {
'^csv-parse/sync': '<rootDir>/node_modules/csv-parse/dist/cjs/sync.cjs'
},
collectCoverageFrom: ['src/**/{!(toolkit.ts),}.ts'],
collectCoverageFrom: ['src/**/{!(index.ts),}.ts'],
coveragePathIgnorePatterns: ['lib/', 'node_modules/', '__mocks__/', '__tests__/'],
verbose: true
};

View File

@@ -1,12 +1,20 @@
{
"name": "@docker/actions-toolkit",
"version": "0.0.0+unknown",
"description": "Toolkit for Docker (GitHub) Actions",
"scripts": {
"build": "tsc",
"lint": "eslint src/**/*.ts __tests__/**/*.ts",
"format": "eslint --fix src/**/*.ts __tests__/**/*.ts",
"lint": "yarn run prettier && yarn run eslint",
"format": "yarn run prettier:fix && yarn run eslint:fix",
"eslint": "eslint --max-warnings=0 .",
"eslint:fix": "eslint --fix .",
"prettier": "prettier --check \"./**/*.ts\"",
"prettier:fix": "prettier --write \"./**/*.ts\"",
"test": "jest",
"test-coverage": "jest --coverage"
"test:coverage": "jest --coverage",
"test:itg": "jest -c jest.config.itg.ts --runInBand --detectOpenHandles",
"test:itg-list": "jest -c jest.config.itg.ts --listTests",
"test:itg-coverage": "jest --coverage -c jest.config.itg.ts --runInBand --detectOpenHandles"
},
"repository": {
"type": "git",
@@ -22,9 +30,9 @@
],
"author": "Docker Inc.",
"license": "Apache-2.0",
"packageManager": "yarn@3.3.1",
"main": "lib/toolkit.js",
"types": "lib/toolkit.d.ts",
"packageManager": "yarn@3.6.3",
"main": "lib/index.js",
"types": "lib/index.d.ts",
"directories": {
"lib": "lib",
"test": "__tests__"
@@ -37,33 +45,41 @@
"registry": "https://registry.npmjs.org/"
},
"dependencies": {
"@actions/core": "^1.10.0",
"@actions/cache": "^3.2.2",
"@actions/core": "^1.10.1",
"@actions/exec": "^1.1.1",
"@actions/github": "^5.1.1",
"@actions/http-client": "^2.0.1",
"csv-parse": "^5.3.3",
"jwt-decode": "^3.1.2",
"semver": "^7.3.8",
"@actions/github": "^6.0.0",
"@actions/http-client": "^2.2.0",
"@actions/io": "^1.1.3",
"@actions/tool-cache": "^2.0.1",
"@octokit/core": "^5.0.2",
"@octokit/plugin-rest-endpoint-methods": "^10.2.0",
"async-retry": "^1.3.3",
"csv-parse": "^5.5.2",
"handlebars": "^4.7.8",
"jwt-decode": "^4.0.0",
"semver": "^7.5.4",
"tmp": "^0.2.1"
},
"devDependencies": {
"@types/csv-parse": "^1.2.2",
"@types/node": "^16.18.11",
"@types/semver": "^7.3.13",
"@types/js-yaml": "^4.0.5",
"@types/node": "^20.5.9",
"@types/semver": "^7.5.1",
"@types/tmp": "^0.2.3",
"@typescript-eslint/eslint-plugin": "^5.49.0",
"@typescript-eslint/parser": "^5.49.0",
"cpy-cli": "^4.2.0",
"dotenv": "^16.0.3",
"eslint": "^8.33.0",
"eslint-config-prettier": "^8.6.0",
"eslint-plugin-jest": "^26.9.0",
"eslint-plugin-prettier": "^4.2.1",
"jest": "^27.5.1",
"prettier": "^2.8.3",
"rimraf": "^4.1.2",
"ts-jest": "^27.1.5",
"@typescript-eslint/eslint-plugin": "^6.6.0",
"@typescript-eslint/parser": "^6.6.0",
"dotenv": "^16.3.1",
"eslint": "^8.48.0",
"eslint-config-prettier": "^9.0.0",
"eslint-plugin-import": "^2.28.1",
"eslint-plugin-jest": "^27.2.3",
"eslint-plugin-prettier": "^5.0.0",
"jest": "^29.6.4",
"prettier": "^3.0.3",
"rimraf": "^5.0.1",
"ts-jest": "^29.1.1",
"ts-node": "^10.9.1",
"typescript": "^4.9.4"
"typescript": "^5.2.2"
}
}

View File

@@ -1,148 +0,0 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import * as exec from '@actions/exec';
import {Buildx} from './buildx';
import {Context} from './context';
export interface BuilderInfo {
name?: string;
driver?: string;
lastActivity?: Date;
nodes: NodeInfo[];
}
export interface NodeInfo {
name?: string;
endpoint?: string;
driverOpts?: Array<string>;
status?: string;
buildkitdFlags?: string;
buildkitVersion?: string;
platforms?: string;
}
export interface BuilderOpts {
context: Context;
buildx?: Buildx;
}
export class Builder {
private readonly context: Context;
private readonly buildx: Buildx;
constructor(opts: BuilderOpts) {
this.context = opts.context;
this.buildx =
opts?.buildx ||
new Buildx({
context: this.context
});
}
public async inspect(name: string): Promise<BuilderInfo> {
const cmd = this.buildx.getCommand(['inspect', name]);
return await exec
.getExecOutput(cmd.command, cmd.args, {
ignoreReturnCode: true,
silent: true
})
.then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
throw new Error(res.stderr.trim());
}
return Builder.parseInspect(res.stdout);
});
}
public static parseInspect(data: string): BuilderInfo {
const builder: BuilderInfo = {
nodes: []
};
let node: NodeInfo = {};
for (const line of data.trim().split(`\n`)) {
const [key, ...rest] = line.split(':');
const value = rest.map(v => v.trim()).join(':');
if (key.length == 0 || value.length == 0) {
continue;
}
switch (key.toLowerCase()) {
case 'name': {
if (builder.name == undefined) {
builder.name = value;
} else {
if (Object.keys(node).length > 0) {
builder.nodes.push(node);
node = {};
}
node.name = value;
}
break;
}
case 'driver': {
builder.driver = value;
break;
}
case 'last activity': {
builder.lastActivity = new Date(value);
break;
}
case 'endpoint': {
node.endpoint = value;
break;
}
case 'driver options': {
node.driverOpts = (value.match(/(\w+)="([^"]*)"/g) || []).map(v => v.replace(/^(.*)="(.*)"$/g, '$1=$2'));
break;
}
case 'status': {
node.status = value;
break;
}
case 'flags': {
node.buildkitdFlags = value;
break;
}
case 'buildkit': {
node.buildkitVersion = value;
break;
}
case 'platforms': {
let platforms: Array<string> = [];
// if a preferred platform is being set then use only these
// https://docs.docker.com/engine/reference/commandline/buildx_inspect/#get-information-about-a-builder-instance
if (value.includes('*')) {
for (const platform of value.split(', ')) {
if (platform.includes('*')) {
platforms.push(platform.replace('*', ''));
}
}
} else {
// otherwise set all platforms available
platforms = value.split(', ');
}
node.platforms = platforms.join(',');
break;
}
}
}
if (Object.keys(node).length > 0) {
builder.nodes.push(node);
}
return builder;
}
}

View File

@@ -1,140 +0,0 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import fs from 'fs';
import * as core from '@actions/core';
import * as exec from '@actions/exec';
import * as semver from 'semver';
import {Context} from './context';
import {Buildx} from './buildx';
import {Builder, BuilderInfo} from './builder';
export interface BuildKitOpts {
context: Context;
buildx?: Buildx;
}
export class BuildKit {
private readonly context: Context;
private readonly buildx: Buildx;
private containerNamePrefix = 'buildx_buildkit_';
constructor(opts: BuildKitOpts) {
this.context = opts.context;
this.buildx =
opts?.buildx ||
new Buildx({
context: this.context
});
}
private async getBuilderInfo(name: string): Promise<BuilderInfo> {
const builder = new Builder({
context: this.context,
buildx: this.buildx
});
return builder.inspect(name);
}
public async getVersion(builderName: string): Promise<string | undefined> {
const builderInfo = await this.getBuilderInfo(builderName);
if (builderInfo.nodes.length == 0) {
// a builder always have on node, should not happen.
return undefined;
}
// TODO: get version for all nodes
const node = builderInfo.nodes[0];
if (!node.buildkitVersion && node.name) {
try {
return await this.getVersionWithinImage(node.name);
} catch (e) {
core.warning(e);
}
}
return node.buildkitVersion;
}
private async getVersionWithinImage(nodeName: string): Promise<string> {
return exec
.getExecOutput(`docker`, ['inspect', '--format', '{{.Config.Image}}', `${this.containerNamePrefix}${nodeName}`], {
ignoreReturnCode: true,
silent: true
})
.then(bkitimage => {
if (bkitimage.exitCode == 0 && bkitimage.stdout.length > 0) {
return exec
.getExecOutput(`docker`, ['run', '--rm', bkitimage.stdout.trim(), '--version'], {
ignoreReturnCode: true,
silent: true
})
.then(bkitversion => {
if (bkitversion.exitCode == 0 && bkitversion.stdout.length > 0) {
return `${bkitimage.stdout.trim()} => ${bkitversion.stdout.trim()}`;
} else if (bkitversion.stderr.length > 0) {
throw new Error(bkitimage.stderr.trim());
}
return bkitversion.stdout.trim();
});
} else if (bkitimage.stderr.length > 0) {
throw new Error(bkitimage.stderr.trim());
}
return bkitimage.stdout.trim();
});
}
public async versionSatisfies(builderName: string, range: string): Promise<boolean> {
const builderInfo = await this.getBuilderInfo(builderName);
for (const node of builderInfo.nodes) {
let bkversion = node.buildkitVersion;
if (!bkversion) {
try {
bkversion = await this.getVersionWithinImage(node.name || '');
} catch (e) {
return false;
}
}
// BuildKit version reported by moby is in the format of `v0.11.0-moby`
if (builderInfo.driver == 'docker' && !bkversion.endsWith('-moby')) {
return false;
}
if (!semver.satisfies(bkversion.replace(/-moby$/, ''), range)) {
return false;
}
}
return true;
}
public generateConfigInline(s: string): string {
return this.generateConfig(s, false);
}
public generateConfigFile(s: string): string {
return this.generateConfig(s, true);
}
private generateConfig(s: string, file: boolean): string {
if (file) {
if (!fs.existsSync(s)) {
throw new Error(`config file ${s} not found`);
}
s = fs.readFileSync(s, {encoding: 'utf-8'});
}
const configFile = this.context.tmpName({tmpdir: this.context.tmpDir()});
fs.writeFileSync(configFile, s);
return configFile;
}
}

104
src/buildkit/buildkit.ts Normal file
View File

@@ -0,0 +1,104 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import * as core from '@actions/core';
import * as semver from 'semver';
import {Buildx} from '../buildx/buildx';
import {Builder} from '../buildx/builder';
import {Config} from './config';
import {Exec} from '../exec';
import {BuilderInfo, NodeInfo} from '../types/builder';
export interface BuildKitOpts {
buildx?: Buildx;
}
export class BuildKit {
private readonly buildx: Buildx;
public readonly config: Config;
constructor(opts?: BuildKitOpts) {
this.config = new Config();
this.buildx = opts?.buildx || new Buildx();
}
public async getVersion(node: NodeInfo): Promise<string | undefined> {
if (!node.buildkit && node.name) {
try {
return await this.getVersionWithinImage(node.name);
} catch (e) {
core.warning(e);
}
}
return node.buildkit;
}
private async getVersionWithinImage(nodeName: string): Promise<string> {
core.debug(`BuildKit.getVersionWithinImage nodeName: ${nodeName}`);
return Exec.getExecOutput(`docker`, ['inspect', '--format', '{{.Config.Image}}', `${Buildx.containerNamePrefix}${nodeName}`], {
ignoreReturnCode: true,
silent: true
}).then(bkitimage => {
if (bkitimage.exitCode == 0 && bkitimage.stdout.length > 0) {
core.debug(`BuildKit.getVersionWithinImage image: ${bkitimage.stdout.trim()}`);
return Exec.getExecOutput(`docker`, ['run', '--rm', bkitimage.stdout.trim(), '--version'], {
ignoreReturnCode: true,
silent: true
}).then(bkitversion => {
if (bkitversion.exitCode == 0 && bkitversion.stdout.length > 0) {
return `${bkitimage.stdout.trim()} => ${bkitversion.stdout.trim()}`;
} else if (bkitversion.stderr.length > 0) {
throw new Error(bkitimage.stderr.trim());
}
return bkitversion.stdout.trim();
});
} else if (bkitimage.stderr.length > 0) {
throw new Error(bkitimage.stderr.trim());
}
return bkitimage.stdout.trim();
});
}
public async versionSatisfies(builderName: string, range: string, builderInfo?: BuilderInfo): Promise<boolean> {
if (!builderInfo) {
builderInfo = await new Builder({buildx: this.buildx}).inspect(builderName);
}
for (const node of builderInfo.nodes) {
let bkversion = node.buildkit;
core.debug(`BuildKit.versionSatisfies ${bkversion}: ${range}`);
if (!bkversion) {
try {
bkversion = await this.getVersionWithinImage(node.name || '');
} catch (e) {
core.debug(`BuildKit.versionSatisfies ${node.name}: can't get version`);
return false;
}
}
core.debug(`BuildKit.versionSatisfies ${node.name}: version ${bkversion}`);
// BuildKit version reported by moby is in the format of `v0.11.0-moby`
if (builderInfo.driver == 'docker' && !bkversion.endsWith('-moby')) {
return false;
}
if (!semver.satisfies(bkversion.replace(/-moby$/, ''), range)) {
return false;
}
}
return true;
}
}

41
src/buildkit/config.ts Normal file
View File

@@ -0,0 +1,41 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import fs from 'fs';
import {Context} from '../context';
export class Config {
public resolveFromString(s: string): string {
return this.resolve(s, false);
}
public resolveFromFile(s: string): string {
return this.resolve(s, true);
}
private resolve(s: string, file: boolean): string {
if (file) {
if (!fs.existsSync(s)) {
throw new Error(`config file ${s} not found`);
}
s = fs.readFileSync(s, {encoding: 'utf-8'});
}
const configFile = Context.tmpName({tmpdir: Context.tmpDir()});
fs.writeFileSync(configFile, s);
return configFile;
}
}

View File

@@ -1,290 +0,0 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import fs from 'fs';
import path from 'path';
import * as core from '@actions/core';
import * as exec from '@actions/exec';
import * as httpm from '@actions/http-client';
import {parse} from 'csv-parse/sync';
import * as semver from 'semver';
import {Docker} from './docker';
import {Context} from './context';
export interface GitHubRelease {
id: number;
tag_name: string;
html_url: string;
assets: Array<string>;
}
export interface BuildxOpts {
context: Context;
standalone?: boolean;
}
export class Buildx {
private readonly context: Context;
private _version: string | undefined;
public standalone: boolean;
constructor(opts: BuildxOpts) {
this.context = opts.context;
this.standalone = opts?.standalone ?? !Docker.isAvailable();
}
public getCommand(args: Array<string>) {
return {
command: this.standalone ? 'buildx' : 'docker',
args: this.standalone ? args : ['buildx', ...args]
};
}
public async isAvailable(): Promise<boolean> {
const cmd = this.getCommand([]);
return await exec
.getExecOutput(cmd.command, cmd.args, {
ignoreReturnCode: true,
silent: true
})
.then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
return false;
}
return res.exitCode == 0;
})
// eslint-disable-next-line @typescript-eslint/no-unused-vars
.catch(error => {
return false;
});
}
public async printInspect(name: string): Promise<void> {
const cmd = this.getCommand(['inspect', name]);
await exec.exec(cmd.command, cmd.args, {
failOnStdErr: false
});
}
get version() {
return (async () => {
if (!this._version) {
const cmd = this.getCommand(['version']);
this._version = await exec
.getExecOutput(cmd.command, cmd.args, {
ignoreReturnCode: true,
silent: true
})
.then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
throw new Error(res.stderr.trim());
}
return Buildx.parseVersion(res.stdout.trim());
});
}
return this._version;
})();
}
public async printVersion() {
const cmd = this.getCommand(['version']);
await exec.exec(cmd.command, cmd.args, {
failOnStdErr: false
});
}
public static parseVersion(stdout: string): string {
const matches = /\sv?([0-9a-f]{7}|[0-9.]+)/.exec(stdout);
if (!matches) {
throw new Error(`Cannot parse buildx version`);
}
return matches[1];
}
public async versionSatisfies(range: string, version?: string): Promise<boolean> {
const ver = version ?? (await this.version);
if (!ver) {
return false;
}
return semver.satisfies(ver, range) || /^[0-9a-f]{7}$/.exec(ver) !== null;
}
public getBuildImageIDFilePath(): string {
return path.join(this.context.tmpDir(), 'iidfile').split(path.sep).join(path.posix.sep);
}
public getBuildMetadataFilePath(): string {
return path.join(this.context.tmpDir(), 'metadata-file').split(path.sep).join(path.posix.sep);
}
public getBuildImageID(): string | undefined {
const iidFile = this.getBuildImageIDFilePath();
if (!fs.existsSync(iidFile)) {
return undefined;
}
return fs.readFileSync(iidFile, {encoding: 'utf-8'}).trim();
}
public getBuildMetadata(): string | undefined {
const metadataFile = this.getBuildMetadataFilePath();
if (!fs.existsSync(metadataFile)) {
return undefined;
}
const content = fs.readFileSync(metadataFile, {encoding: 'utf-8'}).trim();
if (content === 'null') {
return undefined;
}
return content;
}
public getDigest(): string | undefined {
const metadata = this.getBuildMetadata();
if (metadata === undefined) {
return undefined;
}
const metadataJSON = JSON.parse(metadata);
if (metadataJSON['containerimage.digest']) {
return metadataJSON['containerimage.digest'];
}
return undefined;
}
public generateBuildSecretString(kvp: string): string {
return this.generateBuildSecret(kvp, false);
}
public generateBuildSecretFile(kvp: string): string {
return this.generateBuildSecret(kvp, true);
}
public generateBuildSecret(kvp: string, file: boolean): string {
const delimiterIndex = kvp.indexOf('=');
const key = kvp.substring(0, delimiterIndex);
let value = kvp.substring(delimiterIndex + 1);
if (key.length == 0 || value.length == 0) {
throw new Error(`${kvp} is not a valid secret`);
}
if (file) {
if (!fs.existsSync(value)) {
throw new Error(`secret file ${value} not found`);
}
value = fs.readFileSync(value, {encoding: 'utf-8'});
}
const secretFile = this.context.tmpName({tmpdir: this.context.tmpDir()});
fs.writeFileSync(secretFile, value);
return `id=${key},src=${secretFile}`;
}
public getProvenanceInput(name: string): string {
const input = core.getInput(name);
if (!input) {
// if input is not set returns empty string
return input;
}
const builderID = this.context.provenanceBuilderID;
try {
return core.getBooleanInput(name) ? `builder-id=${builderID}` : 'false';
} catch (err) {
// not a valid boolean, so we assume it's a string
return this.getProvenanceAttrs(input);
}
}
public getProvenanceAttrs(input: string): string {
if (!input) {
return `builder-id=${this.context.provenanceBuilderID}`;
}
// parse attributes from input
const fields = parse(input, {
relaxColumnCount: true,
skipEmptyLines: true
})[0];
// check if builder-id attribute exists in the input
for (const field of fields) {
const parts = field
.toString()
.split(/(?<=^[^=]+?)=/)
.map(item => item.trim());
if (parts[0] == 'builder-id') {
return input;
}
}
// if not add builder-id attribute
return `${input},builder-id=${this.context.provenanceBuilderID}`;
}
public static async getRelease(version: string): Promise<GitHubRelease> {
// FIXME: Use https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/buildx-releases.json when repo public
const url = `https://raw.githubusercontent.com/docker/buildx/master/.github/releases.json`;
const http: httpm.HttpClient = new httpm.HttpClient('docker-actions-toolkit');
const resp: httpm.HttpClientResponse = await http.get(url);
const body = await resp.readBody();
const statusCode = resp.message.statusCode || 500;
if (statusCode >= 400) {
throw new Error(`Failed to get Buildx release ${version} from ${url} with status code ${statusCode}: ${body}`);
}
const releases = <Record<string, GitHubRelease>>JSON.parse(body);
if (!releases[version]) {
throw new Error(`Cannot find Buildx release ${version} in ${url}`);
}
return releases[version];
}
public static hasLocalExporter(exporters: string[]): boolean {
return Buildx.hasExporterType('local', exporters);
}
public static hasTarExporter(exporters: string[]): boolean {
return Buildx.hasExporterType('tar', exporters);
}
public static hasDockerExporter(exporters: string[], load?: boolean): boolean {
return load ?? Buildx.hasExporterType('docker', exporters);
}
public static hasExporterType(name: string, exporters: string[]): boolean {
const records = parse(exporters.join(`\n`), {
delimiter: ',',
trim: true,
columns: false,
relaxColumnCount: true
});
for (const record of records) {
if (record.length == 1 && !record[0].startsWith('type=')) {
// Local if no type is defined
// https://github.com/docker/buildx/blob/d2bf42f8b4784d83fde17acb3ed84703ddc2156b/build/output.go#L29-L43
return name == 'local';
}
for (const [key, value] of record.map(chunk => chunk.split('=').map(item => item.trim()))) {
if (key == 'type' && value == name) {
return true;
}
}
}
return false;
}
public static hasGitAuthTokenSecret(secrets: string[]): boolean {
for (const secret of secrets) {
if (secret.startsWith('GIT_AUTH_TOKEN=')) {
return true;
}
}
return false;
}
}

108
src/buildx/bake.ts Normal file
View File

@@ -0,0 +1,108 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {Buildx} from './buildx';
import {Exec} from '../exec';
import {Inputs} from './inputs';
import {Util} from '../util';
import {BakeDefinition} from '../types/bake';
export interface BakeOpts {
buildx?: Buildx;
}
export class Bake {
private readonly buildx: Buildx;
constructor(opts?: BakeOpts) {
this.buildx = opts?.buildx || new Buildx();
}
public async parseDefinitions(sources: Array<string>, targets?: Array<string>, overrides?: Array<string>, load?: boolean, push?: boolean, workdir?: string): Promise<BakeDefinition> {
const args = ['bake'];
let remoteDef;
const files: Array<string> = [];
if (sources) {
for (const source of sources.map(v => v.trim())) {
if (source.length == 0) {
continue;
}
if (!Util.isValidRef(source)) {
files.push(source);
continue;
}
if (remoteDef) {
throw new Error(`Only one remote bake definition is allowed`);
}
remoteDef = source;
}
}
if (remoteDef) {
args.push(remoteDef);
}
for (const file of files) {
args.push('--file', file);
}
if (overrides) {
for (const override of overrides) {
args.push('--set', override);
}
}
if (load) {
args.push('--load');
}
if (push) {
args.push('--push');
}
const printCmd = await this.buildx.getCommand([...args, '--print', ...(targets || [])]);
return await Exec.getExecOutput(printCmd.command, printCmd.args, {
cwd: workdir,
ignoreReturnCode: true,
silent: true
}).then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
throw new Error(res.stderr);
}
return <BakeDefinition>JSON.parse(res.stdout.trim());
});
}
public static hasLocalExporter(def: BakeDefinition): boolean {
return Inputs.hasExporterType('local', Bake.exporters(def));
}
public static hasTarExporter(def: BakeDefinition): boolean {
return Inputs.hasExporterType('tar', Bake.exporters(def));
}
public static hasDockerExporter(def: BakeDefinition, load?: boolean): boolean {
return load || Inputs.hasExporterType('docker', Bake.exporters(def));
}
private static exporters(def: BakeDefinition): Array<string> {
const exporters = new Array<string>();
for (const key in def.target) {
const target = def.target[key];
if (target.output) {
exporters.push(...target.output);
}
}
return exporters;
}
}

215
src/buildx/builder.ts Normal file
View File

@@ -0,0 +1,215 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import * as core from '@actions/core';
import {Buildx} from './buildx';
import {Exec} from '../exec';
import {BuilderInfo, GCPolicy, NodeInfo} from '../types/builder';
export interface BuilderOpts {
buildx?: Buildx;
}
export class Builder {
private readonly buildx: Buildx;
constructor(opts?: BuilderOpts) {
this.buildx = opts?.buildx || new Buildx();
}
public async exists(name: string): Promise<boolean> {
const cmd = await this.buildx.getCommand(['inspect', name]);
const ok: boolean = await Exec.getExecOutput(cmd.command, cmd.args, {
ignoreReturnCode: true,
silent: true
})
.then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
core.debug(`Builder.exists cmd err: ${res.stderr.trim()}`);
return false;
}
return res.exitCode == 0;
})
.catch(error => {
core.debug(`Builder.exists error: ${error}`);
return false;
});
core.debug(`Builder.exists: ${ok}`);
return ok;
}
public async inspect(name: string): Promise<BuilderInfo> {
const cmd = await this.buildx.getCommand(['inspect', name]);
return await Exec.getExecOutput(cmd.command, cmd.args, {
ignoreReturnCode: true,
silent: true
}).then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
throw new Error(res.stderr.trim());
}
return Builder.parseInspect(res.stdout);
});
}
public static parseInspect(data: string): BuilderInfo {
const builder: BuilderInfo = {
nodes: []
};
let parsingType: string | undefined;
let currentNode: NodeInfo = {};
let currentGCPolicy: GCPolicy | undefined;
for (const line of data.trim().split(`\n`)) {
const [key, ...rest] = line.split(':');
const lkey = key.toLowerCase();
const value = rest.map(v => v.trim()).join(':');
if (key.length == 0) {
continue;
}
switch (true) {
case lkey == 'name': {
parsingType = undefined;
if (builder.name == undefined) {
builder.name = value;
} else {
if (currentGCPolicy && currentNode.gcPolicy) {
currentNode.gcPolicy.push(currentGCPolicy);
currentGCPolicy = undefined;
}
if (currentNode.name) {
builder.nodes.push(currentNode);
}
currentNode = {name: value};
}
break;
}
case lkey == 'driver': {
parsingType = undefined;
builder.driver = value;
break;
}
case lkey == 'last activity': {
parsingType = undefined;
builder.lastActivity = new Date(value);
break;
}
case lkey == 'endpoint': {
parsingType = undefined;
currentNode.endpoint = value;
break;
}
case lkey == 'driver options': {
parsingType = undefined;
currentNode['driver-opts'] = (value.match(/([a-zA-Z0-9_.]+)="([^"]*)"/g) || []).map(v => v.replace(/^(.*)="(.*)"$/g, '$1=$2'));
break;
}
case lkey == 'status': {
parsingType = undefined;
currentNode.status = value;
break;
}
case lkey == 'flags': {
parsingType = undefined;
currentNode['buildkitd-flags'] = value;
break;
}
case lkey == 'buildkit': {
parsingType = undefined;
currentNode.buildkit = value;
break;
}
case lkey == 'platforms': {
parsingType = undefined;
if (!value) {
break;
}
let platforms: Array<string> = [];
// if a preferred platform is being set then use only these
// https://docs.docker.com/engine/reference/commandline/buildx_inspect/#get-information-about-a-builder-instance
if (value.includes('*')) {
for (const platform of value.split(', ')) {
if (platform.includes('*')) {
platforms.push(platform.replace(/\*/g, ''));
}
}
} else {
// otherwise set all platforms available
platforms = value.split(', ');
}
currentNode.platforms = platforms.join(',');
break;
}
case lkey == 'labels': {
parsingType = 'label';
currentNode.labels = {};
break;
}
case lkey.startsWith('gc policy rule#'): {
parsingType = 'gcpolicy';
if (currentNode.gcPolicy && currentGCPolicy) {
currentNode.gcPolicy.push(currentGCPolicy);
currentGCPolicy = undefined;
}
break;
}
default: {
switch (parsingType || '') {
case 'label': {
currentNode.labels = currentNode.labels || {};
currentNode.labels[key.trim()] = value;
break;
}
case 'gcpolicy': {
currentNode.gcPolicy = currentNode.gcPolicy || [];
currentGCPolicy = currentGCPolicy || {};
switch (lkey.trim()) {
case 'all': {
currentGCPolicy.all = value == 'true';
break;
}
case 'filters': {
if (value) {
currentGCPolicy.filter = value.split(',');
}
break;
}
case 'keep duration': {
currentGCPolicy.keepDuration = value;
break;
}
case 'keep bytes': {
currentGCPolicy.keepBytes = value;
break;
}
}
break;
}
}
}
}
}
if (currentGCPolicy && currentNode.gcPolicy) {
currentNode.gcPolicy.push(currentGCPolicy);
}
if (currentNode.name) {
builder.nodes.push(currentNode);
}
return builder;
}
}

178
src/buildx/buildx.ts Normal file
View File

@@ -0,0 +1,178 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import fs from 'fs';
import path from 'path';
import * as core from '@actions/core';
import * as semver from 'semver';
import {Docker} from '../docker/docker';
import {Exec} from '../exec';
import {Cert} from '../types/buildx';
export interface BuildxOpts {
standalone?: boolean;
}
export class Buildx {
private _version: string;
private _versionOnce: boolean;
private readonly _standalone: boolean | undefined;
public static readonly containerNamePrefix = 'buildx_buildkit_';
constructor(opts?: BuildxOpts) {
this._standalone = opts?.standalone;
this._version = '';
this._versionOnce = false;
}
static get configDir(): string {
return process.env.BUILDX_CONFIG || path.join(Docker.configDir, 'buildx');
}
static get certsDir(): string {
return path.join(Buildx.configDir, 'certs');
}
public async isStandalone(): Promise<boolean> {
const standalone = this._standalone ?? !(await Docker.isAvailable());
core.debug(`Buildx.isStandalone: ${standalone}`);
return standalone;
}
public async getCommand(args: Array<string>) {
const standalone = await this.isStandalone();
return {
command: standalone ? 'buildx' : 'docker',
args: standalone ? args : ['buildx', ...args]
};
}
public async isAvailable(): Promise<boolean> {
const cmd = await this.getCommand([]);
const ok: boolean = await Exec.getExecOutput(cmd.command, cmd.args, {
ignoreReturnCode: true,
silent: true
})
.then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
core.debug(`Buildx.isAvailable cmd err: ${res.stderr.trim()}`);
return false;
}
return res.exitCode == 0;
})
.catch(error => {
core.debug(`Buildx.isAvailable error: ${error}`);
return false;
});
core.debug(`Buildx.isAvailable: ${ok}`);
return ok;
}
public async printInspect(name: string): Promise<void> {
const cmd = await this.getCommand(['inspect', name]);
await Exec.exec(cmd.command, cmd.args, {
failOnStdErr: false
});
}
public async version(): Promise<string> {
if (this._versionOnce) {
return this._version;
}
this._versionOnce = true;
const cmd = await this.getCommand(['version']);
this._version = await Exec.getExecOutput(cmd.command, cmd.args, {
ignoreReturnCode: true,
silent: true
}).then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
throw new Error(res.stderr.trim());
}
return Buildx.parseVersion(res.stdout.trim());
});
return this._version;
}
public async printVersion() {
const cmd = await this.getCommand(['version']);
await Exec.exec(cmd.command, cmd.args, {
failOnStdErr: false
});
}
public static parseVersion(stdout: string): string {
const matches = /\sv?([0-9a-f]{7}|[0-9.]+)/.exec(stdout);
if (!matches) {
throw new Error(`Cannot parse buildx version`);
}
return matches[1];
}
public async versionSatisfies(range: string, version?: string): Promise<boolean> {
const ver = version ?? (await this.version());
if (!ver) {
core.debug(`Buildx.versionSatisfies false: undefined version`);
return false;
}
const res = semver.satisfies(ver, range) || /^[0-9a-f]{7}$/.exec(ver) !== null;
core.debug(`Buildx.versionSatisfies ${ver} statisfies ${range}: ${res}`);
return res;
}
public static resolveCertsDriverOpts(driver: string, endpoint: string, cert: Cert): Array<string> {
let url: URL;
try {
url = new URL(endpoint);
} catch (e) {
return [];
}
if (url.protocol != 'tcp:') {
return [];
}
const driverOpts: Array<string> = [];
if (Object.keys(cert).length == 0) {
return driverOpts;
}
let host = url.hostname;
if (url.port.length > 0) {
host += `-${url.port}`;
}
if (cert.cacert !== undefined) {
const cacertpath = path.join(Buildx.certsDir, `cacert_${host}.pem`);
fs.writeFileSync(cacertpath, cert.cacert);
driverOpts.push(`cacert=${cacertpath}`);
}
if (cert.cert !== undefined) {
const certpath = path.join(Buildx.certsDir, `cert_${host}.pem`);
fs.writeFileSync(certpath, cert.cert);
driverOpts.push(`cert=${certpath}`);
}
if (cert.key !== undefined) {
const keypath = path.join(Buildx.certsDir, `key_${host}.pem`);
fs.writeFileSync(keypath, cert.key);
driverOpts.push(`key=${keypath}`);
}
if (driver != 'remote') {
return [];
}
return driverOpts;
}
}

186
src/buildx/inputs.ts Normal file
View File

@@ -0,0 +1,186 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import fs from 'fs';
import path from 'path';
import * as core from '@actions/core';
import {parse} from 'csv-parse/sync';
import {Context} from '../context';
const parseKvp = (kvp: string): [string, string] => {
const delimiterIndex = kvp.indexOf('=');
const key = kvp.substring(0, delimiterIndex);
const value = kvp.substring(delimiterIndex + 1);
if (key.length == 0 || value.length == 0) {
throw new Error(`${kvp} is not a valid secret`);
}
return [key, value];
};
export class Inputs {
public static getBuildImageIDFilePath(): string {
return path.join(Context.tmpDir(), 'iidfile');
}
public static getBuildMetadataFilePath(): string {
return path.join(Context.tmpDir(), 'metadata-file');
}
public static resolveBuildImageID(): string | undefined {
const iidFile = Inputs.getBuildImageIDFilePath();
if (!fs.existsSync(iidFile)) {
return undefined;
}
return fs.readFileSync(iidFile, {encoding: 'utf-8'}).trim();
}
public static resolveBuildMetadata(): string | undefined {
const metadataFile = Inputs.getBuildMetadataFilePath();
if (!fs.existsSync(metadataFile)) {
return undefined;
}
const content = fs.readFileSync(metadataFile, {encoding: 'utf-8'}).trim();
if (content === 'null') {
return undefined;
}
return content;
}
public static resolveDigest(): string | undefined {
const metadata = Inputs.resolveBuildMetadata();
if (metadata === undefined) {
return undefined;
}
const metadataJSON = JSON.parse(metadata);
if (metadataJSON['containerimage.digest']) {
return metadataJSON['containerimage.digest'];
}
return undefined;
}
public static resolveBuildSecretString(kvp: string): string {
return Inputs.resolveBuildSecret(kvp, false);
}
public static resolveBuildSecretFile(kvp: string): string {
return Inputs.resolveBuildSecret(kvp, true);
}
public static resolveBuildSecretEnv(kvp: string): string {
const [key, value] = parseKvp(kvp);
return `id=${key},env=${value}`;
}
public static resolveBuildSecret(kvp: string, file: boolean): string {
const [key, _value] = parseKvp(kvp);
let value = _value;
if (file) {
if (!fs.existsSync(value)) {
throw new Error(`secret file ${value} not found`);
}
value = fs.readFileSync(value, {encoding: 'utf-8'});
}
const secretFile = Context.tmpName({tmpdir: Context.tmpDir()});
fs.writeFileSync(secretFile, value);
return `id=${key},src=${secretFile}`;
}
public static getProvenanceInput(name: string): string {
const input = core.getInput(name);
if (!input) {
// if input is not set returns empty string
return input;
}
try {
return core.getBooleanInput(name) ? `builder-id=${Context.provenanceBuilderID()}` : 'false';
} catch (err) {
// not a valid boolean, so we assume it's a string
return Inputs.resolveProvenanceAttrs(input);
}
}
public static resolveProvenanceAttrs(input: string): string {
if (!input) {
return `builder-id=${Context.provenanceBuilderID()}`;
}
// parse attributes from input
const fields = parse(input, {
relaxColumnCount: true,
skipEmptyLines: true
})[0];
// check if builder-id attribute exists in the input
for (const field of fields) {
const parts = field
.toString()
.split(/(?<=^[^=]+?)=/)
.map(item => item.trim());
if (parts[0] == 'builder-id') {
return input;
}
}
// if not add builder-id attribute
return `${input},builder-id=${Context.provenanceBuilderID()}`;
}
public static hasLocalExporter(exporters: string[]): boolean {
return Inputs.hasExporterType('local', exporters);
}
public static hasTarExporter(exporters: string[]): boolean {
return Inputs.hasExporterType('tar', exporters);
}
public static hasDockerExporter(exporters: string[], load?: boolean): boolean {
return load || Inputs.hasExporterType('docker', exporters);
}
public static hasExporterType(name: string, exporters: string[]): boolean {
const records = parse(exporters.join(`\n`), {
delimiter: ',',
trim: true,
columns: false,
relaxColumnCount: true
});
for (const record of records) {
if (record.length == 1 && !record[0].startsWith('type=')) {
// Local if no type is defined
// https://github.com/docker/buildx/blob/d2bf42f8b4784d83fde17acb3ed84703ddc2156b/build/output.go#L29-L43
return name == 'local';
}
for (const [key, value] of record.map(chunk => chunk.split('=').map(item => item.trim()))) {
if (key == 'type' && value == name) {
return true;
}
}
}
return false;
}
public static hasGitAuthTokenSecret(secrets: string[]): boolean {
for (const secret of secrets) {
if (secret.startsWith('GIT_AUTH_TOKEN=')) {
return true;
}
}
return false;
}
}

374
src/buildx/install.ts Normal file
View File

@@ -0,0 +1,374 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import crypto from 'crypto';
import fs from 'fs';
import os from 'os';
import path from 'path';
import * as core from '@actions/core';
import * as httpm from '@actions/http-client';
import * as tc from '@actions/tool-cache';
import * as cache from '@actions/cache';
import * as semver from 'semver';
import * as util from 'util';
import {Buildx} from './buildx';
import {Context} from '../context';
import {Exec} from '../exec';
import {Docker} from '../docker/docker';
import {Git} from '../git';
import {Util} from '../util';
import {DownloadVersion} from '../types/buildx';
import {GitHubRelease} from '../types/github';
export interface InstallOpts {
standalone?: boolean;
}
export class Install {
private readonly _standalone: boolean | undefined;
constructor(opts?: InstallOpts) {
this._standalone = opts?.standalone;
}
/*
* Download buildx binary from GitHub release
* @param version semver version or latest
* @returns path to the buildx binary
*/
public async download(v: string): Promise<string> {
const version: DownloadVersion = await Install.getDownloadVersion(v);
core.debug(`Install.download version: ${version.version}`);
const release: GitHubRelease = await Install.getRelease(version);
core.debug(`Install.download release tag name: ${release.tag_name}`);
const vspec = await this.vspec(release.tag_name);
core.debug(`Install.download vspec: ${vspec}`);
const c = semver.clean(vspec) || '';
if (!semver.valid(c)) {
throw new Error(`Invalid Buildx version "${vspec}".`);
}
const installCache = new InstallCache(version.key != 'official' ? `buildx-dl-bin-${version.key}` : 'buildx-dl-bin', vspec);
const cacheFoundPath = await installCache.find();
if (cacheFoundPath) {
core.info(`Buildx binary found in ${cacheFoundPath}`);
return cacheFoundPath;
}
const downloadURL = util.format(version.downloadURL, vspec, this.filename(vspec));
core.info(`Downloading ${downloadURL}`);
const htcDownloadPath = await tc.downloadTool(downloadURL);
core.debug(`Install.download htcDownloadPath: ${htcDownloadPath}`);
const cacheSavePath = await installCache.save(htcDownloadPath);
core.info(`Cached to ${cacheSavePath}`);
return cacheSavePath;
}
/*
* Build buildx binary from source
* @param gitContext git repo context
* @returns path to the buildx binary
*/
public async build(gitContext: string): Promise<string> {
const vspec = await this.vspec(gitContext);
core.debug(`Install.build vspec: ${vspec}`);
const installCache = new InstallCache('buildx-build-bin', vspec);
const cacheFoundPath = await installCache.find();
if (cacheFoundPath) {
core.info(`Buildx binary found in ${cacheFoundPath}`);
return cacheFoundPath;
}
const outputDir = path.join(Context.tmpDir(), 'buildx-build-cache');
const buildCmd = await this.buildCommand(gitContext, outputDir);
const buildBinPath = await Exec.getExecOutput(buildCmd.command, buildCmd.args, {
ignoreReturnCode: true
}).then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
throw new Error(`build failed with: ${res.stderr.match(/(.*)\s*$/)?.[0]?.trim() ?? 'unknown error'}`);
}
return `${outputDir}/buildx`;
});
const cacheSavePath = await installCache.save(buildBinPath);
core.info(`Cached to ${cacheSavePath}`);
return cacheSavePath;
}
public async installStandalone(binPath: string, dest?: string): Promise<string> {
core.info('Standalone mode');
dest = dest || Context.tmpDir();
const binDir = path.join(dest, 'buildx-bin-standalone');
if (!fs.existsSync(binDir)) {
fs.mkdirSync(binDir, {recursive: true});
}
const binName: string = os.platform() == 'win32' ? 'buildx.exe' : 'buildx';
const buildxPath: string = path.join(binDir, binName);
fs.copyFileSync(binPath, buildxPath);
core.info('Fixing perms');
fs.chmodSync(buildxPath, '0755');
core.addPath(binDir);
core.info('Added Buildx to PATH');
core.info(`Binary path: ${buildxPath}`);
return buildxPath;
}
public async installPlugin(binPath: string, dest?: string): Promise<string> {
core.info('Docker plugin mode');
dest = dest || Docker.configDir;
const pluginsDir: string = path.join(dest, 'cli-plugins');
if (!fs.existsSync(pluginsDir)) {
fs.mkdirSync(pluginsDir, {recursive: true});
}
const binName: string = os.platform() == 'win32' ? 'docker-buildx.exe' : 'docker-buildx';
const pluginPath: string = path.join(pluginsDir, binName);
fs.copyFileSync(binPath, pluginPath);
core.info('Fixing perms');
fs.chmodSync(pluginPath, '0755');
core.info(`Plugin path: ${pluginPath}`);
return pluginPath;
}
private async buildCommand(gitContext: string, outputDir: string): Promise<{args: Array<string>; command: string}> {
const buildxStandaloneFound = await new Buildx({standalone: true}).isAvailable();
const buildxPluginFound = await new Buildx({standalone: false}).isAvailable();
let buildStandalone = false;
if ((await this.isStandalone()) && buildxStandaloneFound) {
core.debug(`Install.buildCommand: Buildx standalone found, build with it`);
buildStandalone = true;
} else if (!(await this.isStandalone()) && buildxPluginFound) {
core.debug(`Install.buildCommand: Buildx plugin found, build with it`);
buildStandalone = false;
} else if (buildxStandaloneFound) {
core.debug(`Install.buildCommand: Buildx plugin not found, but standalone found so trying to build with it`);
buildStandalone = true;
} else if (buildxPluginFound) {
core.debug(`Install.buildCommand: Buildx standalone not found, but plugin found so trying to build with it`);
buildStandalone = false;
} else {
throw new Error(`Neither buildx standalone or plugin have been found to build from ref ${gitContext}`);
}
const args = ['build', '--target', 'binaries', '--platform', 'local', '--build-arg', 'BUILDKIT_CONTEXT_KEEP_GIT_DIR=1', '--output', `type=local,dest=${outputDir}`];
if (process.env.GIT_AUTH_TOKEN) {
args.push('--secret', 'id=GIT_AUTH_TOKEN');
}
args.push(gitContext);
//prettier-ignore
return await new Buildx({standalone: buildStandalone}).getCommand(args);
}
private async isStandalone(): Promise<boolean> {
const standalone = this._standalone ?? !(await Docker.isAvailable());
core.debug(`Install.isStandalone: ${standalone}`);
return standalone;
}
private filename(version: string): string {
let arch: string;
switch (os.arch()) {
case 'x64': {
arch = 'amd64';
break;
}
case 'ppc64': {
arch = 'ppc64le';
break;
}
case 'arm': {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const arm_version = (process.config.variables as any).arm_version;
arch = arm_version ? 'arm-v' + arm_version : 'arm';
break;
}
default: {
arch = os.arch();
break;
}
}
const platform: string = os.platform() == 'win32' ? 'windows' : os.platform();
const ext: string = os.platform() == 'win32' ? '.exe' : '';
return util.format('buildx-v%s.%s-%s%s', version, platform, arch, ext);
}
/*
* Get version spec (fingerprint) for cache key. If versionOrRef is a valid
* Git context, then return the SHA of the ref along the repo and owner and
* create a hash of it. Otherwise, return the versionOrRef (semver) as is
* without the 'v' prefix.
*/
private async vspec(versionOrRef: string): Promise<string> {
if (!Util.isValidRef(versionOrRef)) {
const v = versionOrRef.replace(/^v+|v+$/g, '');
core.info(`Use ${v} version spec cache key for ${versionOrRef}`);
return v;
}
// eslint-disable-next-line prefer-const
let [baseURL, ref] = versionOrRef.split('#');
if (ref.length == 0) {
ref = 'master';
}
let sha: string;
if (ref.match(/^[0-9a-fA-F]{40}$/)) {
sha = ref;
} else {
sha = await Git.remoteSha(baseURL, ref, process.env.GIT_AUTH_TOKEN);
}
const [owner, repo] = baseURL.substring('https://github.com/'.length).split('/');
const key = `${owner}/${Util.trimSuffix(repo, '.git')}/${sha}`;
const hash = crypto.createHash('sha256').update(key).digest('hex');
core.info(`Use ${hash} version spec cache key for ${key}`);
return hash;
}
public static async getDownloadVersion(v: string): Promise<DownloadVersion> {
let [repoKey, version] = v.split(':');
if (!version) {
version = repoKey;
repoKey = 'official';
}
switch (repoKey) {
case 'official': {
return {
key: repoKey,
version: version,
downloadURL: 'https://github.com/docker/buildx/releases/download/v%s/%s',
releasesURL: 'https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/buildx-releases.json'
};
}
case 'lab': {
return {
key: repoKey,
version: version,
downloadURL: 'https://github.com/docker/buildx-desktop/releases/download/v%s/%s',
releasesURL: 'https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/buildx-lab-releases.json'
};
}
default: {
throw new Error(`Cannot find buildx version for ${v}`);
}
}
}
public static async getRelease(version: DownloadVersion): Promise<GitHubRelease> {
const http: httpm.HttpClient = new httpm.HttpClient('docker-actions-toolkit');
const resp: httpm.HttpClientResponse = await http.get(version.releasesURL);
const body = await resp.readBody();
const statusCode = resp.message.statusCode || 500;
if (statusCode >= 400) {
throw new Error(`Failed to get Buildx releases from ${version.releasesURL} with status code ${statusCode}: ${body}`);
}
const releases = <Record<string, GitHubRelease>>JSON.parse(body);
if (!releases[version.version]) {
throw new Error(`Cannot find Buildx release ${version.version} in ${version.releasesURL}`);
}
return releases[version.version];
}
}
class InstallCache {
private readonly htcName: string;
private readonly htcVersion: string;
private readonly ghaCacheKey: string;
private readonly cacheDir: string;
private readonly cacheFile: string;
private readonly cachePath: string;
constructor(htcName: string, htcVersion: string) {
this.htcName = htcName;
this.htcVersion = htcVersion;
this.ghaCacheKey = util.format('%s-%s-%s', this.htcName, this.htcVersion, this.platform());
this.cacheDir = path.join(Buildx.configDir, '.bin', htcVersion, this.platform());
this.cacheFile = os.platform() == 'win32' ? 'docker-buildx.exe' : 'docker-buildx';
this.cachePath = path.join(this.cacheDir, this.cacheFile);
if (!fs.existsSync(this.cacheDir)) {
fs.mkdirSync(this.cacheDir, {recursive: true});
}
}
public async save(file: string): Promise<string> {
core.debug(`InstallCache.save ${file}`);
const cachePath = this.copyToCache(file);
const htcPath = await tc.cacheDir(this.cacheDir, this.htcName, this.htcVersion, this.platform());
core.debug(`InstallCache.save cached to hosted tool cache ${htcPath}`);
if (cache.isFeatureAvailable()) {
core.debug(`InstallCache.save caching ${this.ghaCacheKey} to GitHub Actions cache`);
await cache.saveCache([this.cacheDir], this.ghaCacheKey);
}
return cachePath;
}
public async find(): Promise<string> {
let htcPath = tc.find(this.htcName, this.htcVersion, this.platform());
if (htcPath) {
core.info(`Restored from hosted tool cache ${htcPath}`);
return this.copyToCache(`${htcPath}/${this.cacheFile}`);
}
if (cache.isFeatureAvailable()) {
core.debug(`GitHub Actions cache feature available`);
if (await cache.restoreCache([this.cacheDir], this.ghaCacheKey)) {
core.info(`Restored ${this.ghaCacheKey} from GitHub Actions cache`);
htcPath = await tc.cacheDir(this.cacheDir, this.htcName, this.htcVersion, this.platform());
core.info(`Restored to hosted tool cache ${htcPath}`);
return this.copyToCache(`${htcPath}/${this.cacheFile}`);
}
} else {
core.info(`GitHub Actions cache feature not available`);
}
return '';
}
private copyToCache(file: string): string {
core.debug(`Copying ${file} to ${this.cachePath}`);
fs.copyFileSync(file, this.cachePath);
fs.chmodSync(this.cachePath, '0755');
return this.cachePath;
}
private platform(): string {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const arm_version = (process.config.variables as any).arm_version;
return `${os.platform()}-${os.arch()}${arm_version ? 'v' + arm_version : ''}`;
}
}

View File

@@ -23,29 +23,37 @@ import * as github from '@actions/github';
import {GitHub} from './github';
export class Context {
public gitRef: string;
public buildGitContext: string;
public provenanceBuilderID: string;
private static readonly _tmpDir = fs.mkdtempSync(path.join(Context.ensureDirExists(process.env.RUNNER_TEMP || os.tmpdir()), 'docker-actions-toolkit-'));
private readonly _tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'docker-actions-toolkit-')).split(path.sep).join(path.posix.sep);
constructor() {
this.gitRef = github.context.ref;
if (github.context.sha && this.gitRef && !this.gitRef.startsWith('refs/')) {
this.gitRef = `refs/heads/${github.context.ref}`;
}
if (github.context.sha && !this.gitRef.startsWith(`refs/pull/`)) {
this.gitRef = github.context.sha;
}
this.buildGitContext = `${GitHub.serverURL}/${github.context.repo.owner}/${github.context.repo.repo}.git#${this.gitRef}`;
this.provenanceBuilderID = `${GitHub.serverURL}/${github.context.repo.owner}/${github.context.repo.repo}/actions/runs/${github.context.runId}`;
private static ensureDirExists(dir: string): string {
fs.mkdirSync(dir, {recursive: true});
return dir;
}
public tmpDir(): string {
return this._tmpDir;
public static tmpDir(): string {
return Context._tmpDir;
}
public tmpName(options?: tmp.TmpNameOptions): string {
public static tmpName(options?: tmp.TmpNameOptions): string {
return tmp.tmpNameSync(options);
}
public static gitRef(): string {
let gitRef = github.context.ref;
if (github.context.sha && gitRef && !gitRef.startsWith('refs/')) {
gitRef = `refs/heads/${github.context.ref}`;
}
if (github.context.sha && !gitRef.startsWith(`refs/pull/`)) {
gitRef = github.context.sha;
}
return gitRef;
}
public static gitContext(): string {
return `${GitHub.serverURL}/${github.context.repo.owner}/${github.context.repo.repo}.git#${Context.gitRef()}`;
}
public static provenanceBuilderID(): string {
return `${GitHub.serverURL}/${github.context.repo.owner}/${github.context.repo.repo}/actions/runs/${github.context.runId}`;
}
}

View File

@@ -1,60 +0,0 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import * as exec from '@actions/exec';
export class Docker {
public static isAvailable(): boolean {
let dockerAvailable = false;
exec
.getExecOutput('docker', undefined, {
ignoreReturnCode: true,
silent: true
})
.then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
dockerAvailable = false;
} else {
dockerAvailable = res.exitCode == 0;
}
})
// eslint-disable-next-line @typescript-eslint/no-unused-vars
.catch(error => {
dockerAvailable = false;
});
return dockerAvailable;
}
public static async printVersion(standalone?: boolean) {
const noDocker = standalone ?? !Docker.isAvailable();
if (noDocker) {
return;
}
await exec.exec('docker', ['version'], {
failOnStdErr: false
});
}
public static async printInfo(standalone?: boolean) {
const noDocker = standalone ?? !Docker.isAvailable();
if (noDocker) {
return;
}
await exec.exec('docker', ['info'], {
failOnStdErr: false
});
}
}

249
src/docker/assets.ts Normal file
View File

@@ -0,0 +1,249 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import fs from 'fs';
import {Context} from '../context';
export const setupDockerWinPs1 = (): string => {
return get('docker-setup-win.ps1', setupDockerWinPs1Data);
};
export const dockerServiceLogsPs1 = (): string => {
return get('docker-service-logs.ps1', dockerServiceLogsPs1Data);
};
export const limaYaml = (): string => {
return get('lima.yaml', limaYamlData);
};
const get = (filename: string, data: string, mode?: string): string => {
const assetPath = Context.tmpName({
template: `docker-asset-XXXXXX-${filename}`,
tmpdir: Context.tmpDir()
});
fs.writeFileSync(assetPath, data);
if (mode) {
fs.chmodSync(assetPath, mode);
}
return assetPath;
};
export const setupDockerWinPs1Data = `
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[string]$ToolDir,
[Parameter(Mandatory = $true)]
[string]$RunDir,
[Parameter(Mandatory = $true)]
[string]$DockerHost,
[Parameter(Mandatory = $false)]
[string]$DaemonConfig)
$pwver = (Get-ItemProperty -Path HKLM:\\SOFTWARE\\Microsoft\\PowerShell\\3\\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion
Write-Host "PowerShell version: $pwver"
# Create run directory
New-Item -ItemType Directory "$RunDir" -ErrorAction SilentlyContinue | Out-Null
# Remove existing service
if (Get-Service docker -ErrorAction SilentlyContinue) {
$dockerVersion = (docker version -f "{{.Server.Version}}")
Write-Host "Current installed Docker version: $dockerVersion"
# stop service
Stop-Service -Force -Name docker
Write-Host "Service stopped"
# remove service
sc.exe delete "docker"
# removes event log entry. we could use "Remove-EventLog -LogName -Source docker"
# but this cmd is not available atm
$ErrorActionPreference = "SilentlyContinue"
& reg delete "HKLM\\SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\docker" /f 2>&1 | Out-Null
$ErrorActionPreference = "Stop"
Write-Host "Service removed"
}
$env:DOCKER_HOST = $DockerHost
Write-Host "DOCKER_HOST: $env:DOCKER_HOST"
if ($DaemonConfig) {
Write-Host "Writing Docker daemon config"
New-Item -ItemType Directory -Force -Path "$env:ProgramData\\Docker\\config"
$DaemonConfig | Out-File -FilePath "$env:ProgramData\\Docker\\config\\daemon.json"
}
Write-Host "Creating service"
New-Item -ItemType Directory "$RunDir\\moby-root" -ErrorAction SilentlyContinue | Out-Null
New-Item -ItemType Directory "$RunDir\\moby-exec" -ErrorAction SilentlyContinue | Out-Null
Start-Process -Wait -NoNewWindow "$ToolDir\\dockerd" \`
-ArgumentList \`
"--host=$DockerHost", \`
"--data-root=$RunDir\\moby-root", \`
"--exec-root=$RunDir\\moby-exec", \`
"--pidfile=$RunDir\\docker.pid", \`
"--register-service"
Write-Host "Starting service"
Start-Service -Name docker
Write-Host "Service started successfully!"
$tries=20
Write-Host "Waiting for Docker daemon to start..."
While ($true) {
$ErrorActionPreference = "SilentlyContinue"
& "$ToolDir\\docker" version | Out-Null
$ErrorActionPreference = "Stop"
If ($LastExitCode -eq 0) {
break
}
$tries--
If ($tries -le 0) {
Throw "Failed to get a response from Docker daemon"
}
Write-Host -NoNewline "."
Start-Sleep -Seconds 1
}
Write-Host "Docker daemon started successfully!"
`;
export const dockerServiceLogsPs1Data = `
Get-WinEvent -ea SilentlyContinue \`
-FilterHashtable @{ProviderName= "docker"; LogName = "application"} |
Sort-Object @{Expression="TimeCreated";Descending=$false} |
ForEach-Object {"$($_.TimeCreated.ToUniversalTime().ToString("o")) [$($_.LevelDisplayName)] $($_.Message)"}
`;
export const limaYamlData = `
# VM type: "qemu" or "vz" (on macOS 13 and later).
# The vmType can be specified only on creating the instance.
# The vmType of existing instances cannot be changed.
# Builtin default: "qemu"
vmType: qemu
# OS: "Linux".
# Builtin default: "Linux"
os: null
# Arch: "default", "x86_64", "aarch64".
# Builtin default: "default" (corresponds to the host architecture)
arch: null
images:
- location: "https://cloud-images.ubuntu.com/releases/22.04/release-20231026/ubuntu-22.04-server-cloudimg-amd64.img"
arch: "x86_64"
digest: "sha256:054db2d88c454bb0ad8dfd8883955e3946b57d2b0bf0d023f3ade3c93cdd14e5"
- location: "https://cloud-images.ubuntu.com/releases/22.04/release-20231026/ubuntu-22.04-server-cloudimg-arm64.img"
arch: "aarch64"
digest: "sha256:eafa7742ce5ff109222ea313d31ea366d587b4e89b900b11d8285ae775dfe8c3"
# CPUs
# Builtin default: min(4, host CPU cores)
cpus: null
# Memory size
# Builtin default: min("4GiB", half of host memory)
memory: null
# Disk size
# Builtin default: "100GiB"
disk: 60GiB
# Expose host directories to the guest, the mount point might be accessible from all UIDs in the guest
# Builtin default: null (Mount nothing)
# This file: Mount the home as read-only, /tmp/lima as writable
mounts:
- location: "~"
- location: "/tmp/lima"
writable: true
# Mount type for above mounts, such as "reverse-sshfs" (from sshocker), "9p" (EXPERIMENTAL, from QEMUs virtio-9p-pci, aka virtfs),
# or "virtiofs" (EXPERIMENTAL, needs \`vmType: vz\`)
# Builtin default: "reverse-sshfs" (for QEMU), "virtiofs" (for vz)
mountType: null
containerd:
system: false
user: false
provision:
- mode: system
# This script defines the host.docker.internal hostname when hostResolver is disabled.
# It is also needed for lima 0.8.2 and earlier, which does not support hostResolver.hosts.
# Names defined in /etc/hosts inside the VM are not resolved inside containers when
# using the hostResolver; use hostResolver.hosts instead (requires lima 0.8.3 or later).
script: |
#!/bin/sh
sed -i 's/host.lima.internal.*/host.lima.internal host.docker.internal/' /etc/hosts
- mode: system
script: |
#!/bin/sh
apt-get install -f -y iptables
- mode: system
script: |
#!/bin/bash
set -eux -o pipefail
command -v docker >/dev/null 2>&1 && exit 0
if [ ! -e /etc/systemd/system/docker.socket.d/override.conf ]; then
mkdir -p /etc/systemd/system/docker.socket.d
# Alternatively we could just add the user to the "docker" group, but that requires restarting the user session
cat <<-EOF >/etc/systemd/system/docker.socket.d/override.conf
[Socket]
SocketUser=\${LIMA_CIDATA_USER}
EOF
fi
if [ ! -e /etc/docker/daemon.json ]; then
mkdir -p /etc/docker
cat <<-EOF >/etc/docker/daemon.json
{{stringify daemonConfig}}
EOF
fi
export DEBIAN_FRONTEND=noninteractive
curl -fsSL https://get.docker.com | sh -s -- --channel {{dockerBinChannel}} --version {{dockerBinVersion}}
probes:
- script: |
#!/bin/bash
set -eux -o pipefail
if ! timeout 30s bash -c "until command -v docker >/dev/null 2>&1; do sleep 3; done"; then
echo >&2 "docker is not installed yet"
exit 1
fi
if ! timeout 30s bash -c "until pgrep dockerd; do sleep 3; done"; then
echo >&2 "dockerd is not running"
exit 1
fi
hint: See "/var/log/cloud-init-output.log". in the guest
hostResolver:
# hostResolver.hosts requires lima 0.8.3 or later. Names defined here will also
# resolve inside containers, and not just inside the VM itself.
hosts:
host.docker.internal: host.lima.internal
portForwards:
- guestSocket: "/var/run/docker.sock"
hostSocket: "{{dockerSock}}"
audio:
# EXPERIMENTAL
# QEMU audiodev, e.g., "none", "coreaudio", "pa", "alsa", "oss".
# VZ driver, use "vz" as device name
# Choosing "none" will mute the audio output, and not play any sound.
# Builtin default: ""
device: none
`;

76
src/docker/docker.ts Normal file
View File

@@ -0,0 +1,76 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import fs from 'fs';
import os from 'os';
import path from 'path';
import * as core from '@actions/core';
import * as io from '@actions/io';
import {Exec} from '../exec';
import {ConfigFile} from '../types/docker';
export class Docker {
static get configDir(): string {
return process.env.DOCKER_CONFIG || path.join(os.homedir(), '.docker');
}
public static configFile(): ConfigFile | undefined {
const f = path.join(Docker.configDir, 'config.json');
if (!fs.existsSync(f)) {
return undefined;
}
return <ConfigFile>JSON.parse(fs.readFileSync(f, {encoding: 'utf-8'}));
}
public static async isAvailable(): Promise<boolean> {
return await io
.which('docker', true)
.then(res => {
core.debug(`Docker.isAvailable ok: ${res}`);
return true;
})
.catch(error => {
core.debug(`Docker.isAvailable error: ${error}`);
return false;
});
}
public static async context(name?: string): Promise<string> {
const args = ['context', 'inspect', '--format', '{{.Name}}'];
if (name) {
args.push(name);
}
return await Exec.getExecOutput(`docker`, args, {
ignoreReturnCode: true,
silent: true
}).then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
throw new Error(res.stderr);
}
return res.stdout.trim();
});
}
public static async printVersion(): Promise<void> {
await Exec.exec('docker', ['version']);
}
public static async printInfo(): Promise<void> {
await Exec.exec('docker', ['info']);
}
}

510
src/docker/install.ts Normal file
View File

@@ -0,0 +1,510 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import * as child_process from 'child_process';
import fs from 'fs';
import fsp from 'fs/promises';
import os from 'os';
import path from 'path';
import retry from 'async-retry';
import * as handlebars from 'handlebars';
import * as util from 'util';
import * as core from '@actions/core';
import * as httpm from '@actions/http-client';
import * as io from '@actions/io';
import * as tc from '@actions/tool-cache';
import {Context} from '../context';
import {Exec} from '../exec';
import {Util} from '../util';
import {limaYamlData, dockerServiceLogsPs1, setupDockerWinPs1} from './assets';
import {GitHubRelease} from '../types/github';
export interface InstallOpts {
version?: string;
channel?: string;
runDir: string;
contextName?: string;
daemonConfig?: string;
}
export class Install {
private readonly runDir: string;
private readonly version: string;
private readonly channel: string;
private readonly contextName: string;
private readonly daemonConfig?: string;
private _version: string | undefined;
private _toolDir: string | undefined;
private readonly limaInstanceName = 'docker-actions-toolkit';
constructor(opts: InstallOpts) {
this.runDir = opts.runDir;
this.version = opts.version || 'latest';
this.channel = opts.channel || 'stable';
this.contextName = opts.contextName || 'setup-docker-action';
this.daemonConfig = opts.daemonConfig;
}
get toolDir(): string {
return this._toolDir || Context.tmpDir();
}
public async download(): Promise<string> {
const release: GitHubRelease = await Install.getRelease(this.version);
this._version = release.tag_name.replace(/^v+|v+$/g, '');
core.debug(`docker.Install.download version: ${this._version}`);
const downloadURL = this.downloadURL(this._version, this.channel);
core.info(`Downloading ${downloadURL}`);
const downloadPath = await tc.downloadTool(downloadURL);
core.debug(`docker.Install.download downloadPath: ${downloadPath}`);
let extractFolder: string;
if (os.platform() == 'win32') {
extractFolder = await tc.extractZip(downloadPath);
} else {
extractFolder = await tc.extractTar(downloadPath);
}
if (Util.isDirectory(path.join(extractFolder, 'docker'))) {
extractFolder = path.join(extractFolder, 'docker');
}
core.debug(`docker.Install.download extractFolder: ${extractFolder}`);
core.info('Fixing perms');
fs.readdir(path.join(extractFolder), function (err, files) {
if (err) {
throw err;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
files.forEach(function (file, index) {
fs.chmodSync(path.join(extractFolder, file), '0755');
});
});
const tooldir = await tc.cacheDir(extractFolder, `docker-${this.channel}`, this._version.replace(/(0+)([1-9]+)/, '$2'));
core.addPath(tooldir);
core.info('Added Docker to PATH');
this._toolDir = tooldir;
return tooldir;
}
public async install(): Promise<void> {
if (!this.toolDir) {
throw new Error('toolDir must be set. Run download first.');
}
if (!this.runDir) {
throw new Error('runDir must be set');
}
switch (os.platform()) {
case 'darwin': {
await this.installDarwin();
break;
}
case 'linux': {
await this.installLinux();
break;
}
case 'win32': {
await this.installWindows();
break;
}
default: {
throw new Error(`Unsupported platform: ${os.platform()}`);
}
}
}
private async installDarwin(): Promise<void> {
const limaDir = path.join(os.homedir(), '.lima', this.limaInstanceName);
await io.mkdirP(limaDir);
const dockerHost = `unix://${limaDir}/docker.sock`;
// avoid brew to upgrade unrelated packages.
let envs = Object.assign({}, process.env, {
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: '1'
}) as {
[key: string]: string;
};
if (!(await Install.limaInstalled())) {
await core.group('Installing lima', async () => {
await Exec.exec('brew', ['install', 'lima'], {env: envs});
});
}
await core.group('Creating lima config', async () => {
let limaDaemonConfig = {};
if (this.daemonConfig) {
limaDaemonConfig = JSON.parse(this.daemonConfig);
}
handlebars.registerHelper('stringify', function (obj) {
return new handlebars.SafeString(JSON.stringify(obj));
});
const limaCfg = handlebars.compile(limaYamlData)({
daemonConfig: limaDaemonConfig,
dockerSock: `${limaDir}/docker.sock`,
dockerBinVersion: this._version,
dockerBinChannel: this.channel
});
core.info(`Writing lima config to ${path.join(limaDir, 'lima.yaml')}`);
fs.writeFileSync(path.join(limaDir, 'lima.yaml'), limaCfg);
core.info(limaCfg);
});
const qemuArch = await Install.qemuArch();
await core.group('QEMU version', async () => {
await Exec.exec(`qemu-system-${qemuArch} --version`);
});
// lima might already be started on the runner so env var added in download
// method is not expanded to the running process.
envs = Object.assign({}, envs, {
PATH: `${this.toolDir}:${process.env.PATH}`
}) as {
[key: string]: string;
};
await core.group('Starting lima instance', async () => {
const limaStartArgs = ['start', `--name=${this.limaInstanceName}`, '--tty=false'];
if (process.env.LIMA_START_ARGS) {
limaStartArgs.push(process.env.LIMA_START_ARGS);
}
try {
await Exec.exec(`limactl ${limaStartArgs.join(' ')}`, [], {env: envs});
} catch (e) {
fsp
.readdir(limaDir)
.then(files => {
files
.filter(f => path.extname(f) === '.log')
.forEach(f => {
const logfile = path.join(limaDir, f);
const logcontent = fs.readFileSync(logfile, {encoding: 'utf8'}).trim();
if (logcontent.length > 0) {
core.info(`### ${logfile}:\n${logcontent}`);
}
});
})
.catch(() => {
// ignore
});
throw e;
}
});
await core.group('Create Docker context', async () => {
await Exec.exec('docker', ['context', 'create', this.contextName, '--docker', `host=${dockerHost}`]);
await Exec.exec('docker', ['context', 'use', this.contextName]);
});
}
private async installLinux(): Promise<void> {
const dockerHost = `unix://${path.join(this.runDir, 'docker.sock')}`;
await io.mkdirP(this.runDir);
const daemonConfigPath = path.join(this.runDir, 'daemon.json');
await fs.writeFileSync(daemonConfigPath, '{}');
let daemonConfig = undefined;
const daemonConfigDefaultPath = '/etc/docker/daemon.json';
if (fs.existsSync(daemonConfigDefaultPath)) {
await core.group('Default Docker daemon config found', async () => {
core.info(JSON.stringify(JSON.parse(fs.readFileSync(daemonConfigDefaultPath, {encoding: 'utf8'})), null, 2));
});
daemonConfig = JSON.parse(fs.readFileSync(daemonConfigDefaultPath, {encoding: 'utf8'}));
}
if (this.daemonConfig) {
daemonConfig = Object.assign(daemonConfig || {}, JSON.parse(this.daemonConfig));
}
if (daemonConfig) {
const daemonConfigStr = JSON.stringify(daemonConfig, null, 2);
await core.group('Writing Docker daemon config', async () => {
fs.writeFileSync(daemonConfigPath, daemonConfigStr);
core.info(daemonConfigStr);
});
}
await core.group('Start Docker daemon', async () => {
const bashPath: string = await io.which('bash', true);
const cmd = `${this.toolDir}/dockerd --host="${dockerHost}" --config-file="${daemonConfigPath}" --exec-root="${this.runDir}/execroot" --data-root="${this.runDir}/data" --pidfile="${this.runDir}/docker.pid" --userland-proxy=false`;
core.info(`[command] ${cmd}`); // https://github.com/actions/toolkit/blob/3d652d3133965f63309e4b2e1c8852cdbdcb3833/packages/exec/src/toolrunner.ts#L47
const proc = await child_process.spawn(
// We can't use Exec.exec here because we need to detach the process to
// avoid killing it when the action finishes running. Even if detached,
// we also need to run dockerd in a subshell and unref the process so
// GitHub Action doesn't wait for it to finish.
`sudo -E ${bashPath} << EOF
( ${cmd} 2>&1 | tee "${this.runDir}/dockerd.log" ) &
EOF`,
[],
{
detached: true,
shell: true,
stdio: ['ignore', process.stdout, process.stderr]
}
);
proc.unref();
await Util.sleep(3);
const retries = 10;
await retry(
async bail => {
try {
await Exec.getExecOutput(`docker version`, undefined, {
silent: true,
env: Object.assign({}, process.env, {
DOCKER_HOST: dockerHost
}) as {
[key: string]: string;
}
});
} catch (e) {
bail(e);
}
},
{
retries: retries,
minTimeout: 1000,
onRetry: (err, i) => {
core.info(`${err}. Retrying (${i}/${retries})...`);
}
}
);
core.info(`Docker daemon started started successfully`);
});
await core.group('Create Docker context', async () => {
await Exec.exec('docker', ['context', 'create', this.contextName, '--docker', `host=${dockerHost}`]);
await Exec.exec('docker', ['context', 'use', this.contextName]);
});
}
private async installWindows(): Promise<void> {
const dockerHost = 'npipe:////./pipe/setup_docker_action';
let daemonConfig = undefined;
const daemonConfigPath = path.join(this.runDir, 'daemon.json');
if (fs.existsSync(daemonConfigPath)) {
await core.group('Default Docker daemon config found', async () => {
core.info(JSON.stringify(JSON.parse(fs.readFileSync(daemonConfigPath, {encoding: 'utf8'})), null, 2));
});
daemonConfig = JSON.parse(fs.readFileSync(daemonConfigPath, {encoding: 'utf8'}));
}
if (this.daemonConfig) {
daemonConfig = Object.assign(daemonConfig || {}, JSON.parse(this.daemonConfig));
}
let daemonConfigStr = '{}';
if (daemonConfig) {
daemonConfigStr = JSON.stringify(daemonConfig, null, 2);
await core.group('Docker daemon config', async () => {
core.info(daemonConfigStr);
});
}
await core.group('Install Docker daemon service', async () => {
const setupCmd = await Util.powershellCommand(setupDockerWinPs1(), {
ToolDir: this.toolDir,
RunDir: this.runDir,
DockerHost: dockerHost,
DaemonConfig: daemonConfigStr
});
await Exec.exec(setupCmd.command, setupCmd.args);
const logCmd = await Util.powershellCommand(dockerServiceLogsPs1());
await Exec.exec(logCmd.command, logCmd.args);
});
await core.group('Create Docker context', async () => {
await Exec.exec('docker', ['context', 'create', this.contextName, '--docker', `host=${dockerHost}`]);
await Exec.exec('docker', ['context', 'use', this.contextName]);
});
}
public async tearDown(): Promise<void> {
if (!this.runDir) {
throw new Error('runDir must be set');
}
switch (os.platform()) {
case 'darwin': {
await this.tearDownDarwin();
break;
}
case 'linux': {
await this.tearDownLinux();
break;
}
case 'win32': {
await this.tearDownWindows();
break;
}
default: {
throw new Error(`Unsupported platform: ${os.platform()}`);
}
}
}
private async tearDownDarwin(): Promise<void> {
await core.group('Docker daemon logs', async () => {
await Exec.exec('limactl', ['shell', '--tty=false', this.limaInstanceName, 'sudo', 'journalctl', '-u', 'docker.service', '-l', '--no-pager']).catch(() => {
core.warning(`Failed to get Docker daemon logs`);
});
});
await core.group('Stopping lima instance', async () => {
await Exec.exec('limactl', ['stop', '--tty=false', this.limaInstanceName, '--force']);
});
await core.group('Removing lima instance', async () => {
await Exec.exec('limactl', ['delete', '--tty=false', this.limaInstanceName, '--force']);
});
await core.group('Removing Docker context', async () => {
await Exec.exec('docker', ['context', 'rm', '-f', this.contextName]);
});
await core.group(`Cleaning up runDir`, async () => {
await Exec.exec('sudo', ['rm', '-rf', this.runDir]);
});
}
private async tearDownLinux(): Promise<void> {
await core.group('Docker daemon logs', async () => {
core.info(fs.readFileSync(path.join(this.runDir, 'dockerd.log'), {encoding: 'utf8'}));
});
await core.group('Stopping Docker daemon', async () => {
await Exec.exec('sudo', ['kill', '-s', 'SIGTERM', fs.readFileSync(path.join(this.runDir, 'docker.pid')).toString().trim()]);
await Util.sleep(5);
});
await core.group('Removing Docker context', async () => {
await Exec.exec('docker', ['context', 'rm', '-f', this.contextName]);
});
await core.group(`Cleaning up runDir`, async () => {
await Exec.exec('sudo', ['rm', '-rf', this.runDir], {
ignoreReturnCode: true,
failOnStdErr: false
});
});
}
private async tearDownWindows(): Promise<void> {
await core.group('Docker daemon logs', async () => {
const logCmd = await Util.powershellCommand(dockerServiceLogsPs1());
await Exec.exec(logCmd.command, logCmd.args);
});
await core.group('Removing Docker context', async () => {
await Exec.exec('docker', ['context', 'rm', '-f', this.contextName]);
});
}
private downloadURL(version: string, channel: string): string {
const platformOS = Install.platformOS();
const platformArch = Install.platformArch();
const ext = platformOS === 'win' ? '.zip' : '.tgz';
return util.format('https://download.docker.com/%s/static/%s/%s/docker-%s%s', platformOS, channel, platformArch, version, ext);
}
private static platformOS(): string {
switch (os.platform()) {
case 'darwin': {
return 'mac';
}
case 'linux': {
return 'linux';
}
case 'win32': {
return 'win';
}
default: {
return os.platform();
}
}
}
private static platformArch(): string {
switch (os.arch()) {
case 'x64': {
return 'x86_64';
}
case 'ppc64': {
return 'ppc64le';
}
case 'arm64': {
return 'aarch64';
}
case 'arm': {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const arm_version = (process.config.variables as any).arm_version;
switch (arm_version) {
case 6: {
return 'armel';
}
case 7: {
return 'armhf';
}
default: {
return `v${arm_version}`;
}
}
}
default: {
return os.arch();
}
}
}
private static async limaInstalled(): Promise<boolean> {
return await io
.which('lima', true)
.then(res => {
core.debug(`docker.Install.limaAvailable ok: ${res}`);
return true;
})
.catch(error => {
core.debug(`docker.Install.limaAvailable error: ${error}`);
return false;
});
}
private static async qemuArch(): Promise<string> {
switch (os.arch()) {
case 'x64': {
return 'x86_64';
}
case 'arm64': {
return 'aarch64';
}
default: {
return os.arch();
}
}
}
public static async getRelease(version: string): Promise<GitHubRelease> {
const url = `https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/docker-releases.json`;
const http: httpm.HttpClient = new httpm.HttpClient('docker-actions-toolkit');
const resp: httpm.HttpClientResponse = await http.get(url);
const body = await resp.readBody();
const statusCode = resp.message.statusCode || 500;
if (statusCode >= 400) {
throw new Error(`Failed to get Docker release ${version} from ${url} with status code ${statusCode}: ${body}`);
}
const releases = <Record<string, GitHubRelease>>JSON.parse(body);
if (!releases[version]) {
throw new Error(`Cannot find Docker release ${version} in ${url}`);
}
return releases[version];
}
}

127
src/dockerhub.ts Normal file
View File

@@ -0,0 +1,127 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import * as core from '@actions/core';
import * as httpm from '@actions/http-client';
import {HttpCodes} from '@actions/http-client';
import {RepositoryRequest, RepositoryResponse, RepositoryTagsRequest, RepositoryTagsResponse, TokenRequest, TokenResponse, UpdateRepoDescriptionRequest} from './types/dockerhub';
export interface DockerHubOpts {
credentials: TokenRequest;
}
const apiBaseURL = 'https://hub.docker.com';
const loginURL = `${apiBaseURL}/v2/users/login?refresh_token=true`;
const repositoriesURL = `${apiBaseURL}/v2/repositories/`;
export class DockerHub {
private readonly opts: DockerHubOpts;
private readonly httpc: httpm.HttpClient;
private constructor(opts: DockerHubOpts, httpc: httpm.HttpClient) {
this.opts = opts;
this.httpc = httpc;
}
public static async build(opts: DockerHubOpts): Promise<DockerHub> {
return new DockerHub(
opts,
new httpm.HttpClient('docker-actions-toolkit', [], {
headers: {
Authorization: `JWT ${await DockerHub.login(opts.credentials)}`,
'Content-Type': 'application/json'
}
})
);
}
public async getRepositoryTags(req: RepositoryTagsRequest): Promise<RepositoryTagsResponse> {
const url = new URL(`${repositoriesURL}${req.namespace}/${req.name}/tags`);
if (req.page) {
url.searchParams.append('page', req.page.toString());
}
if (req.page_size) {
url.searchParams.append('page_size', req.page_size.toString());
}
const resp: httpm.HttpClientResponse = await this.httpc.get(url.toString());
return <RepositoryTagsResponse>JSON.parse(await DockerHub.handleResponse(resp));
}
public async getRepositoryAllTags(req: RepositoryTagsRequest): Promise<RepositoryTagsResponse> {
const tags: RepositoryTagsResponse = await this.getRepositoryTags(req);
while (tags.next) {
const nextURL = new URL(tags.next);
const pageNumber = Number(nextURL.searchParams.get('page'));
const pageSize = Number(nextURL.searchParams.get('page_size')) || undefined;
const nextTags = await this.getRepositoryTags({
namespace: req.namespace,
name: req.name,
page: pageNumber,
page_size: pageSize || req.page_size
} as RepositoryTagsRequest);
tags.results.push(...nextTags.results);
tags.next = nextTags.next;
}
return tags;
}
public async getRepository(req: RepositoryRequest): Promise<RepositoryResponse> {
const resp: httpm.HttpClientResponse = await this.httpc.get(`${repositoriesURL}${req.namespace}/${req.name}`);
return <RepositoryResponse>JSON.parse(await DockerHub.handleResponse(resp));
}
public async updateRepoDescription(req: UpdateRepoDescriptionRequest): Promise<RepositoryResponse> {
const body = {
full_description: req.full_description
};
if (req.description) {
body['description'] = req.description;
}
const resp: httpm.HttpClientResponse = await this.httpc.patch(`${repositoriesURL}${req.namespace}/${req.name}`, JSON.stringify(body));
return <RepositoryResponse>JSON.parse(await DockerHub.handleResponse(resp));
}
private static async login(req: TokenRequest): Promise<string> {
const http: httpm.HttpClient = new httpm.HttpClient('docker-actions-toolkit', [], {
headers: {
'Content-Type': 'application/json'
}
});
const resp: httpm.HttpClientResponse = await http.post(loginURL, JSON.stringify(req));
const tokenResp = <TokenResponse>JSON.parse(await DockerHub.handleResponse(resp));
core.setSecret(`${tokenResp.token}`);
return `${tokenResp.token}`;
}
private static async handleResponse(resp: httpm.HttpClientResponse): Promise<string> {
const body = await resp.readBody();
resp.message.statusCode = resp.message.statusCode || HttpCodes.InternalServerError;
if (resp.message.statusCode < 200 || resp.message.statusCode >= 300) {
if (resp.message.statusCode == HttpCodes.Unauthorized) {
throw new Error(`Docker Hub API: operation not permitted`);
}
const errResp = <Record<string, string>>JSON.parse(body);
for (const k of ['message', 'detail', 'error']) {
if (errResp[k]) {
throw new Error(`Docker Hub API: bad status code ${resp.message.statusCode}: ${errResp[k]}`);
}
}
throw new Error(`Docker Hub API: bad status code ${resp.message.statusCode}`);
}
return body;
}
}

31
src/exec.ts Normal file
View File

@@ -0,0 +1,31 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import * as core from '@actions/core';
import * as exec from '@actions/exec';
import {ExecOptions, ExecOutput} from '@actions/exec';
export class Exec {
public static async exec(commandLine: string, args?: string[], options?: ExecOptions): Promise<number> {
core.debug(`Exec.exec: ${commandLine} ${args?.join(' ')}`);
return exec.exec(commandLine, args, options);
}
public static async getExecOutput(commandLine: string, args?: string[], options?: ExecOptions): Promise<ExecOutput> {
core.debug(`Exec.getExecOutput: ${commandLine} ${args?.join(' ')}`);
return exec.getExecOutput(commandLine, args, options);
}
}

View File

@@ -14,24 +14,146 @@
* limitations under the License.
*/
import * as exec from '@actions/exec';
import * as core from '@actions/core';
import {Octokit} from '@octokit/core';
import {restEndpointMethods} from '@octokit/plugin-rest-endpoint-methods';
import {Exec} from './exec';
import {GitHub} from './github';
import {Context} from '@actions/github/lib/context';
import {Context as GitContext} from './types/git';
export class Git {
public static async getRemoteSha(repo: string, ref: string): Promise<string> {
return await exec
.getExecOutput(`git`, ['ls-remote', repo, ref], {
ignoreReturnCode: true,
silent: true
public static async context(): Promise<GitContext> {
const ctx = new Context();
ctx.ref = await Git.ref();
ctx.sha = await Git.fullCommit();
return ctx;
}
public static async isInsideWorkTree(): Promise<boolean> {
return await Git.exec(['rev-parse', '--is-inside-work-tree'])
.then(out => {
return out === 'true';
})
.then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
throw new Error(res.stderr);
}
const [rsha] = res.stdout.trim().split(/[\s\t]/);
if (rsha.length == 0) {
throw new Error(`Cannot find remote ref for ${repo}#${ref}`);
}
return rsha;
.catch(() => {
return false;
});
}
public static async remoteSha(repo: string, ref: string, token?: string): Promise<string> {
const repoMatch = repo.match(/github.com\/([^/]+)\/([^/]+?)(?:\.git)?(\/|$)/);
// if we have a token and this is a GitHub repo we can use the GitHub API
if (token && repoMatch) {
core.setSecret(token);
const octokit = new (Octokit.plugin(restEndpointMethods).defaults({
baseUrl: GitHub.apiURL
}))({auth: token});
const [owner, repoName] = repoMatch.slice(1, 3);
try {
return (
await octokit.rest.repos.listCommits({
owner: owner,
repo: repoName,
sha: ref,
per_page: 1
})
).data[0].sha;
} catch (e) {
throw new Error(`Cannot find remote ref for ${repo}#${ref}: ${e.message}`);
}
}
// otherwise we fall back to git ls-remote
return await Git.exec(['ls-remote', repo, ref]).then(out => {
const [rsha] = out.split(/[\s\t]/);
if (rsha.length == 0) {
throw new Error(`Cannot find remote ref for ${repo}#${ref}`);
}
return rsha;
});
}
public static async remoteURL(): Promise<string> {
return await Git.exec(['remote', 'get-url', 'origin']).then(rurl => {
if (rurl.length == 0) {
return Git.exec(['remote', 'get-url', 'upstream']).then(rurl => {
if (rurl.length == 0) {
throw new Error(`Cannot find remote URL for origin or upstream`);
}
return rurl;
});
}
return rurl;
});
}
public static async ref(): Promise<string> {
const isHeadDetached = await Git.isHeadDetached();
if (isHeadDetached) {
return await Git.getDetachedRef();
}
return await Git.exec(['symbolic-ref', 'HEAD']);
}
public static async fullCommit(): Promise<string> {
return await Git.exec(['show', '--format=%H', 'HEAD', '--quiet', '--']);
}
public static async shortCommit(): Promise<string> {
return await Git.exec(['show', '--format=%h', 'HEAD', '--quiet', '--']);
}
public static async tag(): Promise<string> {
return await Git.exec(['tag', '--points-at', 'HEAD', '--sort', '-version:creatordate']).then(tags => {
if (tags.length == 0) {
return Git.exec(['describe', '--tags', '--abbrev=0']);
}
return tags.split('\n')[0];
});
}
private static async isHeadDetached(): Promise<boolean> {
return await Git.exec(['branch', '--show-current']).then(res => {
return res.length == 0;
});
}
private static async getDetachedRef(): Promise<string> {
const res = await Git.exec(['show', '-s', '--pretty=%D']);
const refMatch = res.match(/^HEAD, (.*)$/);
if (!refMatch) {
throw new Error(`Cannot find detached HEAD ref in "${res}"`);
}
const ref = refMatch[1].trim();
// Tag refs are formatted as "tag: <tagname>"
if (ref.startsWith('tag: ')) {
return `refs/tags/${ref.split(':')[1].trim()}`;
}
// Otherwise, it's a branch "<origin>/<branch-name>, <branch-name>"
const branchMatch = ref.match(/^[^/]+\/[^/]+, (.+)$/);
if (branchMatch) {
return `refs/heads/${branchMatch[1].trim()}`;
}
throw new Error(`Unsupported detached HEAD ref in "${res}"`);
}
private static async exec(args: string[] = []): Promise<string> {
return await Exec.getExecOutput(`git`, args, {
ignoreReturnCode: true,
silent: true
}).then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
throw new Error(res.stderr);
}
return res.stdout.trim();
});
}
}

View File

@@ -15,43 +15,75 @@
*/
import {GitHub as Octokit} from '@actions/github/lib/utils';
import * as core from '@actions/core';
import * as github from '@actions/github';
import {components as OctoOpenApiTypes} from '@octokit/openapi-types';
import jwt_decode, {JwtPayload} from 'jwt-decode';
import {Context} from '@actions/github/lib/context';
import {jwtDecode, JwtPayload} from 'jwt-decode';
export type GitHubRepo = OctoOpenApiTypes['schemas']['repository'];
export interface GitHubActionsRuntimeToken extends JwtPayload {
ac?: string;
}
import {GitHubActionsRuntimeToken, GitHubActionsRuntimeTokenAC, GitHubRepo} from './types/github';
export interface GitHubOpts {
token?: string;
}
export class GitHub {
public static readonly serverURL: string = process.env.GITHUB_SERVER_URL || 'https://github.com';
public readonly octokit: InstanceType<typeof Octokit>;
constructor(opts?: GitHubOpts) {
this.octokit = github.getOctokit(`${opts?.token}`);
}
get context(): Context {
return github.context;
}
get serverURL(): string {
return process.env.GITHUB_SERVER_URL || 'https://github.com';
}
get actionsRuntimeToken(): GitHubActionsRuntimeToken {
const token = process.env['ACTIONS_RUNTIME_TOKEN'] || '';
return token ? jwt_decode<GitHubActionsRuntimeToken>(token) : {};
}
public repoData(): Promise<GitHubRepo> {
return this.octokit.rest.repos.get({...github.context.repo}).then(response => response.data as GitHubRepo);
}
static get context(): Context {
return github.context;
}
static get serverURL(): string {
return process.env.GITHUB_SERVER_URL || 'https://github.com';
}
static get apiURL(): string {
return process.env.GITHUB_API_URL || 'https://api.github.com';
}
static get actionsRuntimeToken(): GitHubActionsRuntimeToken | undefined {
const token = process.env['ACTIONS_RUNTIME_TOKEN'] || '';
return token ? (jwtDecode<JwtPayload>(token) as GitHubActionsRuntimeToken) : undefined;
}
public static async printActionsRuntimeTokenACs() {
let jwt: GitHubActionsRuntimeToken | undefined;
try {
jwt = GitHub.actionsRuntimeToken;
} catch (e) {
throw new Error(`Cannot parse GitHub Actions Runtime Token: ${e.message}`);
}
if (!jwt) {
throw new Error(`ACTIONS_RUNTIME_TOKEN not set`);
}
try {
<Array<GitHubActionsRuntimeTokenAC>>JSON.parse(`${jwt.ac}`).forEach(ac => {
let permission: string;
switch (ac.Permission) {
case 1:
permission = 'read';
break;
case 2:
permission = 'write';
break;
case 3:
permission = 'read/write';
break;
default:
permission = `unimplemented (${ac.Permission})`;
}
core.info(`${ac.Scope}: ${permission}`);
});
} catch (e) {
throw new Error(`Cannot parse GitHub Actions Runtime Token ACs: ${e.message}`);
}
}
}

42
src/index.ts Normal file
View File

@@ -0,0 +1,42 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import * as core from '@actions/core';
const isPost = !!process.env['STATE_isPost'];
if (!isPost) {
core.saveState('isPost', 'true');
}
/**
* Runs a GitHub Action.
* Output will be streamed to the live console.
*
* @param main runs the defined function.
* @param post runs the defined function at the end of the job if set.
* @returns Promise<void>
*/
export async function run(main: () => Promise<void>, post?: () => Promise<void>): Promise<void> {
if (!isPost) {
try {
await main();
} catch (e) {
core.setFailed(e.message);
}
} else if (post) {
await post();
}
}

View File

@@ -14,20 +14,13 @@
* limitations under the License.
*/
import {Context} from './context';
import {Buildx} from './buildx';
import {BuildKit} from './buildkit';
import {Buildx} from './buildx/buildx';
import {Install as BuildxInstall} from './buildx/install';
import {Bake} from './buildx/bake';
import {Builder} from './buildx/builder';
import {BuildKit} from './buildkit/buildkit';
import {GitHub} from './github';
export {Builder, BuilderOpts, BuilderInfo, NodeInfo} from './builder';
export {BuildKit, BuildKitOpts} from './buildkit';
export {Buildx, BuildxOpts} from './buildx';
export {Context} from './context';
export {Docker} from './docker';
export {Git} from './git';
export {GitHub, GitHubRepo, GitHubActionsRuntimeToken} from './github';
export {Util} from './util';
export interface ToolkitOpts {
/**
* GitHub token to use for authentication.
@@ -37,15 +30,19 @@ export interface ToolkitOpts {
}
export class Toolkit {
public context: Context;
public github: GitHub;
public buildx: Buildx;
public buildxInstall: BuildxInstall;
public bake: Bake;
public builder: Builder;
public buildkit: BuildKit;
constructor(opts: ToolkitOpts = {}) {
this.context = new Context();
this.github = new GitHub({token: opts.githubToken});
this.buildx = new Buildx({context: this.context});
this.buildkit = new BuildKit({context: this.context, buildx: this.buildx});
this.buildx = new Buildx();
this.buildxInstall = new BuildxInstall();
this.bake = new Bake({buildx: this.buildx});
this.builder = new Builder({buildx: this.buildx});
this.buildkit = new BuildKit({buildx: this.buildx});
}
}

45
src/types/bake.ts Normal file
View File

@@ -0,0 +1,45 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export interface BakeDefinition {
group: Record<string, Group>;
target: Record<string, Target>;
}
export interface Group {
targets: Array<string>;
}
export interface Target {
args?: Record<string, string>;
attest?: Array<string>;
'cache-from'?: Array<string>;
'cache-to'?: Array<string>;
context: string;
contexts?: Record<string, string>;
dockerfile: string;
'dockerfile-inline'?: string;
labels?: Record<string, string>;
'no-cache'?: boolean;
'no-cache-filter'?: Array<string>;
output?: Array<string>;
platforms?: Array<string>;
pull?: boolean;
secret?: Array<string>;
ssh?: Array<string>;
tags?: Array<string>;
target?: string;
}

44
src/types/builder.ts Normal file
View File

@@ -0,0 +1,44 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export interface BuilderInfo {
name?: string;
driver?: string;
lastActivity?: Date;
nodes: NodeInfo[];
}
export interface Node {
name?: string;
endpoint?: string;
'driver-opts'?: Array<string>;
'buildkitd-flags'?: string;
platforms?: string;
}
export interface NodeInfo extends Node {
status?: string;
buildkit?: string;
labels?: Record<string, string>;
gcPolicy?: Array<GCPolicy>;
}
export interface GCPolicy {
all?: boolean;
filter?: string[];
keepDuration?: string;
keepBytes?: string;
}

28
src/types/buildx.ts Normal file
View File

@@ -0,0 +1,28 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export interface Cert {
cacert?: string;
cert?: string;
key?: string;
}
export interface DownloadVersion {
key: string;
version: string;
downloadURL: string;
releasesURL: string;
}

66
src/types/docker.ts Normal file
View File

@@ -0,0 +1,66 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// https://github.com/docker/cli/blob/master/cli/config/configfile/file.go
export interface ConfigFile {
auths: Record<string, AuthConfig>;
HttpHeaders?: Record<string, string>;
psFormat?: string;
imagesFormat?: string;
networksFormat?: string;
pluginsFormat?: string;
volumesFormat?: string;
statsFormat?: string;
detachKeys?: string;
credsStore?: string;
credHelpers?: Record<string, string>;
serviceInspectFormat?: string;
servicesFormat?: string;
tasksFormat?: string;
secretFormat?: string;
configFormat?: string;
nodesFormat?: string;
pruneFilters?: string[];
proxies?: Record<string, ProxyConfig>;
experimental?: string;
stackOrchestrator?: string;
kubernetes?: KubernetesConfig;
currentContext?: string;
cliPluginsExtraDirs?: string[];
plugins?: Record<string, Record<string, string>>;
aliases?: Record<string, string>;
}
export interface ProxyConfig {
httpProxy?: string;
httpsProxy?: string;
noProxy?: string;
ftpProxy?: string;
}
export interface KubernetesConfig {
allNamespaces?: string;
}
export interface AuthConfig {
username?: string;
password?: string;
auth?: string;
email?: string;
serveraddress?: string;
identitytoken?: string;
registrytoken?: string;
}

113
src/types/dockerhub.ts Normal file
View File

@@ -0,0 +1,113 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export interface TokenRequest {
username: string;
password: string;
}
export interface TokenResponse {
token: string;
detail: string;
}
export interface RepositoryRequest {
namespace: string;
name: string;
}
export interface RepositoryResponse {
user: string;
name: string;
namespace: string;
repository_type: string;
status: number;
status_description: string;
description: string;
is_private: boolean;
is_automated: boolean;
can_edit: boolean;
star_count: number;
pull_count: number;
last_updated: string;
date_registered: string;
collaborator_count: number;
affiliation: string;
hub_user: string;
has_starred: boolean;
full_description: string;
permissions: {
read: boolean;
write: boolean;
admin: boolean;
};
media_types: Array<string>;
content_types: Array<string>;
}
export interface RepositoryTagsRequest {
namespace: string;
name: string;
page?: number;
page_size?: number;
}
export interface RepositoryTagsResponse {
count: number;
next?: string;
previous?: string;
results: Array<RepositoryTagsResult>;
}
export interface RepositoryTagsResult {
creator: number;
id: number;
images: Array<RepositoryTagsResultImage>;
last_updated: Date;
last_updater: number;
last_updater_username: string;
name: string;
repository: number;
full_size: number;
v2: boolean;
tag_status: string;
tag_last_pulled: Date;
tag_last_pushed: Date;
media_type: string;
content_type: string;
digest: string;
}
export interface RepositoryTagsResultImage {
architecture: string;
features: string;
variant?: string;
digest: string;
os: string;
os_features: string;
os_version?: string;
size: number;
status: string;
last_pulled: Date;
last_pushed: Date;
}
export interface UpdateRepoDescriptionRequest {
name: string;
namespace: string;
description?: string;
full_description: string;
}

19
src/types/git.ts Normal file
View File

@@ -0,0 +1,19 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {Context as GitHubContext} from '@actions/github/lib/context';
export type Context = GitHubContext;

36
src/types/github.ts Normal file
View File

@@ -0,0 +1,36 @@
/**
* Copyright 2023 actions-toolkit authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {components as OctoOpenApiTypes} from '@octokit/openapi-types';
import {JwtPayload} from 'jwt-decode';
export interface GitHubRelease {
id: number;
tag_name: string;
html_url: string;
assets: Array<string>;
}
export type GitHubRepo = OctoOpenApiTypes['schemas']['repository'];
export interface GitHubActionsRuntimeToken extends JwtPayload {
ac?: string;
}
export interface GitHubActionsRuntimeTokenAC {
Scope: string;
Permission: number;
}

View File

@@ -14,11 +14,19 @@
* limitations under the License.
*/
import fs from 'fs';
import * as core from '@actions/core';
import * as io from '@actions/io';
import {parse} from 'csv-parse/sync';
export interface InputListOpts {
ignoreComma?: boolean;
comment?: string;
quote?: string | boolean | Buffer | null;
}
export class Util {
public static getInputList(name: string, ignoreComma?: boolean): string[] {
public static getInputList(name: string, opts?: InputListOpts): string[] {
const res: Array<string> = [];
const items = core.getInput(name);
@@ -29,20 +37,24 @@ export class Util {
const records = parse(items, {
columns: false,
relaxQuotes: true,
comment: '#',
comment: opts?.comment,
relaxColumnCount: true,
skipEmptyLines: true
skipEmptyLines: true,
quote: opts?.quote
});
for (const record of records as Array<string[]>) {
if (record.length == 1) {
res.push(record[0]);
continue;
} else if (!ignoreComma) {
if (opts?.ignoreComma) {
res.push(record[0]);
} else {
res.push(...record[0].split(','));
}
} else if (!opts?.ignoreComma) {
res.push(...record);
continue;
} else {
res.push(record.join(','));
}
res.push(record.join(','));
}
return res.filter(item => item).map(pat => pat.trim());
@@ -54,12 +66,75 @@ export class Util {
}
}
public static isValidUrl(url: string): boolean {
public static isValidURL(urlStr: string): boolean {
let url;
try {
new URL(url);
url = new URL(urlStr);
} catch (e) {
return false;
}
return true;
return url.protocol === 'http:' || url.protocol === 'https:';
}
public static isValidRef(refStr: string): boolean {
if (Util.isValidURL(refStr)) {
return true;
}
for (const prefix of ['git://', 'github.com/', 'git@']) {
if (refStr.startsWith(prefix)) {
return true;
}
}
return false;
}
public static async powershellCommand(script: string, params?: Record<string, string>) {
const powershellPath: string = await io.which('powershell', true);
const escapedScript = script.replace(/'/g, "''").replace(/"|\n|\r/g, '');
const escapedParams: string[] = [];
if (params) {
for (const key in params) {
escapedParams.push(`-${key} '${params[key].replace(/'/g, "''").replace(/"|\n|\r/g, '')}'`);
}
}
return {
command: `"${powershellPath}"`,
args: ['-NoLogo', '-Sta', '-NoProfile', '-NonInteractive', '-ExecutionPolicy', 'Unrestricted', '-Command', `& '${escapedScript}' ${escapedParams.join(' ')}`]
};
}
public static isDirectory(p) {
try {
return fs.lstatSync(p).isDirectory();
} catch (_) {
// noop
}
return false;
}
public static trimPrefix(str: string, suffix: string): string {
if (!str || !suffix) {
return str;
}
const index = str.indexOf(suffix);
if (index !== 0) {
return str;
}
return str.substring(suffix.length);
}
public static trimSuffix(str: string, suffix: string): string {
if (!str || !suffix) {
return str;
}
const index = str.lastIndexOf(suffix);
if (index === -1 || index + suffix.length !== str.length) {
return str;
}
return str.substring(0, index);
}
public static sleep(seconds: number) {
return new Promise(resolve => setTimeout(resolve, seconds * 1000));
}
}

View File

@@ -1,8 +1,9 @@
{
"compilerOptions": {
"esModuleInterop": true,
"target": "es6",
"module": "commonjs",
"target": "ES2022",
"module": "nodenext",
"moduleResolution": "nodenext",
"strict": true,
"declaration": true,
"sourceMap": true,
@@ -19,6 +20,6 @@
"./__tests__/**/*",
"./lib/**/*",
"node_modules",
"jest.config.ts"
"jest.config*.ts"
]
}

5153
yarn.lock

File diff suppressed because it is too large Load Diff