Compare commits

..

181 Commits

Author SHA1 Message Date
CrazyMax
6df98c1aad Merge pull request #417 from crazy-max/missing-dct-removal
Some checks failed
publish / publish (push) Has been cancelled
missing DCT removal for a docker command
2024-07-19 16:24:23 +02:00
CrazyMax
a9bd3f5b6b missing DCT removal for a docker command
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-07-19 16:19:38 +02:00
CrazyMax
f7a8b21610 Merge pull request #416 from crazy-max/docker-daemon-up
buildx(history): check docker daemon is running before exporting
2024-07-19 16:18:17 +02:00
CrazyMax
8177e153d6 buildx(history): check docker daemon is running before exporting
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-07-19 13:31:32 +02:00
CrazyMax
a14ead6486 docker: isDaemonRunning func
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-07-19 13:25:38 +02:00
CrazyMax
f9de623b1d Merge pull request #415 from tonistiigi/update-buildx-v0.16.1
update buildx to v0.16.1
2024-07-19 10:30:23 +02:00
Tonis Tiigi
202104bf16 update buildx to v0.16.1
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
2024-07-18 14:55:07 -07:00
Tõnis Tiigi
b6b4cf170e Merge pull request #414 from docker/bot/buildx-releases-json
Update `.github/buildx-releases.json`
2024-07-18 14:53:09 -07:00
tonistiigi
311ae1dacc github: update .github/buildx-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-07-18 21:51:28 +00:00
CrazyMax
163d33a2bd Merge pull request #412 from crazy-max/docker-disable-dct
Some checks failed
publish / publish (push) Has been cancelled
disable DCT for docker commands
2024-07-17 14:07:19 +02:00
CrazyMax
d283be916f Merge pull request #413 from docker/dependabot/npm_and_yarn/semver-7.6.3
build(deps): bump semver from 7.6.2 to 7.6.3
2024-07-17 13:55:39 +02:00
dependabot[bot]
ffc7d98a98 build(deps): bump semver from 7.6.2 to 7.6.3
Bumps [semver](https://github.com/npm/node-semver) from 7.6.2 to 7.6.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.6.2...v7.6.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-16 22:29:08 +00:00
CrazyMax
d36bef4156 disable DCT for docker commands
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-07-16 17:17:24 +02:00
CrazyMax
300c014384 Merge pull request #411 from crazy-max/buildx-localstate-regex-fix
Some checks failed
publish / publish (push) Has been cancelled
buildx: fix regex in fixLocalState func
2024-07-15 13:29:06 +02:00
CrazyMax
b641895e8b buildx: fix regex in fixLocalState func
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-07-15 13:25:56 +02:00
CrazyMax
4db21c4b43 Merge pull request #406 from docker/dependabot/npm_and_yarn/actions/artifact-2.1.8
build(deps): bump @actions/artifact from 2.1.7 to 2.1.8
2024-07-15 13:20:46 +02:00
CrazyMax
8d807b6902 Merge pull request #410 from crazy-max/export-build-image-env
buildx(history): env var to override export build image
2024-07-15 13:18:06 +02:00
CrazyMax
99e6b01d39 github: use isGhes func from actions/artifact module
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-07-15 13:14:08 +02:00
CrazyMax
23208073ee buildx(history): env var to override export build image
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-07-15 13:06:28 +02:00
CrazyMax
2264b5ac72 Merge pull request #409 from tonistiigi/update-buildx-v0.16.0
update buildx and buildkit
2024-07-15 01:06:12 +02:00
Tonis Tiigi
d5247558ad update buildx and buildkit
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
2024-07-11 12:04:54 -07:00
Tõnis Tiigi
e5ef18078d Merge pull request #408 from docker/bot/buildx-releases-json
Update `.github/buildx-releases.json`
2024-07-11 12:01:49 -07:00
tonistiigi
517914fc72 github: update .github/buildx-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-07-11 19:00:56 +00:00
dependabot[bot]
4c7e849bb4 build(deps): bump @actions/artifact from 2.1.7 to 2.1.8
Bumps [@actions/artifact](https://github.com/actions/toolkit/tree/HEAD/packages/artifact) from 2.1.7 to 2.1.8.
- [Changelog](https://github.com/actions/toolkit/blob/main/packages/artifact/RELEASES.md)
- [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/artifact)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-05 23:03:28 +00:00
CrazyMax
ce0d3d5cf1 Merge pull request #405 from crazy-max/buildx-fixlocalstate-typo
buildx: fix typo in fixLocalState func
2024-07-05 16:33:54 +02:00
CrazyMax
90311d5c08 buildx: fix typo in fixLocalState func
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-07-05 16:29:52 +02:00
CrazyMax
d908ffcd2c Merge pull request #404 from crazy-max/buildx-localstate-test
buildx: extra test to ensure legit path is not trimmed for localstate
2024-07-05 16:25:41 +02:00
CrazyMax
3bd6acf499 buildx: make refs dir optional in localState func
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-07-05 16:18:20 +02:00
CrazyMax
5b4c1ac025 buildx: extra test to ensure legit path is not trimmed for localstate
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-07-05 16:16:06 +02:00
CrazyMax
e49e07d23e Merge pull request #403 from crazy-max/buildx-fix-localstate
buildx: fix broken local state
2024-07-05 16:02:45 +02:00
CrazyMax
b4c8e1a503 buildx: fix broken local state
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-07-05 15:45:51 +02:00
CrazyMax
1510b1d394 Merge pull request #402 from docker/bot/buildx-lab-releases-json
Update `.github/buildx-lab-releases.json`
2024-07-05 14:53:25 +02:00
crazy-max
214e644835 github: update .github/buildx-lab-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-07-05 12:06:43 +00:00
CrazyMax
d7a84a5d46 Merge pull request #400 from crazy-max/docker-context-inspect
Some checks failed
publish / publish (push) Has been cancelled
docker: contextInspect func
2024-07-04 10:25:46 +02:00
CrazyMax
61967435c1 docker: contextInspect func
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-07-04 10:13:17 +02:00
CrazyMax
78ca5b7f21 Merge pull request #399 from docker/bot/buildx-releases-json
Update `.github/buildx-releases.json`
2024-07-04 09:42:16 +02:00
crazy-max
cc344864cb github: update .github/buildx-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-07-04 00:16:52 +00:00
CrazyMax
c70efab546 Merge pull request #392 from crazy-max/history-export-detach-dialstdio
Some checks failed
publish / publish (push) Has been cancelled
buildx(history): detach dial-stdio process
2024-07-02 15:16:11 +02:00
CrazyMax
55a2181286 Merge pull request #394 from crazy-max/summary-without-upload
github(summary): build record upload optional
2024-07-02 15:11:09 +02:00
CrazyMax
846cac2aa2 Merge pull request #396 from crazy-max/github-isghes
Some checks failed
publish / publish (push) Has been cancelled
github: isGHES func
2024-07-02 13:29:06 +02:00
CrazyMax
83d63d1cf1 github: isGHES func
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-07-02 13:21:26 +02:00
CrazyMax
931b62d64f Merge pull request #395 from crazy-max/bake-fix-resolveRefs
buildx: fix resolveRefs for bake
2024-07-02 12:52:09 +02:00
CrazyMax
16ecd76490 buildx: fix resolveRefs for bake
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-07-02 12:07:44 +02:00
CrazyMax
b26af9f868 github(summary): build record upload optional
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-07-02 10:56:16 +02:00
CrazyMax
ff35e30b01 buildx(history): improve child process termination and exit code handling
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-07-02 10:39:22 +02:00
CrazyMax
200e43c426 buildx(history): detach dial-stdio process
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-07-02 10:36:20 +02:00
CrazyMax
2cb2c5573f Merge pull request #391 from crazy-max/buildkit-git
buildkit: git parseURL and parseRef funcs
2024-07-01 14:20:29 +02:00
CrazyMax
f2de331691 Merge pull request #393 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2024-07-01 14:20:08 +02:00
crazy-max
27254cb337 github: update .github/docker-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-07-01 12:10:08 +00:00
CrazyMax
c8df3474bd buildkit: git parseURL and parseRef funcs
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-29 13:58:49 +02:00
CrazyMax
fe9937dd36 Merge pull request #390 from crazy-max/build-metadata
bake: align build metadata
2024-06-29 13:15:55 +02:00
CrazyMax
8785275da1 bake: align build metadata
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-29 12:00:21 +02:00
CrazyMax
7bd4fed6bc Merge pull request #388 from docker/bot/docker-releases-json
Some checks failed
publish / publish (push) Has been cancelled
Update `.github/docker-releases.json`
2024-06-27 10:37:34 +02:00
crazy-max
18fbe0cb64 github: update .github/docker-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-06-27 00:23:11 +00:00
CrazyMax
7360d08bf9 Merge pull request #365 from crazy-max/build-checks-annotations
github: annotate build warnings
2024-06-26 21:58:50 +02:00
CrazyMax
644587f0d1 ci(test): use buildx master for build warnings
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-26 12:32:15 +02:00
CrazyMax
3a7b0a6080 github: annotate build warnings
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-26 12:32:15 +02:00
CrazyMax
2e70a0cac6 Merge pull request #384 from crazy-max/summary-learn-more-blogpost
Some checks failed
publish / publish (push) Has been cancelled
github(summary): update learn more link
2024-06-26 11:17:33 +02:00
CrazyMax
e600fe266c Merge pull request #383 from crazy-max/summary-rm-preview-title
github(summary): remove preview title and tidy download link
2024-06-26 11:17:14 +02:00
CrazyMax
52d663521a Merge pull request #386 from crazy-max/ci-bk-image
ci(test): set buildkit image for container builder
2024-06-26 09:51:41 +02:00
CrazyMax
dceb603792 ci(test): set buildkit image for container builder
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-26 09:45:33 +02:00
CrazyMax
77b8d647eb Merge pull request #362 from crazy-max/buildx-build-resolvestatus
buildx(build): resolveWarnings from metadata
2024-06-26 09:14:35 +02:00
CrazyMax
630b180101 buildx(build): resolveWarnings from metadata
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-26 09:06:42 +02:00
CrazyMax
2e536e4a37 Merge pull request #385 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2024-06-25 14:09:47 +02:00
crazy-max
40f2a14d95 github: update .github/docker-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-06-25 12:09:09 +00:00
CrazyMax
9853314413 github(summary): tidy download link
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-25 13:26:29 +02:00
CrazyMax
f2e65ab473 github(summary): update learn more link
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-25 12:04:09 +02:00
CrazyMax
e130c40c84 github(summary): remove preview title
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-25 12:01:54 +02:00
CrazyMax
bbf0a8d268 Merge pull request #382 from crazy-max/github-upload-artifact-ghes
Some checks failed
publish / publish (push) Has been cancelled
github(artifact): check upload artifact support for GHES
2024-06-25 09:39:16 +02:00
CrazyMax
4ce8a708c9 github(artifact): check upload artifact support for GHES
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-24 14:15:22 +02:00
CrazyMax
6f66565779 Merge pull request #381 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2024-06-21 12:43:34 +02:00
crazy-max
504af69bd9 github: update .github/docker-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-06-21 10:43:22 +00:00
CrazyMax
f3734ee134 Merge pull request #380 from docker/bot/buildx-lab-releases-json
Update `.github/buildx-lab-releases.json`
2024-06-21 12:42:56 +02:00
crazy-max
4183444df2 github: update .github/buildx-lab-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-06-21 00:14:48 +00:00
CrazyMax
a5466523c1 Merge pull request #378 from crazy-max/summary-escape-html
Some checks failed
publish / publish (push) Has been cancelled
github(summary): escape HTML when printing build error
2024-06-20 18:56:27 +02:00
CrazyMax
e0007fb5cd github(summary): escape HTML when printing build error
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-20 18:44:25 +02:00
CrazyMax
c330895cef Merge pull request #377 from crazy-max/summary-collapsible
github(summary): add collapsible section for build inputs and bake def
2024-06-20 18:42:47 +02:00
CrazyMax
e7017a21b8 github(summary): add details to summary sections
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-20 16:21:16 +02:00
CrazyMax
b56d9771d7 util: countLines func
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-20 16:21:15 +02:00
CrazyMax
680ab5bdf1 Merge pull request #379 from crazy-max/ci-releases-json-pr-trigger
ci: only trigger releases json workflow on pr when changed
2024-06-20 16:21:03 +02:00
CrazyMax
5ea53e0090 ci: only trigger releases json workflow on pr when changed
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-20 16:17:35 +02:00
CrazyMax
b5ae9ccb69 Merge pull request #375 from docker/dependabot/github_actions/peter-evans/create-pull-request-6.1.0
Some checks failed
publish / publish (push) Has been cancelled
build(deps): bump peter-evans/create-pull-request from 6.0.5 to 6.1.0
2024-06-19 20:28:10 +02:00
CrazyMax
8c81eef9ff Merge pull request #376 from crazy-max/export-buildx-version
buildx(history): check buildx version before exporting
2024-06-19 20:27:29 +02:00
CrazyMax
6668cc52b7 buildx(history): check buildx version before exporting
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-19 18:30:56 +02:00
dependabot[bot]
58b2ef7640 build(deps): bump peter-evans/create-pull-request from 6.0.5 to 6.1.0
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 6.0.5 to 6.1.0.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](6d6857d369...c5a7806660)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-18 22:24:06 +00:00
CrazyMax
d791e46ccd Merge pull request #374 from tonistiigi/update-buildx-v0.15.1
update buildx to v0.15.1
2024-06-18 21:49:26 +02:00
Tonis Tiigi
1cb547a599 update buildx to v0.15.1
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
2024-06-18 12:05:39 -07:00
Tõnis Tiigi
b61fc5ff9c Merge pull request #373 from docker/bot/buildx-releases-json
Update `.github/buildx-releases.json`
2024-06-18 12:04:35 -07:00
tonistiigi
eb3bf3055e github: update .github/buildx-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-06-18 19:03:57 +00:00
CrazyMax
6c6fdffd44 Merge pull request #368 from crazy-max/summary-artifact-relative-link
Some checks failed
publish / publish (push) Has been cancelled
github(summary): use relative path for artifact link and fix filename
2024-06-18 17:18:31 +02:00
CrazyMax
edcf239f49 github(summary): convert filename and build name to unicode
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-18 12:10:07 +02:00
CrazyMax
e26a82d0aa util: stringToUnicodeEntities func
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-18 11:21:06 +02:00
CrazyMax
3162c096bd github(summary): use relative path for artifact link
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-18 11:21:06 +02:00
CrazyMax
0da8b903ef Merge pull request #372 from crazy-max/jest-fixes
jest: small configuration changes for mock
2024-06-18 11:20:43 +02:00
CrazyMax
953dc3bb00 jest: mocks already cleared through configuration
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-18 11:07:29 +02:00
CrazyMax
f27d52d6b7 jest: keep original github env vars for integration tests
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-18 10:59:04 +02:00
CrazyMax
5c3fc146af jest: no need to clear mock for integration tests
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-18 10:59:04 +02:00
CrazyMax
ef2bd7607f Merge pull request #371 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2024-06-18 10:30:02 +02:00
crazy-max
6352d92e3f github: update .github/docker-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-06-18 08:09:40 +00:00
CrazyMax
a39cb53a8a Merge pull request #370 from docker/dependabot/github_actions/docker/bake-action-5
build(deps): bump docker/bake-action from 4 to 5
2024-06-18 10:09:11 +02:00
dependabot[bot]
9b811fbceb build(deps): bump docker/bake-action from 4 to 5
Bumps [docker/bake-action](https://github.com/docker/bake-action) from 4 to 5.
- [Release notes](https://github.com/docker/bake-action/releases)
- [Commits](https://github.com/docker/bake-action/compare/v4...v5)

---
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>
2024-06-17 22:54:54 +00:00
CrazyMax
7b876a9e95 Merge pull request #366 from docker/bot/buildx-lab-releases-json
Update `.github/buildx-lab-releases.json`
2024-06-16 22:31:58 +02:00
crazy-max
fd2f683a14 github: update .github/buildx-lab-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-06-15 00:15:01 +00:00
CrazyMax
5205f4197c Merge pull request #363 from docker/bot/buildx-lab-releases-json
Some checks failed
publish / publish (push) Has been cancelled
Update `.github/buildx-lab-releases.json`
2024-06-14 13:17:23 +02:00
crazy-max
c76674dd4a github: update .github/buildx-lab-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-06-14 10:45:24 +00:00
CrazyMax
8471422135 Merge pull request #364 from crazy-max/buildx-build-resolveprovenance
buildx(build): resolveProvenance from metadata
2024-06-14 12:44:59 +02:00
CrazyMax
e266e3e984 buildx(build): resolveProvenance from metadata
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-14 12:26:13 +02:00
CrazyMax
1b7201d572 Merge pull request #361 from crazy-max/intoto-types
intoto and provenance types
2024-06-14 12:19:22 +02:00
CrazyMax
6983a397f4 intoto and provenance types
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-13 11:17:01 +02:00
CrazyMax
81e959d041 Merge pull request #360 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2024-06-13 11:15:23 +02:00
crazy-max
475cefa34e github: update .github/docker-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-06-13 00:23:09 +00:00
CrazyMax
c14688a151 Merge pull request #359 from crazy-max/buildkit-types
buildkit: add types
2024-06-12 10:33:48 +02:00
CrazyMax
dde9860104 buildkit: add types
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-12 10:22:35 +02:00
CrazyMax
ee6e7bbd95 Merge pull request #358 from crazy-max/fix-workflow-run
Some checks failed
publish / publish (push) Has been cancelled
github: make attempts optional in workflowRunURL
2024-06-12 09:29:14 +02:00
CrazyMax
fe58cc26f5 github: make attempts optional in workflowRunURL
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-12 09:22:43 +02:00
CrazyMax
1bf4b58db1 Merge pull request #357 from campbel/campbel/get-input-list-empty-test
Add a test to define behavior when empty parameters are passed
2024-06-11 23:49:31 +02:00
Chris Campbell
82d10009f7 Add a test to define behavior when empty parameters are passed
Signed-off-by: Chris Campbell <chris.campbell@dutchie.com>
2024-06-11 15:31:15 -06:00
CrazyMax
bf985d0056 Merge pull request #356 from docker/dependabot/npm_and_yarn/braces-3.0.3
build(deps): bump braces from 3.0.2 to 3.0.3
2024-06-11 21:05:52 +02:00
dependabot[bot]
129955ee04 build(deps): bump braces from 3.0.2 to 3.0.3
Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3.
- [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-11 18:56:34 +00:00
CrazyMax
6d74aad91b Merge pull request #355 from tonistiigi/update-buildx-v0.15.0
update buildx to v0.15.0
2024-06-11 20:52:47 +02:00
Tõnis Tiigi
24546185f6 Merge pull request #354 from docker/bot/buildx-releases-json
Update `.github/buildx-releases.json`
2024-06-11 11:38:17 -07:00
Tonis Tiigi
1b5c574732 update buildx to v0.15.0
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
2024-06-11 11:37:36 -07:00
tonistiigi
2ace0cd1f7 github: update .github/buildx-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-06-11 18:36:48 +00:00
CrazyMax
33d4b448ac Merge pull request #350 from crazy-max/gha-rest
Some checks failed
publish / publish (push) Has been cancelled
buildx(build): resolveCacheToAttrs func
2024-06-10 13:39:47 +02:00
CrazyMax
ee91773603 Merge pull request #353 from crazy-max/fix-docker-install-linux
docker(install): add tooldir to path for linux and windows
2024-06-10 13:38:59 +02:00
CrazyMax
5186ba6fdf test: bump docker to 26.1.4
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-10 13:34:09 +02:00
CrazyMax
1309d2023e docker(install): add tooldir to path for linux and windows
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-10 13:34:09 +02:00
CrazyMax
6a4479ebc2 Merge pull request #340 from crazy-max/oci
oci: loadArchive to import an index from a tar archive image bundle
2024-06-07 14:50:14 +02:00
CrazyMax
cd9f97a8c5 Merge pull request #352 from docker/bot/buildx-releases-json
Update `.github/buildx-releases.json`
2024-06-07 10:00:51 +02:00
crazy-max
65f5b77696 github: update .github/buildx-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-06-07 07:59:06 +00:00
CrazyMax
9ba5af418c Merge pull request #351 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2024-06-07 09:58:38 +02:00
crazy-max
93ae2ded04 github: update .github/docker-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-06-06 00:22:40 +00:00
CrazyMax
15788e8b93 buildx(build): resolveCacheToAttrs func
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-06-05 13:59:57 +02:00
CrazyMax
92053e1988 Merge pull request #348 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2024-06-04 09:22:31 +02:00
CrazyMax
6d856fd53e Merge pull request #349 from docker/bot/buildx-releases-json
Update `.github/buildx-releases.json`
2024-06-04 09:22:06 +02:00
crazy-max
e67313ac6d github: update .github/buildx-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-06-04 00:16:35 +00:00
crazy-max
881230f4b0 github: update .github/docker-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-05-30 00:22:56 +00:00
CrazyMax
6fb52d2a23 oci: loadArchive to import an index from a tar archive image bundle
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-05-29 11:11:12 +02:00
CrazyMax
2941f52b66 Merge pull request #346 from crazy-max/gh-workflow-run-retries
github: set attempts to workflowRunURL
2024-05-28 09:44:05 +02:00
CrazyMax
760d0c2369 github: set attempts to workflowRunURL
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-05-27 19:57:40 +02:00
CrazyMax
d344961874 Merge pull request #345 from crazy-max/move-types
Some checks failed
publish / publish (push) Has been cancelled
move types to the right place
2024-05-27 12:15:48 +02:00
CrazyMax
5958c823ef Merge pull request #344 from docker/bot/buildx-lab-releases-json
Update `.github/buildx-lab-releases.json`
2024-05-27 12:07:38 +02:00
CrazyMax
a033bb70cd move types to the right place
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-05-27 12:06:52 +02:00
crazy-max
8f8c0bb7ec github: update .github/buildx-lab-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-05-27 10:02:50 +00:00
CrazyMax
0903e498a4 Merge pull request #324 from crazy-max/build-summary
github: write build summary
2024-05-27 12:02:24 +02:00
CrazyMax
1e903f84b6 github: write build summary
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-05-27 11:41:36 +02:00
CrazyMax
3a2e4a89a6 Merge pull request #342 from tonistiigi/update-buildx-v0.14.1
update buildx to v0.14.1
2024-05-22 21:07:46 +02:00
CrazyMax
b3dc87c0e0 Merge pull request #341 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2024-05-22 21:07:21 +02:00
Tonis Tiigi
bd1955c564 update buildx to v0.14.1
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
2024-05-22 11:26:21 -07:00
tonistiigi
956acbf3c6 github: update .github/docker-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-05-22 18:21:03 +00:00
Tõnis Tiigi
ea36deec7f Merge pull request #343 from docker/bot/buildx-releases-json
Update `.github/buildx-releases.json`
2024-05-22 11:20:38 -07:00
tonistiigi
9d829e4f4a github: update .github/buildx-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-05-22 18:19:56 +00:00
CrazyMax
66c00b9bbd Merge pull request #339 from crazy-max/update-virtual-env
ci(virtual-env): add ubuntu-24.04 to the matrix
2024-05-15 14:38:26 +02:00
CrazyMax
448f9ac218 ci(virtual-env): add ubuntu-24.04 to the matrix
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-05-15 14:28:30 +02:00
CrazyMax
624e16fb7c Merge pull request #307 from crazy-max/build-export
Some checks failed
publish / publish (push) Has been cancelled
buildx: build history export
2024-05-14 13:32:42 +02:00
CrazyMax
ee84f2ac79 buildx: build history export
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-05-14 13:09:18 +02:00
CrazyMax
7eb10a1871 Merge pull request #338 from crazy-max/pin-azure-storage
chore: ignore azure/storage-blob updates
2024-05-14 11:19:39 +02:00
CrazyMax
27a4b44e2c chore: ignore azure/storage-blob updates
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-05-14 11:11:29 +02:00
CrazyMax
75c874dd62 Merge pull request #336 from docker/dependabot/npm_and_yarn/csv-parse-5.5.6
build(deps): bump csv-parse from 5.5.5 to 5.5.6
2024-05-14 11:02:55 +02:00
CrazyMax
c94131a9e9 Merge pull request #337 from docker/bot/buildx-lab-releases-json
Update `.github/buildx-lab-releases.json`
2024-05-14 08:58:15 +02:00
crazy-max
ec0a6e279b github: update .github/buildx-lab-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-05-14 00:14:28 +00:00
dependabot[bot]
e0dd35a21c build(deps): bump csv-parse from 5.5.5 to 5.5.6
Bumps [csv-parse](https://github.com/adaltas/node-csv/tree/HEAD/packages/csv-parse) from 5.5.5 to 5.5.6.
- [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.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>
2024-05-13 23:09:36 +00:00
CrazyMax
b25aadfb15 Merge pull request #332 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2024-05-13 13:53:58 +02:00
CrazyMax
70f40871ae Merge pull request #333 from docker/dependabot/npm_and_yarn/semver-7.6.2
build(deps): bump semver from 7.6.0 to 7.6.2
2024-05-13 13:53:35 +02:00
dependabot[bot]
61d2e66416 build(deps): bump semver from 7.6.0 to 7.6.2
Bumps [semver](https://github.com/npm/node-semver) from 7.6.0 to 7.6.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.6.0...v7.6.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-09 22:29:38 +00:00
crazy-max
c425c1b90c github: update .github/docker-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-05-09 12:08:35 +00:00
CrazyMax
4a832ddb12 Merge pull request #328 from crazy-max/chore-rm-await
chore: remove unnecessary await
2024-05-07 12:47:37 +02:00
CrazyMax
adf692bdc3 Merge pull request #329 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2024-05-07 12:47:02 +02:00
CrazyMax
022c68391f Merge pull request #330 from crazy-max/update-dev-deps
chore: update dev dependencies
2024-05-07 12:46:43 +02:00
CrazyMax
eea3ac78bc chore: update dev dependencies
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-05-07 12:34:45 +02:00
crazy-max
76526d71ff github: update .github/docker-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-05-07 00:22:11 +00:00
CrazyMax
4078ffc721 chore: remove unnecessary await
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-05-03 10:20:42 +02:00
CrazyMax
ffa2fadd58 Merge pull request #326 from docker/bot/docker-releases-json
Update `.github/docker-releases.json`
2024-05-02 21:56:47 +02:00
CrazyMax
53d4eba877 Merge pull request #323 from crazy-max/corepack-yarn
chore: use corepack to install yarn
2024-05-02 21:56:18 +02:00
crazy-max
2c7c8d2118 github: update .github/docker-releases.json
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-05-01 00:23:39 +00:00
CrazyMax
4e56c9c296 chore: use corepack to install yarn
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-04-29 13:39:36 +02:00
CrazyMax
ae20b6fb50 Merge pull request #322 from crazy-max/metadata-file-name
buildx: generate random metadata filename
2024-04-26 14:16:18 +02:00
CrazyMax
a99525f2f1 buildx: allow passing metadata file when resolving digest or refs
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-04-26 14:04:58 +02:00
CrazyMax
5820a0ba86 buildx: generate random metadata filename
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-04-26 13:55:59 +02:00
CrazyMax
62e3923775 util: generateRandomString func
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-04-26 13:54:52 +02:00
CrazyMax
a459c7c911 buildx: ensure consistent metadata filename for bake and build
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
2024-04-26 13:27:04 +02:00
104 changed files with 5571 additions and 2185 deletions

View File

@@ -17,7 +17,7 @@
],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": "2023",
"ecmaVersion": 2023,
"sourceType": "module"
},
"plugins": [

1
.gitattributes vendored
View File

@@ -1,2 +1,3 @@
/.yarn/releases/** binary
/.yarn/plugins/** binary
/__tests__/fixtures/oci-archive/** binary

View File

@@ -1,43 +1,207 @@
{
"latest": {
"id": 137689487,
"tag_name": "v0.12.1-desktop.4",
"html_url": "https://github.com/docker/buildx-desktop/releases/tag/v0.12.1-desktop.4",
"id": 161492089,
"tag_name": "v0.15.1-desktop.1",
"html_url": "https://github.com/docker/buildx-desktop/releases/tag/v0.15.1-desktop.1",
"assets": [
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.darwin-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.darwin-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.darwin-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.darwin-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.darwin-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.darwin-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.linux-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.linux-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.linux-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.linux-arm-v6",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.linux-arm-v7",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.linux-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.linux-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.linux-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.linux-ppc64le",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.linux-riscv64",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.linux-riscv64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.linux-riscv64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.linux-s390x",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.linux-s390x.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.linux-s390x.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.windows-amd64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.windows-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.windows-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.windows-arm64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.windows-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/buildx-v0.12.1-desktop.4.windows-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.12.1-desktop.4/checksums.txt"
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.darwin-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.darwin-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.darwin-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.darwin-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.darwin-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.darwin-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-arm-v6",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-arm-v7",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-ppc64le",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-riscv64",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-riscv64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-riscv64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-s390x",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-s390x.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-s390x.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.windows-amd64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.windows-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.windows-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.windows-arm64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.windows-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.windows-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/checksums.txt"
]
},
"v0.15.1-desktop.1": {
"id": 161492089,
"tag_name": "v0.15.1-desktop.1",
"html_url": "https://github.com/docker/buildx-desktop/releases/tag/v0.15.1-desktop.1",
"assets": [
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.darwin-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.darwin-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.darwin-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.darwin-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.darwin-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.darwin-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-arm-v6",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-arm-v7",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-ppc64le",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-riscv64",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-riscv64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-riscv64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-s390x",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-s390x.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.linux-s390x.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.windows-amd64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.windows-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.windows-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.windows-arm64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.windows-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/buildx-v0.15.1-desktop.1.windows-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.1-desktop.1/checksums.txt"
]
},
"v0.15.0-desktop.1": {
"id": 160473592,
"tag_name": "v0.15.0-desktop.1",
"html_url": "https://github.com/docker/buildx-desktop/releases/tag/v0.15.0-desktop.1",
"assets": [
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.darwin-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.darwin-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.darwin-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.darwin-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.darwin-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.darwin-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.linux-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.linux-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.linux-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.linux-arm-v6",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.linux-arm-v7",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.linux-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.linux-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.linux-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.linux-ppc64le",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.linux-riscv64",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.linux-riscv64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.linux-riscv64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.linux-s390x",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.linux-s390x.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.linux-s390x.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.windows-amd64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.windows-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.windows-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.windows-arm64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.windows-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/buildx-v0.15.0-desktop.1.windows-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.15.0-desktop.1/checksums.txt"
]
},
"v0.14.1-desktop.1": {
"id": 157588052,
"tag_name": "v0.14.1-desktop.1",
"html_url": "https://github.com/docker/buildx-desktop/releases/tag/v0.14.1-desktop.1",
"assets": [
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.darwin-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.darwin-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.darwin-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.darwin-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.darwin-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.darwin-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.linux-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.linux-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.linux-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.linux-arm-v6",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.linux-arm-v7",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.linux-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.linux-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.linux-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.linux-ppc64le",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.linux-riscv64",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.linux-riscv64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.linux-riscv64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.linux-s390x",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.linux-s390x.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.linux-s390x.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.windows-amd64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.windows-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.windows-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.windows-arm64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.windows-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/buildx-v0.14.1-desktop.1.windows-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.1-desktop.1/checksums.txt"
]
},
"v0.14.0-desktop.1": {
"id": 155523887,
"tag_name": "v0.14.0-desktop.1",
"html_url": "https://github.com/docker/buildx-desktop/releases/tag/v0.14.0-desktop.1",
"assets": [
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.darwin-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.darwin-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.darwin-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.darwin-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.darwin-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.darwin-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.linux-amd64",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.linux-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.linux-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.linux-arm-v6",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.linux-arm-v7",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.linux-arm64",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.linux-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.linux-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.linux-ppc64le",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.linux-riscv64",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.linux-riscv64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.linux-riscv64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.linux-s390x",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.linux-s390x.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.linux-s390x.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.windows-amd64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.windows-amd64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.windows-amd64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.windows-arm64.exe",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.windows-arm64.provenance.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/buildx-v0.14.0-desktop.1.windows-arm64.sbom.json",
"https://github.com/docker/buildx-desktop/releases/download/v0.14.0-desktop.1/checksums.txt"
]
},
"v0.13.1-desktop-preview.2": {

View File

@@ -1,43 +1,412 @@
{
"latest": {
"id": 151768856,
"tag_name": "v0.14.0",
"html_url": "https://github.com/docker/buildx/releases/tag/v0.14.0",
"id": 166111587,
"tag_name": "v0.16.1",
"html_url": "https://github.com/docker/buildx/releases/tag/v0.16.1",
"assets": [
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.darwin-amd64",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.darwin-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.darwin-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.darwin-arm64",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.darwin-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.darwin-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-amd64",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-arm-v6",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-arm-v7",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-arm64",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-ppc64le",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-riscv64",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-riscv64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-riscv64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-s390x",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-s390x.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.linux-s390x.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.windows-amd64.exe",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.windows-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.windows-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.windows-arm64.exe",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.windows-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/buildx-v0.14.0.windows-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.0/checksums.txt"
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.darwin-amd64",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.darwin-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.darwin-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.darwin-arm64",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.darwin-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.darwin-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-amd64",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-arm-v6",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-arm-v7",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-arm64",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-ppc64le",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-riscv64",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-riscv64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-riscv64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-s390x",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-s390x.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-s390x.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.windows-amd64.exe",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.windows-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.windows-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.windows-arm64.exe",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.windows-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.windows-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/checksums.txt"
]
},
"v0.16.1": {
"id": 166111587,
"tag_name": "v0.16.1",
"html_url": "https://github.com/docker/buildx/releases/tag/v0.16.1",
"assets": [
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.darwin-amd64",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.darwin-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.darwin-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.darwin-arm64",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.darwin-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.darwin-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-amd64",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-arm-v6",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-arm-v7",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-arm64",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-ppc64le",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-riscv64",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-riscv64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-riscv64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-s390x",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-s390x.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.linux-s390x.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.windows-amd64.exe",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.windows-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.windows-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.windows-arm64.exe",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.windows-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/buildx-v0.16.1.windows-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.1/checksums.txt"
]
},
"v0.16.0": {
"id": 165067169,
"tag_name": "v0.16.0",
"html_url": "https://github.com/docker/buildx/releases/tag/v0.16.0",
"assets": [
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.darwin-amd64",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.darwin-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.darwin-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.darwin-arm64",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.darwin-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.darwin-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.linux-amd64",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.linux-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.linux-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.linux-arm-v6",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.linux-arm-v7",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.linux-arm64",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.linux-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.linux-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.linux-ppc64le",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.linux-riscv64",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.linux-riscv64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.linux-riscv64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.linux-s390x",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.linux-s390x.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.linux-s390x.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.windows-amd64.exe",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.windows-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.windows-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.windows-arm64.exe",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.windows-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/buildx-v0.16.0.windows-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0/checksums.txt"
]
},
"v0.16.0-rc2": {
"id": 164893757,
"tag_name": "v0.16.0-rc2",
"html_url": "https://github.com/docker/buildx/releases/tag/v0.16.0-rc2",
"assets": [
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.darwin-amd64",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.darwin-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.darwin-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.darwin-arm64",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.darwin-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.darwin-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.linux-amd64",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.linux-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.linux-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.linux-arm-v6",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.linux-arm-v7",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.linux-arm64",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.linux-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.linux-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.linux-ppc64le",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.linux-riscv64",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.linux-riscv64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.linux-riscv64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.linux-s390x",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.linux-s390x.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.linux-s390x.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.windows-amd64.exe",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.windows-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.windows-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.windows-arm64.exe",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.windows-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/buildx-v0.16.0-rc2.windows-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc2/checksums.txt"
]
},
"v0.16.0-rc1": {
"id": 163887606,
"tag_name": "v0.16.0-rc1",
"html_url": "https://github.com/docker/buildx/releases/tag/v0.16.0-rc1",
"assets": [
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.darwin-amd64",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.darwin-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.darwin-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.darwin-arm64",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.darwin-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.darwin-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.linux-amd64",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.linux-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.linux-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.linux-arm-v6",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.linux-arm-v7",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.linux-arm64",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.linux-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.linux-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.linux-ppc64le",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.linux-riscv64",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.linux-riscv64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.linux-riscv64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.linux-s390x",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.linux-s390x.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.linux-s390x.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.windows-amd64.exe",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.windows-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.windows-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.windows-arm64.exe",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.windows-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/buildx-v0.16.0-rc1.windows-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.16.0-rc1/checksums.txt"
]
},
"v0.15.1": {
"id": 161126938,
"tag_name": "v0.15.1",
"html_url": "https://github.com/docker/buildx/releases/tag/v0.15.1",
"assets": [
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.darwin-amd64",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.darwin-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.darwin-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.darwin-arm64",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.darwin-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.darwin-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.linux-amd64",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.linux-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.linux-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.linux-arm-v6",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.linux-arm-v7",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.linux-arm64",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.linux-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.linux-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.linux-ppc64le",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.linux-riscv64",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.linux-riscv64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.linux-riscv64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.linux-s390x",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.linux-s390x.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.linux-s390x.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.windows-amd64.exe",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.windows-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.windows-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.windows-arm64.exe",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.windows-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/buildx-v0.15.1.windows-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.1/checksums.txt"
]
},
"v0.15.0": {
"id": 159941316,
"tag_name": "v0.15.0",
"html_url": "https://github.com/docker/buildx/releases/tag/v0.15.0",
"assets": [
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.darwin-amd64",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.darwin-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.darwin-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.darwin-arm64",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.darwin-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.darwin-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.linux-amd64",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.linux-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.linux-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.linux-arm-v6",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.linux-arm-v7",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.linux-arm64",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.linux-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.linux-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.linux-ppc64le",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.linux-riscv64",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.linux-riscv64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.linux-riscv64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.linux-s390x",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.linux-s390x.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.linux-s390x.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.windows-amd64.exe",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.windows-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.windows-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.windows-arm64.exe",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.windows-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/buildx-v0.15.0.windows-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0/checksums.txt"
]
},
"v0.15.0-rc2": {
"id": 159285616,
"tag_name": "v0.15.0-rc2",
"html_url": "https://github.com/docker/buildx/releases/tag/v0.15.0-rc2",
"assets": [
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.darwin-amd64",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.darwin-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.darwin-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.darwin-arm64",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.darwin-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.darwin-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.linux-amd64",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.linux-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.linux-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.linux-arm-v6",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.linux-arm-v7",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.linux-arm64",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.linux-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.linux-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.linux-ppc64le",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.linux-riscv64",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.linux-riscv64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.linux-riscv64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.linux-s390x",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.linux-s390x.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.linux-s390x.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.windows-amd64.exe",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.windows-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.windows-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.windows-arm64.exe",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.windows-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/buildx-v0.15.0-rc2.windows-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc2/checksums.txt"
]
},
"v0.15.0-rc1": {
"id": 158684634,
"tag_name": "v0.15.0-rc1",
"html_url": "https://github.com/docker/buildx/releases/tag/v0.15.0-rc1",
"assets": [
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.darwin-amd64",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.darwin-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.darwin-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.darwin-arm64",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.darwin-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.darwin-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.linux-amd64",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.linux-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.linux-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.linux-arm-v6",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.linux-arm-v7",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.linux-arm64",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.linux-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.linux-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.linux-ppc64le",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.linux-riscv64",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.linux-riscv64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.linux-riscv64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.linux-s390x",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.linux-s390x.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.linux-s390x.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.windows-amd64.exe",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.windows-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.windows-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.windows-arm64.exe",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.windows-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/buildx-v0.15.0-rc1.windows-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.15.0-rc1/checksums.txt"
]
},
"v0.14.1": {
"id": 156924662,
"tag_name": "v0.14.1",
"html_url": "https://github.com/docker/buildx/releases/tag/v0.14.1",
"assets": [
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.darwin-amd64",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.darwin-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.darwin-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.darwin-arm64",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.darwin-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.darwin-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.linux-amd64",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.linux-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.linux-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.linux-arm-v6",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.linux-arm-v6.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.linux-arm-v6.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.linux-arm-v7",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.linux-arm-v7.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.linux-arm-v7.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.linux-arm64",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.linux-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.linux-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.linux-ppc64le",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.linux-ppc64le.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.linux-ppc64le.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.linux-riscv64",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.linux-riscv64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.linux-riscv64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.linux-s390x",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.linux-s390x.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.linux-s390x.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.windows-amd64.exe",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.windows-amd64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.windows-amd64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.windows-arm64.exe",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.windows-arm64.provenance.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/buildx-v0.14.1.windows-arm64.sbom.json",
"https://github.com/docker/buildx/releases/download/v0.14.1/checksums.txt"
]
},
"v0.14.0": {

View File

@@ -14,6 +14,10 @@ updates:
versioning-strategy: "increase"
allow:
- dependency-type: "production"
ignore:
- # we want to match the same version as the one used by @actions/artifact
# https://github.com/actions/toolkit/blob/ae38557bb0dba824cdda26ce787bd6b66cf07a83/packages/artifact/package.json#L46
dependency-name: "@azure/storage-blob"
labels:
- "dependencies"
- "bot"

View File

@@ -1,8 +1,86 @@
{
"latest": {
"id": 149919896,
"tag_name": "v26.1.0",
"html_url": "https://github.com/moby/moby/releases/tag/v26.1.0",
"id": 163311279,
"tag_name": "v27.0.3",
"html_url": "https://github.com/moby/moby/releases/tag/v27.0.3",
"assets": []
},
"v27.0.3": {
"id": 163311279,
"tag_name": "v27.0.3",
"html_url": "https://github.com/moby/moby/releases/tag/v27.0.3",
"assets": []
},
"v27.0.2": {
"id": 162600493,
"tag_name": "v27.0.2",
"html_url": "https://github.com/moby/moby/releases/tag/v27.0.2",
"assets": []
},
"v27.0.1": {
"id": 162009909,
"tag_name": "v27.0.1",
"html_url": "https://github.com/moby/moby/releases/tag/v27.0.1",
"assets": []
},
"v27.0.1-rc.1": {
"id": 161457618,
"tag_name": "v27.0.1-rc.1",
"html_url": "https://github.com/moby/moby/releases/tag/v27.0.1-rc.1",
"assets": []
},
"v23.0.13": {
"id": 161533551,
"tag_name": "v23.0.13",
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.13",
"assets": []
},
"v27.0.0-rc.2": {
"id": 160534078,
"tag_name": "v27.0.0-rc.2",
"html_url": "https://github.com/moby/moby/releases/tag/v27.0.0-rc.2",
"assets": []
},
"v27.0.0-rc.1": {
"id": 160112985,
"tag_name": "v27.0.0-rc.1",
"html_url": "https://github.com/moby/moby/releases/tag/v27.0.0-rc.1",
"assets": []
},
"v26.1.4": {
"id": 159031384,
"tag_name": "v26.1.4",
"html_url": "https://github.com/moby/moby/releases/tag/v26.1.4",
"assets": []
},
"v23.0.12": {
"id": 158038616,
"tag_name": "v23.0.12",
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.12",
"assets": []
},
"v26.1.3": {
"id": 155867714,
"tag_name": "v26.1.3",
"html_url": "https://github.com/moby/moby/releases/tag/v26.1.3",
"assets": []
},
"v26.1.2": {
"id": 154733361,
"tag_name": "v26.1.2",
"html_url": "https://github.com/moby/moby/releases/tag/v26.1.2",
"assets": []
},
"v23.0.11": {
"id": 154425437,
"tag_name": "v23.0.11",
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.11",
"assets": []
},
"v26.1.1": {
"id": 153294610,
"tag_name": "v26.1.1",
"html_url": "https://github.com/moby/moby/releases/tag/v26.1.1",
"assets": []
},
"v26.1.0": {

View File

@@ -21,6 +21,6 @@ jobs:
uses: actions/checkout@v4
-
name: Build
uses: docker/bake-action@v4
uses: docker/bake-action@v5
with:
targets: build

View File

@@ -12,8 +12,8 @@ on:
branches:
- 'main'
pull_request:
paths-ignore:
- '.github/*-releases.json'
paths:
- '.github/workflows/buildx-lab-releases-json.yml'
jobs:
generate:
@@ -45,7 +45,7 @@ jobs:
git add -A .
-
name: Create PR
uses: peter-evans/create-pull-request@6d6857d36972b65feb161a90e484f2984215f83e # v6.0.5
uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c # v6.1.0
with:
base: main
branch: bot/buildx-lab-releases-json

View File

@@ -12,8 +12,8 @@ on:
branches:
- 'main'
pull_request:
paths-ignore:
- '.github/*-releases.json'
paths:
- '.github/workflows/buildx-releases-json.yml'
jobs:
generate:
@@ -45,7 +45,7 @@ jobs:
git add -A .
-
name: Create PR
uses: peter-evans/create-pull-request@6d6857d36972b65feb161a90e484f2984215f83e # v6.0.5
uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c # v6.1.0
with:
base: main
branch: bot/buildx-releases-json

View File

@@ -21,6 +21,11 @@ jobs:
-
name: Checkout
uses: actions/checkout@v4
-
name: Enable corepack
run: |
corepack enable
yarn --version
-
name: Set up Node
uses: actions/setup-node@v4

View File

@@ -12,8 +12,8 @@ on:
branches:
- 'main'
pull_request:
paths-ignore:
- '.github/*-releases.json'
paths:
- '.github/workflows/docker-releases-json.yml'
jobs:
generate:
@@ -45,7 +45,7 @@ jobs:
git add -A .
-
name: Create PR
uses: peter-evans/create-pull-request@6d6857d36972b65feb161a90e484f2984215f83e # v6.0.5
uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c # v6.1.0
with:
base: main
branch: bot/docker-releases-json

View File

@@ -21,7 +21,7 @@ jobs:
uses: docker/setup-buildx-action@v3
-
name: Publish
uses: docker/bake-action@v4
uses: docker/bake-action@v5
with:
targets: publish
env:

View File

@@ -15,7 +15,8 @@ on:
env:
NODE_VERSION: "20"
BUILDX_VERSION: "v0.14.0"
BUILDX_VERSION: "v0.16.1"
BUILDKIT_IMAGE: "moby/buildkit:v0.15.0"
jobs:
test:
@@ -26,7 +27,7 @@ jobs:
uses: actions/checkout@v4
-
name: Test
uses: docker/bake-action@v4
uses: docker/bake-action@v5
with:
targets: test-coverage
env:
@@ -57,6 +58,11 @@ jobs:
-
name: Checkout
uses: actions/checkout@v4
-
name: Enable corepack
run: |
corepack enable
yarn --version
-
name: Setup Node
uses: actions/setup-node@v4
@@ -101,6 +107,18 @@ jobs:
-
name: Expose GitHub Runtime
uses: crazy-max/ghaction-github-runtime@v3
-
# FIXME: Needs to setup node twice on Windows due to a bug with runner
name: Setup Node
if: startsWith(matrix.os, 'windows')
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
-
name: Enable corepack
run: |
corepack enable
yarn --version
-
name: Setup Node
uses: actions/setup-node@v4
@@ -114,6 +132,15 @@ jobs:
with:
version: ${{ env.BUILDX_VERSION }}
driver: docker
-
name: Set up container builder
if: startsWith(matrix.os, 'ubuntu')
id: builder
uses: docker/setup-buildx-action@v3
with:
version: ${{ env.BUILDX_VERSION }}
driver-opts: image=${{ env.BUILDKIT_IMAGE }}
use: false
-
name: Install
run: yarn install
@@ -123,6 +150,8 @@ jobs:
yarn test:itg-coverage --runTestsByPath __tests__/${{ matrix.test }} --coverageDirectory=./coverage
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CTN_BUILDER_NAME: ${{ steps.builder.outputs.name }}
TEST_FOR_SUMMARY: ${{ secrets.TEST_FOR_SUMMARY }}
-
name: Check coverage
run: |

View File

@@ -42,6 +42,6 @@ jobs:
uses: actions/checkout@v4
-
name: Validate
uses: docker/bake-action@v4
uses: docker/bake-action@v5
with:
targets: ${{ matrix.target }}

View File

@@ -21,6 +21,7 @@ jobs:
matrix:
os:
- ubuntu-latest
- ubuntu-24.04
- ubuntu-22.04
- ubuntu-20.04
steps:
@@ -42,7 +43,7 @@ jobs:
-
name: Docker daemon conf
run: |
cat /etc/docker/daemon.json
cat /etc/docker/daemon.json || true
-
name: Docker info
run: docker info

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,8 @@
logFilters:
- code: YN0013
level: discard
- code: YN0019
level: discard
- code: YN0076
level: discard
@@ -11,5 +13,3 @@ npmAuthToken: "${NODE_AUTH_TOKEN:-fallback}"
plugins:
- path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
spec: "@yarnpkg/plugin-interactive-tools"
yarnPath: .yarn/releases/yarn-3.6.3.cjs

View File

@@ -22,7 +22,8 @@ export const context = {
repo: 'actions-toolkit'
},
ref: 'refs/heads/master',
runId: 123,
runId: 2188748038,
runNumber: 15,
payload: {
after: '860c1904a1ce19322e91ac35af1ab07466440c37',
base_ref: null,

View File

@@ -14,16 +14,12 @@
* limitations under the License.
*/
import {beforeEach, describe, expect, it, jest, test} from '@jest/globals';
import {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();
});
import {BuilderInfo} from '../../src/types/buildx/builder';
jest.spyOn(Builder.prototype, 'inspect').mockImplementation(async (): Promise<BuilderInfo> => {
return {

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
import {describe, expect, jest, test, beforeEach, afterEach} from '@jest/globals';
import {describe, expect, jest, test, afterEach} from '@jest/globals';
import * as fs from 'fs';
import * as path from 'path';
import * as rimraf from 'rimraf';
@@ -38,10 +38,6 @@ jest.spyOn(Context, 'tmpName').mockImplementation((): string => {
return tmpName;
});
beforeEach(() => {
jest.clearAllMocks();
});
afterEach(() => {
rimraf.sync(tmpDir);
});

View File

@@ -0,0 +1,344 @@
/**
* Copyright 2024 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 {Git} from '../../src/buildkit/git';
import {GitRef, GitURL} from '../../src/types/buildkit/git';
beforeEach(() => {
jest.restoreAllMocks();
});
describe('parseURL', () => {
// prettier-ignore
test.each([
[
'http://github.com/moby/buildkit',
{
scheme: 'http',
host: 'github.com',
path: '/moby/buildkit'
} as GitURL,
false
],
[
'https://github.com/moby/buildkit',
{
scheme: 'https',
host: 'github.com',
path: '/moby/buildkit'
} as GitURL,
false
],
[
'http://github.com/moby/buildkit#v1.0.0',
{
scheme: 'http',
host: 'github.com',
path: '/moby/buildkit',
fragment: {
ref: 'v1.0.0',
}
} as GitURL,
false
],
[
'http://github.com/moby/buildkit#v1.0.0:subdir',
{
scheme: 'http',
host: 'github.com',
path: '/moby/buildkit',
fragment: {
ref: 'v1.0.0',
subdir: 'subdir'
}
} as GitURL,
false
],
[
'http://foo:bar@github.com/moby/buildkit#v1.0.0',
{
scheme: 'http',
host: 'github.com',
path: '/moby/buildkit',
fragment: {
ref: 'v1.0.0',
},
user: {
username: 'foo',
password: 'bar',
passwordSet: true
}
} as GitURL,
false
],
[
'ssh://git@github.com/moby/buildkit.git',
{
scheme: 'ssh',
host: 'github.com',
path: '/moby/buildkit.git',
user: {
username: 'git',
password: '',
passwordSet: false
}
} as GitURL,
false
],
[
'ssh://git@github.com:22/moby/buildkit.git',
{
scheme: 'ssh',
host: 'github.com:22',
path: '/moby/buildkit.git',
user: {
username: 'git',
password: '',
passwordSet: false
}
} as GitURL,
false
],
// TODO: handle SCP-style URLs
// [
// 'git@github.com:moby/buildkit.git',
// {
// scheme: 'ssh',
// host: 'github.com:22',
// path: 'moby/buildkit.git',
// user: {
// username: 'git',
// password: '',
// passwordSet: false
// }
// } as GitURL,
// false
// ],
[
'ssh://root@subdomain.example.hostname:2222/root/my/really/weird/path/foo.git',
{
scheme: 'ssh',
host: 'subdomain.example.hostname:2222',
path: '/root/my/really/weird/path/foo.git',
user: {
username: 'root',
password: '',
passwordSet: false
}
} as GitURL,
false
],
[
'git://host.xz:1234/path/to/repo.git',
{
scheme: 'git',
host: 'host.xz:1234',
path: '/path/to/repo.git',
} as GitURL,
false
],
[
'ssh://someuser@192.168.0.123:456/~/repo-in-my-home-dir.git',
{
scheme: 'ssh',
host: '192.168.0.123:456',
path: '/~/repo-in-my-home-dir.git',
user: {
username: 'someuser',
password: '',
passwordSet: false
}
} as GitURL,
false
],
[
'httpx://github.com/moby/buildkit',
{} as GitURL,
true
],
[
'HTTP://github.com/moby/buildkit',
{
scheme: 'http',
host: 'github.com',
path: '/moby/buildkit'
} as GitURL,
false
],
])('given %p', async (ref: string, expected: GitURL, expectedErr: boolean) => {
try {
const got = Git.parseURL(ref);
expect(got.scheme).toEqual(expected.scheme);
expect(got.host).toEqual(expected.host);
expect(got.path).toEqual(expected.path);
expect(got.fragment).toEqual(expected.fragment);
expect(got.user?.username).toEqual(expected.user?.username);
expect(got.user?.password).toEqual(expected.user?.password);
expect(got.user?.passwordSet).toEqual(expected.user?.passwordSet);
} catch (err) {
if (!expectedErr) {
console.log(err);
}
// eslint-disable-next-line jest/no-conditional-expect
expect(expectedErr).toBeTruthy();
}
});
});
describe('parseRef', () => {
// prettier-ignore
test.each([
[
'https://example.com/',
undefined
],
[
'https://example.com/foo',
undefined
],
[
'https://example.com/foo.git',
{
remote: 'https://example.com/foo.git',
shortName: 'foo'
} as GitRef
],
[
'https://example.com/foo.git#deadbeef',
{
remote: 'https://example.com/foo.git',
shortName: 'foo',
commit: 'deadbeef'
} as GitRef
],
[
'https://example.com/foo.git#release/1.2',
{
remote: 'https://example.com/foo.git',
shortName: 'foo',
commit: 'release/1.2'
} as GitRef
],
[
'https://example.com/foo.git/',
undefined
],
[
'https://example.com/foo.git.bar',
undefined
],
[
'git://example.com/foo',
{
remote: 'git://example.com/foo',
shortName: 'foo',
unencryptedTCP: true
} as GitRef
],
[
'github.com/moby/buildkit',
{
remote: 'github.com/moby/buildkit',
shortName: 'buildkit',
indistinguishableFromLocal: true
} as GitRef
],
[
'custom.xyz/moby/buildkit.git',
undefined
],
[
'https://github.com/moby/buildkit',
undefined
],
[
'https://github.com/moby/buildkit.git',
{
remote: 'https://github.com/moby/buildkit.git',
shortName: 'buildkit',
} as GitRef
],
[
'https://foo:bar@github.com/moby/buildkit.git',
{
remote: 'https://foo:bar@github.com/moby/buildkit.git',
shortName: 'buildkit',
} as GitRef
],
// TODO handle SCP-style URLs
// [
// 'git@github.com:moby/buildkit',
// {
// remote: 'git@github.com:moby/buildkit',
// shortName: 'buildkit',
// } as GitRef
// ],
// [
// 'git@github.com:moby/buildkit.git',
// {
// remote: 'git@github.com:moby/buildkit',
// shortName: 'buildkit',
// } as GitRef
// ],
// [
// 'git@bitbucket.org:atlassianlabs/atlassian-docker.git',
// {
// remote: 'git@bitbucket.org:atlassianlabs/atlassian-docker.git',
// shortName: 'atlassian-docker',
// } as GitRef
// ],
[
'https://github.com/foo/bar.git#baz/qux:quux/quuz',
{
remote: 'https://github.com/foo/bar.git',
shortName: 'bar',
commit: 'baz/qux',
subDir: 'quux/quuz',
} as GitRef
],
[
'https://github.com/docker/docker.git#:myfolder',
{
remote: 'https://github.com/docker/docker.git',
shortName: 'docker',
subDir: 'myfolder',
commit: ''
} as GitRef
],
[
'./.git',
undefined
],
[
'.git',
undefined
],
])('given %p', async (ref: string, expected: GitRef | undefined) => {
try {
const got = Git.parseRef(ref);
expect(got).toEqual(expected);
} catch (err) {
if (expected) {
console.log(err);
}
// eslint-disable-next-line jest/no-conditional-expect
expect(expected).toBeUndefined();
}
});
});

View File

@@ -14,21 +14,17 @@
* limitations under the License.
*/
import {beforeEach, describe, expect, jest, test} from '@jest/globals';
import {describe, expect, 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';
import {BakeDefinition} from '../../src/types/buildx/bake';
const fixturesDir = path.join(__dirname, '..', 'fixtures');
const maybe = !process.env.GITHUB_ACTIONS || (process.env.GITHUB_ACTIONS === 'true' && process.env.ImageOS && process.env.ImageOS.startsWith('ubuntu')) ? describe : describe.skip;
beforeEach(() => {
jest.clearAllMocks();
});
maybe('getDefinition', () => {
// prettier-ignore
test.each([

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
import {afterEach, beforeEach, describe, expect, it, jest, test} from '@jest/globals';
import {afterEach, describe, expect, it, jest, test} from '@jest/globals';
import * as fs from 'fs';
import * as path from 'path';
import * as rimraf from 'rimraf';
@@ -23,13 +23,14 @@ import {Bake} from '../../src/buildx/bake';
import {Context} from '../../src/context';
import {ExecOptions} from '@actions/exec';
import {BakeDefinition, BakeMetadata} from '../../src/types/bake';
import {BakeDefinition} from '../../src/types/buildx/bake';
import {BuildMetadata} from '../../src/types/buildx/build';
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: BakeMetadata = {
const metadata: BuildMetadata = {
app: {
'buildx.build.ref': 'default/default/7frbdw1fmfozgtqavghowsepk'
},
@@ -49,29 +50,23 @@ jest.spyOn(Context, 'tmpName').mockImplementation((): string => {
return tmpName;
});
beforeEach(() => {
jest.clearAllMocks();
});
afterEach(() => {
rimraf.sync(tmpDir);
});
describe('resolveMetadata', () => {
it('matches', async () => {
const metadataFile = Bake.getMetadataFilePath();
await fs.writeFileSync(metadataFile, JSON.stringify(metadata));
const expected = Bake.resolveMetadata();
expect(expected).toEqual(metadata as BakeMetadata);
const bake = new Bake();
fs.writeFileSync(bake.getMetadataFilePath(), JSON.stringify(metadata));
expect(bake.resolveMetadata()).toEqual(metadata as BuildMetadata);
});
});
describe('resolveRefs', () => {
it('matches', async () => {
const metadataFile = Bake.getMetadataFilePath();
await fs.writeFileSync(metadataFile, JSON.stringify(metadata));
const expected = Bake.resolveRefs();
expect(expected).toEqual(['default/default/7frbdw1fmfozgtqavghowsepk', 'default/default/onic7g2axylf56rxetob7qruy']);
const bake = new Bake();
fs.writeFileSync(bake.getMetadataFilePath(), JSON.stringify(metadata));
expect(bake.resolveRefs()).toEqual(['default/default/7frbdw1fmfozgtqavghowsepk', 'default/default/onic7g2axylf56rxetob7qruy']);
});
});

View File

@@ -22,17 +22,11 @@ import * as rimraf from 'rimraf';
import {Context} from '../../src/context';
import {Build} from '../../src/buildx/build';
import {BuildMetadata} from '../../src/types/build';
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: BuildMetadata = {
'buildx.build.ref': 'default/default/n6ibcp9b2pw108rrz7ywdznvo',
'containerimage.config.digest': 'sha256:059b68a595b22564a1cbc167f369349fdc2ecc1f7bc092c2235cbf601a795fd',
'containerimage.digest': 'sha256:b09b9482c72371486bb2c1d2c2a2633ed1d0b8389e12c8d52b9e052725c0c83c'
};
const metadata = JSON.parse(fs.readFileSync(path.join(fixturesDir, 'metadata.json'), 'utf-8'));
jest.spyOn(Context, 'tmpDir').mockImplementation((): string => {
if (!fs.existsSync(tmpDir)) {
@@ -45,10 +39,6 @@ jest.spyOn(Context, 'tmpName').mockImplementation((): string => {
return tmpName;
});
beforeEach(() => {
jest.clearAllMocks();
});
afterEach(() => {
rimraf.sync(tmpDir);
});
@@ -56,37 +46,55 @@ afterEach(() => {
describe('resolveImageID', () => {
it('matches', async () => {
const imageID = 'sha256:bfb45ab72e46908183546477a08f8867fc40cebadd00af54b071b097aed127a9';
const imageIDFile = Build.getImageIDFilePath();
await fs.writeFileSync(imageIDFile, imageID);
const expected = Build.resolveImageID();
expect(expected).toEqual(imageID);
const build = new Build();
fs.writeFileSync(build.getImageIDFilePath(), imageID);
expect(build.resolveImageID()).toEqual(imageID);
});
});
describe('resolveMetadata', () => {
it('matches', async () => {
const metadataFile = Build.getMetadataFilePath();
await fs.writeFileSync(metadataFile, JSON.stringify(metadata));
const expected = Build.resolveMetadata();
expect(expected).toEqual(metadata);
const build = new Build();
fs.writeFileSync(build.getMetadataFilePath(), JSON.stringify(metadata));
expect(build.resolveMetadata()).toEqual(metadata);
});
});
describe('resolveRef', () => {
it('matches', async () => {
const metadataFile = Build.getMetadataFilePath();
await fs.writeFileSync(metadataFile, JSON.stringify(metadata));
const expected = Build.resolveRef();
expect(expected).toEqual('default/default/n6ibcp9b2pw108rrz7ywdznvo');
const build = new Build();
fs.writeFileSync(build.getMetadataFilePath(), JSON.stringify(metadata));
expect(build.resolveRef()).toEqual('default/default/n6ibcp9b2pw108rrz7ywdznvo');
});
});
describe('resolveProvenance', () => {
it('matches', async () => {
const build = new Build();
fs.writeFileSync(build.getMetadataFilePath(), JSON.stringify(metadata));
const provenance = build.resolveProvenance();
expect(provenance).toBeDefined();
expect(provenance?.buildType).toEqual('https://mobyproject.org/buildkit@v1');
expect(provenance?.materials).toBeDefined();
expect(provenance?.materials?.length).toEqual(2);
});
});
describe('resolveWarnings', () => {
it('matches', async () => {
const build = new Build();
fs.writeFileSync(build.getMetadataFilePath(), JSON.stringify(metadata));
const warnings = build.resolveWarnings();
expect(warnings).toBeDefined();
expect(warnings?.length).toEqual(3);
});
});
describe('resolveDigest', () => {
it('matches', async () => {
const metadataFile = Build.getMetadataFilePath();
await fs.writeFileSync(metadataFile, JSON.stringify(metadata));
const expected = Build.resolveDigest();
expect(expected).toEqual('sha256:b09b9482c72371486bb2c1d2c2a2633ed1d0b8389e12c8d52b9e052725c0c83c');
const build = new Build();
fs.writeFileSync(build.getMetadataFilePath(), JSON.stringify(metadata));
expect(build.resolveDigest()).toEqual('sha256:b09b9482c72371486bb2c1d2c2a2633ed1d0b8389e12c8d52b9e052725c0c83c');
});
});
@@ -104,7 +112,7 @@ describe('getProvenanceInput', () => {
test.each([
[
'true',
'builder-id=https://github.com/docker/actions-toolkit/actions/runs/123'
'builder-id=https://github.com/docker/actions-toolkit/actions/runs/2188748038/attempts/2'
],
[
'false',
@@ -112,11 +120,11 @@ describe('getProvenanceInput', () => {
],
[
'mode=min',
'mode=min,builder-id=https://github.com/docker/actions-toolkit/actions/runs/123'
'mode=min,builder-id=https://github.com/docker/actions-toolkit/actions/runs/2188748038/attempts/2'
],
[
'mode=max',
'mode=max,builder-id=https://github.com/docker/actions-toolkit/actions/runs/123'
'mode=max,builder-id=https://github.com/docker/actions-toolkit/actions/runs/2188748038/attempts/2'
],
[
'builder-id=foo',
@@ -131,7 +139,7 @@ describe('getProvenanceInput', () => {
''
],
])('given input %p', async (input: string, expected: string) => {
await setInput('provenance', input);
setInput('provenance', input);
expect(Build.getProvenanceInput('provenance')).toEqual(expected);
});
});
@@ -141,11 +149,11 @@ describe('resolveProvenanceAttrs', () => {
test.each([
[
'mode=min',
'mode=min,builder-id=https://github.com/docker/actions-toolkit/actions/runs/123'
'mode=min,builder-id=https://github.com/docker/actions-toolkit/actions/runs/2188748038/attempts/2'
],
[
'mode=max',
'mode=max,builder-id=https://github.com/docker/actions-toolkit/actions/runs/123'
'mode=max,builder-id=https://github.com/docker/actions-toolkit/actions/runs/2188748038/attempts/2'
],
[
'builder-id=foo',
@@ -157,7 +165,7 @@ describe('resolveProvenanceAttrs', () => {
],
[
'',
'builder-id=https://github.com/docker/actions-toolkit/actions/runs/123'
'builder-id=https://github.com/docker/actions-toolkit/actions/runs/2188748038/attempts/2'
],
])('given %p', async (input: string, expected: string) => {
expect(Build.resolveProvenanceAttrs(input)).toEqual(expected);
@@ -206,6 +214,54 @@ describe('resolveSecret', () => {
});
});
describe('resolveCacheToAttrs', () => {
// prettier-ignore
test.each([
[
'',
undefined,
''
],
[
'user/app:cache',
undefined,
'user/app:cache'
],
[
'type=inline',
undefined,
'type=inline'
],
[
'type=gha',
undefined,
'type=gha,repository=docker/actions-toolkit',
],
[
'type=gha,mode=max',
undefined,
'type=gha,mode=max,repository=docker/actions-toolkit',
],
[
'type=gha,mode=max',
'abcd1234',
'type=gha,mode=max,repository=docker/actions-toolkit,ghtoken=abcd1234',
],
[
'type=gha,repository=foo/bar,mode=max',
undefined,
'type=gha,repository=foo/bar,mode=max',
],
[
'type=gha,repository=foo/bar,mode=max',
'abcd1234',
'type=gha,repository=foo/bar,mode=max,ghtoken=abcd1234',
],
])('given %p', async (input: string, githubToken: string | undefined, expected: string) => {
expect(Build.resolveCacheToAttrs(input, githubToken)).toEqual(expected);
});
});
describe('hasLocalExporter', () => {
// prettier-ignore
test.each([

View File

@@ -14,21 +14,17 @@
* limitations under the License.
*/
import {beforeEach, describe, expect, it, jest, test} from '@jest/globals';
import {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';
import {BuilderInfo} from '../../src/types/buildx/builder';
const fixturesDir = path.join(__dirname, '..', 'fixtures');
beforeEach(() => {
jest.clearAllMocks();
});
jest.spyOn(Builder.prototype, 'inspect').mockImplementation(async (): Promise<BuilderInfo> => {
return {
name: 'builder2',

View File

@@ -24,7 +24,7 @@ import {Buildx} from '../../src/buildx/buildx';
import {Context} from '../../src/context';
import {Exec} from '../../src/exec';
import {Cert} from '../../src/types/buildx';
import {Cert, LocalState} from '../../src/types/buildx/buildx';
const fixturesDir = path.join(__dirname, '..', 'fixtures');
// prettier-ignore
@@ -42,10 +42,6 @@ jest.spyOn(Context, 'tmpName').mockImplementation((): string => {
return tmpName;
});
beforeEach(() => {
jest.clearAllMocks();
});
afterEach(() => {
rimraf.sync(tmpDir);
});
@@ -254,19 +250,77 @@ describe('resolveCertsDriverOpts', () => {
});
});
describe('localState', () => {
// prettier-ignore
test.each([
[
'default/default/ij71n3ubmhck85d03zdvye5nr',
{
LocalPath: '/home/crazymax/github/docker_org/buildx',
DockerfilePath: '/home/crazymax/github/docker_org/buildx/Dockerfile'
} as LocalState,
],
[
'default/default/7pnnqpgacnqq98oa1a1h5sz6t',
{
LocalPath: 'https://github.com/docker/actions-toolkit.git#:__tests__/fixtures',
DockerfilePath: 'hello.Dockerfile'
} as LocalState,
],
[
'default/default/84p2qpgacnqq98oa1a1h5sz6t',
{
LocalPath: 'https://github.com/docker/actions-toolkit.git#:__tests__/fixtures',
DockerfilePath: '-'
} as LocalState,
],
[
'default/default/a5s9rlg9cnqq98oa1a1h5sz6t',
{
LocalPath: '-',
DockerfilePath: ''
} as LocalState,
],
[
'default/default/aav2ix4nw5eky66fw045dkylr',
{
LocalPath: 'https://github.com/docker/buildx.git',
DockerfilePath: ''
} as LocalState,
],
[
'default/default/dfsz8r57a98zf789pmlyzqp3n',
{
LocalPath: 'https://github.com/docker/actions-toolkit.git#:__tests__/fixtures',
DockerfilePath: 'hello.Dockerfile'
} as LocalState,
],
[
'default/default/w38vcd5fo5cfvfyig77qjec0v',
{
LocalPath: '/home/crazy/hello',
DockerfilePath: '-'
} as LocalState,
]
])('given %p', async (ref: string, expected: LocalState) => {
const localState = Buildx.localState(ref, path.join(fixturesDir, 'buildx-refs'));
expect(localState).toEqual(expected);
});
});
describe('refs', () => {
it('returns all refs', async () => {
const refs = Buildx.refs({
dir: path.join(fixturesDir, 'buildx-refs')
});
expect(Object.keys(refs).length).toEqual(11);
expect(Object.keys(refs).length).toEqual(17);
});
it('returns default builder refs', async () => {
const refs = Buildx.refs({
dir: path.join(fixturesDir, 'buildx-refs'),
builderName: 'default'
});
expect(Object.keys(refs).length).toEqual(8);
expect(Object.keys(refs).length).toEqual(14);
});
it('returns foo builder refs', async () => {
const refs = Buildx.refs({
@@ -285,6 +339,6 @@ describe('refs', () => {
builderName: 'default',
since: new Date('2024-01-10T00:00:00Z')
});
expect(Object.keys(refs).length).toEqual(5);
expect(Object.keys(refs).length).toEqual(11);
});
});

View File

@@ -0,0 +1,198 @@
/**
* Copyright 2024 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, test} from '@jest/globals';
import * as fs from 'fs';
import * as path from 'path';
import {Buildx} from '../../src/buildx/buildx';
import {Bake} from '../../src/buildx/bake';
import {Build} from '../../src/buildx/build';
import {History} from '../../src/buildx/history';
import {Exec} from '../../src/exec';
const fixturesDir = path.join(__dirname, '..', 'fixtures');
// prettier-ignore
const tmpDir = path.join(process.env.TEMP || '/tmp', 'buildx-history-jest');
const maybe = !process.env.GITHUB_ACTIONS || (process.env.GITHUB_ACTIONS === 'true' && process.env.ImageOS && process.env.ImageOS.startsWith('ubuntu')) ? describe : describe.skip;
maybe('exportBuild', () => {
// prettier-ignore
test.each([
[
'single',
[
'build',
'-f', path.join(fixturesDir, 'hello.Dockerfile'),
fixturesDir
],
],
[
'multi-platform',
[
'build',
'-f', path.join(fixturesDir, 'hello.Dockerfile'),
'--platform', 'linux/amd64,linux/arm64',
fixturesDir
],
]
])('export build %p', async (_, bargs) => {
const buildx = new Buildx();
const build = new Build({buildx: buildx});
fs.mkdirSync(tmpDir, {recursive: true});
await expect(
(async () => {
// prettier-ignore
const buildCmd = await buildx.getCommand([
'--builder', process.env.CTN_BUILDER_NAME ?? 'default',
...bargs,
'--metadata-file', build.getMetadataFilePath()
]);
await Exec.exec(buildCmd.command, buildCmd.args);
})()
).resolves.not.toThrow();
const metadata = build.resolveMetadata();
expect(metadata).toBeDefined();
const buildRef = build.resolveRef(metadata);
expect(buildRef).toBeDefined();
const history = new History({buildx: buildx});
const exportRes = await history.export({
refs: [buildRef ?? '']
});
expect(exportRes).toBeDefined();
expect(exportRes?.dockerbuildFilename).toBeDefined();
expect(exportRes?.dockerbuildSize).toBeDefined();
expect(fs.existsSync(exportRes?.dockerbuildFilename)).toBe(true);
expect(exportRes?.summaries).toBeDefined();
});
// prettier-ignore
test.each([
[
'single',
[
'bake',
'-f', path.join(fixturesDir, 'hello-bake.hcl'),
'hello'
],
],
[
'group',
[
'bake',
'-f', path.join(fixturesDir, 'hello-bake.hcl'),
'hello-all'
],
],
[
'matrix',
[
'bake',
'-f', path.join(fixturesDir, 'hello-bake.hcl'),
'hello-matrix'
],
]
])('export bake build %p', async (_, bargs) => {
const buildx = new Buildx();
const bake = new Bake({buildx: buildx});
fs.mkdirSync(tmpDir, {recursive: true});
await expect(
(async () => {
// prettier-ignore
const buildCmd = await buildx.getCommand([
'--builder', process.env.CTN_BUILDER_NAME ?? 'default',
...bargs,
'--metadata-file', bake.getMetadataFilePath()
]);
await Exec.exec(buildCmd.command, buildCmd.args, {
cwd: fixturesDir
});
})()
).resolves.not.toThrow();
const metadata = bake.resolveMetadata();
expect(metadata).toBeDefined();
const buildRefs = bake.resolveRefs(metadata);
expect(buildRefs).toBeDefined();
const history = new History({buildx: buildx});
const exportRes = await history.export({
refs: buildRefs ?? []
});
expect(exportRes).toBeDefined();
expect(exportRes?.dockerbuildFilename).toBeDefined();
expect(exportRes?.dockerbuildSize).toBeDefined();
expect(fs.existsSync(exportRes?.dockerbuildFilename)).toBe(true);
expect(exportRes?.summaries).toBeDefined();
});
});
maybe('exportBuild custom image', () => {
const originalEnv = process.env;
beforeEach(() => {
jest.resetModules();
process.env = {
...originalEnv,
DOCKER_BUILD_EXPORT_BUILD_IMAGE: 'docker.io/dockereng/export-build:0.2.2'
};
});
afterEach(() => {
process.env = originalEnv;
});
it('with custom image', async () => {
const buildx = new Buildx();
const build = new Build({buildx: buildx});
fs.mkdirSync(tmpDir, {recursive: true});
await expect(
(async () => {
// prettier-ignore
const buildCmd = await buildx.getCommand([
'--builder', process.env.CTN_BUILDER_NAME ?? 'default',
'build', '-f', path.join(fixturesDir, 'hello.Dockerfile'),
'--metadata-file', build.getMetadataFilePath(),
fixturesDir
]);
await Exec.exec(buildCmd.command, buildCmd.args);
})()
).resolves.not.toThrow();
const metadata = build.resolveMetadata();
expect(metadata).toBeDefined();
const buildRef = build.resolveRef(metadata);
expect(buildRef).toBeDefined();
const history = new History({buildx: buildx});
const exportRes = await history.export({
refs: [buildRef ?? '']
});
expect(exportRes).toBeDefined();
expect(exportRes?.dockerbuildFilename).toBeDefined();
expect(exportRes?.dockerbuildSize).toBeDefined();
expect(fs.existsSync(exportRes?.dockerbuildFilename)).toBe(true);
expect(exportRes?.summaries).toBeDefined();
});
});

View File

@@ -14,7 +14,7 @@
* limitations under the License.
*/
import {describe, expect, it, jest, test, beforeEach, afterEach} from '@jest/globals';
import {describe, expect, it, jest, test, afterEach} from '@jest/globals';
import * as fs from 'fs';
import * as path from 'path';
import * as rimraf from 'rimraf';
@@ -25,10 +25,6 @@ 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);
});

View File

@@ -17,7 +17,7 @@
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 {describe, expect, jest, it, afterEach} from '@jest/globals';
import {Context} from '../src/context';
@@ -36,10 +36,6 @@ jest.spyOn(Context, 'tmpName').mockImplementation((): string => {
return tmpName;
});
beforeEach(() => {
jest.clearAllMocks();
});
afterEach(() => {
rimraf.sync(tmpDir);
});

View File

@@ -14,12 +14,18 @@
* limitations under the License.
*/
import {describe, expect, test} from '@jest/globals';
import {describe, expect, it, test} from '@jest/globals';
import {Docker} from '../../src/docker/docker';
const maybe = !process.env.GITHUB_ACTIONS || (process.env.GITHUB_ACTIONS === 'true' && process.env.ImageOS && process.env.ImageOS.startsWith('ubuntu')) ? describe : describe.skip;
maybe('isDaemonRunning', () => {
it('checks if daemon is running', async () => {
expect(await Docker.isDaemonRunning()).toBe(true);
});
});
maybe('pull', () => {
// prettier-ignore
test.each([
@@ -54,3 +60,14 @@ maybe('pull', () => {
}
}, 600000);
});
maybe('contextInspect', () => {
it('inspect default context', async () => {
const contextInfo = await Docker.contextInspect();
expect(contextInfo).toBeDefined();
console.log('contextInfo', contextInfo);
expect(contextInfo?.Name).toBeDefined();
expect(contextInfo?.Endpoints).toBeDefined();
expect(Object.keys(contextInfo?.Endpoints).length).toBeGreaterThan(0);
});
});

View File

@@ -22,19 +22,14 @@ 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';
import {ConfigFile} from '../../src/types/docker/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);
});
@@ -109,35 +104,132 @@ describe('isAvailable', () => {
});
});
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}}'], {
describe('exec', () => {
it('returns docker version', async () => {
const execSpy = jest.spyOn(Docker, 'exec');
await Docker.exec(['version'], {
ignoreReturnCode: true,
silent: true
});
expect(execSpy).toHaveBeenCalledTimes(1);
const callfunc = execSpy.mock.calls[0];
expect(Object.keys(callfunc[1]?.env || {}).length).toBeGreaterThan(0);
const env = callfunc[1]?.env;
expect(env).toHaveProperty('DOCKER_CONTENT_TRUST');
expect(env?.DOCKER_CONTENT_TRUST).toBe('false');
if (callfunc[1]?.env) {
// already checked env
callfunc[1].env = undefined;
}
expect(callfunc).toEqual([
['version'],
{
ignoreReturnCode: true,
silent: true
}
]);
});
});
describe('getExecOutput', () => {
it('returns docker version', async () => {
const execSpy = jest.spyOn(Docker, 'getExecOutput');
await Docker.getExecOutput(['version'], {
ignoreReturnCode: true,
silent: true
});
expect(execSpy).toHaveBeenCalledTimes(1);
const callfunc = execSpy.mock.calls[0];
expect(Object.keys(callfunc[1]?.env || {}).length).toBeGreaterThan(0);
const env = callfunc[1]?.env;
expect(env).toHaveProperty('DOCKER_CONTENT_TRUST');
expect(env?.DOCKER_CONTENT_TRUST).toBe('false');
if (callfunc[1]?.env) {
// already checked env
callfunc[1].env = undefined;
}
expect(callfunc).toEqual([
['version'],
{
ignoreReturnCode: true,
silent: true
}
]);
});
});
describe('context', () => {
it('call docker context show', async () => {
const execSpy = jest.spyOn(Docker, 'getExecOutput');
await Docker.context().catch(() => {
// noop
});
expect(execSpy).toHaveBeenCalledTimes(1);
const callfunc = execSpy.mock.calls[0];
if (callfunc && callfunc[1]) {
// we don't want to check env opt
callfunc[1].env = undefined;
}
expect(callfunc).toEqual([
['context', 'inspect', '--format', '{{.Name}}'],
{
ignoreReturnCode: true,
silent: true
}
]);
});
});
describe('contextInspect', () => {
it('call docker context inspect', async () => {
const execSpy = jest.spyOn(Docker, 'getExecOutput');
await Docker.contextInspect('foo').catch(() => {
// noop
});
expect(execSpy).toHaveBeenCalledTimes(1);
const callfunc = execSpy.mock.calls[0];
if (callfunc && callfunc[1]) {
// we don't want to check env opt
callfunc[1].env = undefined;
}
expect(callfunc).toEqual([
['context', 'inspect', '--format=json', 'foo'],
{
ignoreReturnCode: true,
silent: true
}
]);
});
});
describe('printVersion', () => {
it('call docker version', async () => {
const execSpy = jest.spyOn(Exec, 'exec');
const execSpy = jest.spyOn(Docker, 'exec');
await Docker.printVersion().catch(() => {
// noop
});
expect(execSpy).toHaveBeenCalledWith(`docker`, ['version']);
expect(execSpy).toHaveBeenCalledTimes(1);
const callfunc = execSpy.mock.calls[0];
if (callfunc && callfunc[1]) {
// we don't want to check env opt
callfunc[1].env = undefined;
}
expect(callfunc).toEqual([['version']]);
});
});
describe('printInfo', () => {
it('call docker info', async () => {
const execSpy = jest.spyOn(Exec, 'exec');
const execSpy = jest.spyOn(Docker, 'exec');
await Docker.printInfo().catch(() => {
// noop
});
expect(execSpy).toHaveBeenCalledWith(`docker`, ['info']);
expect(execSpy).toHaveBeenCalledTimes(1);
const callfunc = execSpy.mock.calls[0];
if (callfunc && callfunc[1]) {
// we don't want to check env opt
callfunc[1].env = undefined;
}
expect(callfunc).toEqual([['info']]);
});
});

View File

@@ -19,6 +19,7 @@ import {jest, describe, expect, test, beforeEach, afterEach} from '@jest/globals
import {Install} from '../../src/docker/install';
import {Docker} from '../../src/docker/docker';
import {Exec} from '../../src/exec';
// prettier-ignore
const tmpDir = path.join(process.env.TEMP || '/tmp', 'docker-install-jest');
@@ -38,8 +39,19 @@ aarch64:https://cloud.debian.org/images/cloud/bookworm/20231013-1532/debian-12-g
process.env = originalEnv;
});
// prettier-ignore
test.each(['v24.0.4'])(
test.each(['v26.1.4'])(
'install docker %s', async (version) => {
if (process.env.ImageOS && process.env.ImageOS.startsWith('ubuntu')) {
// Remove containerd first on ubuntu runners to make sure it takes
// ones packaged with docker
await Exec.exec('sudo', ['apt-get', 'remove', '-y', 'containerd.io'], {
env: Object.assign({}, process.env, {
DEBIAN_FRONTEND: 'noninteractive'
}) as {
[key: string]: string;
}
});
}
await expect((async () => {
const install = new Install({
version: version,

View File

@@ -25,10 +25,6 @@ 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);
});

View File

@@ -14,17 +14,13 @@
* limitations under the License.
*/
import {describe, expect, jest, it, beforeEach} from '@jest/globals';
import {describe, expect, jest, it} 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';

View File

@@ -14,14 +14,10 @@
* limitations under the License.
*/
import {beforeEach, describe, expect, it, jest} from '@jest/globals';
import {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');

View File

@@ -0,0 +1 @@
{"LocalPath":"/home/crazy/foo/bar/https:/github.com/docker/actions-toolkit.git#:__tests__/fixtures","DockerfilePath":"/home/crazy/foo/bar/hello.Dockerfile"}

View File

@@ -0,0 +1 @@
{"LocalPath":"/home/crazy/foo/bar/https:/github.com/docker/actions-toolkit.git#:__tests__/fixtures","DockerfilePath":"/home/crazy/foo/bar/-"}

View File

@@ -0,0 +1 @@
{"LocalPath":"/home/crazy/foo/bar/-","DockerfilePath":""}

View File

@@ -0,0 +1 @@
{"LocalPath":"/home/crazy/foo/bar/https:/github.com/docker/buildx.git","DockerfilePath":""}

View File

@@ -0,0 +1 @@
{"LocalPath":"https://github.com/docker/actions-toolkit.git#:__tests__/fixtures","DockerfilePath":"hello.Dockerfile"}

View File

@@ -0,0 +1 @@
{"LocalPath":"/home/crazy/hello","DockerfilePath":"/home/crazy/hello/-"}

View File

@@ -0,0 +1,39 @@
// Copyright 2024 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.
target "hello" {
dockerfile = "hello.Dockerfile"
}
target "hello-bar" {
dockerfile = "hello.Dockerfile"
args = {
NAME = "bar"
}
}
group "hello-all" {
targets = ["hello", "hello-bar"]
}
target "hello-matrix" {
name = "matrix-${name}"
matrix = {
name = ["bar", "baz", "boo", "far", "faz", "foo", "aaa", "bbb", "ccc", "ddd", "eee", "fff", "ggg", "hhh", "iii", "jjj"]
}
dockerfile = "hello.Dockerfile"
args = {
NAME = name
}
}

View File

@@ -0,0 +1,19 @@
# syntax=docker/dockerfile:1
# Copyright 2024 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.
FROM busybox:latest
ARGGG NAME=foo
RUN echo "hello $NAME"

View File

@@ -0,0 +1,23 @@
# syntax=docker/dockerfile:1
# Copyright 2024 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.
FROM busybox AS build
ARG NAME=foo
ARG TARGETPLATFORM
RUN echo "Hello $NAME from $TARGETPLATFORM" > foo
FROM scratch
COPY --from=build /foo /

View File

@@ -0,0 +1,28 @@
# syntax=docker/dockerfile-upstream:master
# Copyright 2024 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.
frOM busybox as base
cOpy lint.Dockerfile .
from scratch
MAINTAINER moby@example.com
COPy --from=base \
/lint.Dockerfile \
/
CMD [ "echo", "Hello, Norway!" ]
CMD [ "echo", "Hello, Sweden!" ]
ENTRYPOINT my-program start

View File

@@ -0,0 +1,228 @@
{
"buildx.build.provenance": {
"buildType": "https://mobyproject.org/buildkit@v1",
"materials": [
{
"uri": "pkg:docker/docker/dockerfile-upstream@master",
"digest": {
"sha256": "70433342168dafa34d11bd7236c3c3fcf448b90539733281711050808f32e835"
}
},
{
"uri": "pkg:docker/busybox@latest?platform=linux%2Famd64",
"digest": {
"sha256": "9ae97d36d26566ff84e8893c64a6dc4fe8ca6d1144bf5b87b2b85a32def253c7"
}
}
],
"invocation": {
"configSource": {
"entryPoint": "Dockerfile"
},
"parameters": {
"frontend": "gateway.v0",
"args": {
"cmdline": "docker/dockerfile-upstream:master",
"source": "docker/dockerfile-upstream:master"
},
"locals": [
{
"name": "context"
},
{
"name": "dockerfile"
}
]
},
"environment": {
"platform": "linux/amd64"
}
}
},
"buildx.build.ref": "default/default/n6ibcp9b2pw108rrz7ywdznvo",
"buildx.build.warnings": [
{
"vertex": "sha256:7b477ac5dd3a4c4d2523f7f7f20406b626395de082f44fd5ff996323ec8257d0",
"level": 1,
"short": "Q29uc2lzdGVudEluc3RydWN0aW9uQ2FzaW5nOiBDb21tYW5kICdmck9NJyBzaG91bGQgYmUgY29uc2lzdGVudGx5IGNhc2VkIChsaW5lIDIp",
"detail": [
"SW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBpbiBjb25zaXN0ZW50IGNhc2luZyAoYWxsIGxvd2VyIG9yIGFsbCB1cHBlcik="
],
"url": "https://docs.docker.com/go/dockerfile/rule/consistent-instruction-casing/",
"sourceInfo": {
"filename": "Dockerfile",
"data": "IyBzeW50YXg9ZG9ja2VyL2RvY2tlcmZpbGUtdXBzdHJlYW06bWFzdGVyCmZyT00gYnVzeWJveCBhcyBiYXNlCmNPcHkgRG9ja2VyZmlsZSAuCgpmcm9tIHNjcmF0Y2gKQ09QeSAtLWZyb209YmFzZSBcCiAgL0RvY2tlcmZpbGUgXAogIC8K",
"definition": {
"def": [
"GsUBChJsb2NhbDovL2RvY2tlcmZpbGUSFAoMbG9jYWwuZGlmZmVyEgRub25lEkoKEWxvY2FsLmZvbGxvd3BhdGhzEjVbIkRvY2tlcmZpbGUiLCJEb2NrZXJmaWxlLmRvY2tlcmlnbm9yZSIsImRvY2tlcmZpbGUiXRIqCg1sb2NhbC5zZXNzaW9uEhkwN3A3MzJ6aGR4NXV1NnVsZDNzOGpteWo2EiEKE2xvY2FsLnNoYXJlZGtleWhpbnQSCmRvY2tlcmZpbGVaAA==",
"CkkKR3NoYTI1Njo3YjQ3N2FjNWRkM2E0YzRkMjUyM2Y3ZjdmMjA0MDZiNjI2Mzk1ZGUwODJmNDRmZDVmZjk5NjMyM2VjODI1N2Qw"
],
"metadata": {
"sha256:7b477ac5dd3a4c4d2523f7f7f20406b626395de082f44fd5ff996323ec8257d0": {
"description": {
"llb.customname": "[internal] load build definition from Dockerfile"
},
"caps": {
"source.local": true,
"source.local.followpaths": true,
"source.local.sessionid": true,
"source.local.sharedkeyhint": true
}
},
"sha256:a06279dbe062a3b181c9b918abfaf37ca8106f1f9745b9d42356b3195b205cd1": {
"caps": {
"constraints": true,
"meta.description": true,
"platform": true
}
}
},
"Source": {
"locations": {
"sha256:7b477ac5dd3a4c4d2523f7f7f20406b626395de082f44fd5ff996323ec8257d0": {}
}
}
},
"language": "Dockerfile"
},
"range": [
{
"start": {
"line": 2
},
"end": {
"line": 2
}
}
]
},
{
"vertex": "sha256:7b477ac5dd3a4c4d2523f7f7f20406b626395de082f44fd5ff996323ec8257d0",
"level": 1,
"short": "Q29uc2lzdGVudEluc3RydWN0aW9uQ2FzaW5nOiBDb21tYW5kICdjT3B5JyBzaG91bGQgYmUgY29uc2lzdGVudGx5IGNhc2VkIChsaW5lIDMp",
"detail": [
"SW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBpbiBjb25zaXN0ZW50IGNhc2luZyAoYWxsIGxvd2VyIG9yIGFsbCB1cHBlcik="
],
"url": "https://docs.docker.com/go/dockerfile/rule/consistent-instruction-casing/",
"sourceInfo": {
"filename": "Dockerfile",
"data": "IyBzeW50YXg9ZG9ja2VyL2RvY2tlcmZpbGUtdXBzdHJlYW06bWFzdGVyCmZyT00gYnVzeWJveCBhcyBiYXNlCmNPcHkgRG9ja2VyZmlsZSAuCgpmcm9tIHNjcmF0Y2gKQ09QeSAtLWZyb209YmFzZSBcCiAgL0RvY2tlcmZpbGUgXAogIC8K",
"definition": {
"def": [
"GsUBChJsb2NhbDovL2RvY2tlcmZpbGUSFAoMbG9jYWwuZGlmZmVyEgRub25lEkoKEWxvY2FsLmZvbGxvd3BhdGhzEjVbIkRvY2tlcmZpbGUiLCJEb2NrZXJmaWxlLmRvY2tlcmlnbm9yZSIsImRvY2tlcmZpbGUiXRIqCg1sb2NhbC5zZXNzaW9uEhkwN3A3MzJ6aGR4NXV1NnVsZDNzOGpteWo2EiEKE2xvY2FsLnNoYXJlZGtleWhpbnQSCmRvY2tlcmZpbGVaAA==",
"CkkKR3NoYTI1Njo3YjQ3N2FjNWRkM2E0YzRkMjUyM2Y3ZjdmMjA0MDZiNjI2Mzk1ZGUwODJmNDRmZDVmZjk5NjMyM2VjODI1N2Qw"
],
"metadata": {
"sha256:7b477ac5dd3a4c4d2523f7f7f20406b626395de082f44fd5ff996323ec8257d0": {
"description": {
"llb.customname": "[internal] load build definition from Dockerfile"
},
"caps": {
"source.local": true,
"source.local.followpaths": true,
"source.local.sessionid": true,
"source.local.sharedkeyhint": true
}
},
"sha256:a06279dbe062a3b181c9b918abfaf37ca8106f1f9745b9d42356b3195b205cd1": {
"caps": {
"constraints": true,
"meta.description": true,
"platform": true
}
}
},
"Source": {
"locations": {
"sha256:7b477ac5dd3a4c4d2523f7f7f20406b626395de082f44fd5ff996323ec8257d0": {}
}
}
},
"language": "Dockerfile"
},
"range": [
{
"start": {
"line": 3
},
"end": {
"line": 3
}
}
]
},
{
"vertex": "sha256:7b477ac5dd3a4c4d2523f7f7f20406b626395de082f44fd5ff996323ec8257d0",
"level": 1,
"short": "Q29uc2lzdGVudEluc3RydWN0aW9uQ2FzaW5nOiBDb21tYW5kICdDT1B5JyBzaG91bGQgYmUgY29uc2lzdGVudGx5IGNhc2VkIChsaW5lIDYp",
"detail": [
"SW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBpbiBjb25zaXN0ZW50IGNhc2luZyAoYWxsIGxvd2VyIG9yIGFsbCB1cHBlcik="
],
"url": "https://docs.docker.com/go/dockerfile/rule/consistent-instruction-casing/",
"sourceInfo": {
"filename": "Dockerfile",
"data": "IyBzeW50YXg9ZG9ja2VyL2RvY2tlcmZpbGUtdXBzdHJlYW06bWFzdGVyCmZyT00gYnVzeWJveCBhcyBiYXNlCmNPcHkgRG9ja2VyZmlsZSAuCgpmcm9tIHNjcmF0Y2gKQ09QeSAtLWZyb209YmFzZSBcCiAgL0RvY2tlcmZpbGUgXAogIC8K",
"definition": {
"def": [
"GsUBChJsb2NhbDovL2RvY2tlcmZpbGUSFAoMbG9jYWwuZGlmZmVyEgRub25lEkoKEWxvY2FsLmZvbGxvd3BhdGhzEjVbIkRvY2tlcmZpbGUiLCJEb2NrZXJmaWxlLmRvY2tlcmlnbm9yZSIsImRvY2tlcmZpbGUiXRIqCg1sb2NhbC5zZXNzaW9uEhkwN3A3MzJ6aGR4NXV1NnVsZDNzOGpteWo2EiEKE2xvY2FsLnNoYXJlZGtleWhpbnQSCmRvY2tlcmZpbGVaAA==",
"CkkKR3NoYTI1Njo3YjQ3N2FjNWRkM2E0YzRkMjUyM2Y3ZjdmMjA0MDZiNjI2Mzk1ZGUwODJmNDRmZDVmZjk5NjMyM2VjODI1N2Qw"
],
"metadata": {
"sha256:7b477ac5dd3a4c4d2523f7f7f20406b626395de082f44fd5ff996323ec8257d0": {
"description": {
"llb.customname": "[internal] load build definition from Dockerfile"
},
"caps": {
"source.local": true,
"source.local.followpaths": true,
"source.local.sessionid": true,
"source.local.sharedkeyhint": true
}
},
"sha256:a06279dbe062a3b181c9b918abfaf37ca8106f1f9745b9d42356b3195b205cd1": {
"caps": {
"constraints": true,
"meta.description": true,
"platform": true
}
}
},
"Source": {
"locations": {
"sha256:7b477ac5dd3a4c4d2523f7f7f20406b626395de082f44fd5ff996323ec8257d0": {}
}
}
},
"language": "Dockerfile"
},
"range": [
{
"start": {
"line": 6
},
"end": {
"line": 6
}
},
{
"start": {
"line": 7
},
"end": {
"line": 7
}
},
{
"start": {
"line": 8
},
"end": {
"line": 8
}
}
]
}
],
"containerimage.config.digest": "sha256:059b68a595b22564a1cbc167f369349fdc2ecc1f7bc092c2235cbf601a795fd",
"containerimage.digest": "sha256:b09b9482c72371486bb2c1d2c2a2633ed1d0b8389e12c8d52b9e052725c0c83c"
}

Binary file not shown.

Binary file not shown.

View File

@@ -21,7 +21,6 @@ import {Exec} from '../src/exec';
import {ExecOutput} from '@actions/exec';
beforeEach(() => {
jest.clearAllMocks();
jest.restoreAllMocks();
});

View File

@@ -14,18 +14,23 @@
* limitations under the License.
*/
import {beforeEach, describe, expect, it, jest} from '@jest/globals';
import {describe, expect, it, test} from '@jest/globals';
import fs from 'fs';
import * as path from 'path';
import {Buildx} from '../src/buildx/buildx';
import {Bake} from '../src/buildx/bake';
import {Build} from '../src/buildx/build';
import {Exec} from '../src/exec';
import {GitHub} from '../src/github';
import {History} from '../src/buildx/history';
const fixturesDir = path.join(__dirname, 'fixtures');
const maybe = !process.env.GITHUB_ACTIONS || (process.env.GITHUB_ACTIONS === 'true' && process.env.ImageOS && process.env.ImageOS.startsWith('ubuntu')) ? describe : describe.skip;
// prettier-ignore
const tmpDir = path.join(process.env.TEMP || '/tmp', 'github-jest');
beforeEach(() => {
jest.clearAllMocks();
});
const maybe = !process.env.GITHUB_ACTIONS || (process.env.GITHUB_ACTIONS === 'true' && process.env.ImageOS && process.env.ImageOS.startsWith('ubuntu')) ? describe : describe.skip;
maybe('uploadArtifact', () => {
it('uploads an artifact', async () => {
@@ -39,3 +44,291 @@ maybe('uploadArtifact', () => {
expect(res?.url).toBeDefined();
});
});
maybe('writeBuildSummary', () => {
// prettier-ignore
test.each([
[
"single",
[
'build',
'-f', path.join(fixturesDir, 'hello.Dockerfile'),
fixturesDir
],
],
[
"multiplatform",
[
'build',
'-f', path.join(fixturesDir, 'hello.Dockerfile'),
'--platform', 'linux/amd64,linux/arm64',
fixturesDir
],
]
])('write build summary %p', async (_, bargs) => {
const buildx = new Buildx();
const build = new Build({buildx: buildx});
fs.mkdirSync(tmpDir, {recursive: true});
await expect(
(async () => {
// prettier-ignore
const buildCmd = await buildx.getCommand([
'--builder', process.env.CTN_BUILDER_NAME ?? 'default',
...bargs,
'--metadata-file', build.getMetadataFilePath()
]);
await Exec.exec(buildCmd.command, buildCmd.args);
})()
).resolves.not.toThrow();
const metadata = build.resolveMetadata();
expect(metadata).toBeDefined();
const buildRef = build.resolveRef(metadata);
expect(buildRef).toBeDefined();
const history = new History({buildx: buildx});
const exportRes = await history.export({
refs: [buildRef ?? '']
});
expect(exportRes).toBeDefined();
expect(exportRes?.dockerbuildFilename).toBeDefined();
expect(exportRes?.dockerbuildSize).toBeDefined();
expect(exportRes?.summaries).toBeDefined();
const uploadRes = await GitHub.uploadArtifact({
filename: exportRes?.dockerbuildFilename,
mimeType: 'application/gzip',
retentionDays: 1
});
expect(uploadRes).toBeDefined();
expect(uploadRes?.url).toBeDefined();
await GitHub.writeBuildSummary({
exportRes: exportRes,
uploadRes: uploadRes,
inputs: {
context: fixturesDir,
file: path.join(fixturesDir, 'hello.Dockerfile')
}
});
});
// prettier-ignore
test.each([
[
'single',
path.join(fixturesDir, 'hello-bake.hcl'),
'hello'
],
[
'group',
path.join(fixturesDir, 'hello-bake.hcl'),
'hello-all'
],
[
'matrix',
path.join(fixturesDir, 'hello-bake.hcl'),
'hello-matrix'
]
])('write bake summary %p', async (_, file, target) => {
const buildx = new Buildx();
const bake = new Bake({buildx: buildx});
fs.mkdirSync(tmpDir, {recursive: true});
await expect(
(async () => {
// prettier-ignore
const buildCmd = await buildx.getCommand([
'--builder', process.env.CTN_BUILDER_NAME ?? 'default',
'bake',
'-f', file,
target,
'--metadata-file', bake.getMetadataFilePath()
]);
await Exec.exec(buildCmd.command, buildCmd.args, {
cwd: fixturesDir
});
})()
).resolves.not.toThrow();
const definition = await bake.getDefinition(
{
files: [file],
targets: [target],
},
{
cwd: fixturesDir
}
);
const metadata = bake.resolveMetadata();
expect(metadata).toBeDefined();
const buildRefs = bake.resolveRefs(metadata);
expect(buildRefs).toBeDefined();
const history = new History({buildx: buildx});
const exportRes = await history.export({
refs: buildRefs ?? []
});
expect(exportRes).toBeDefined();
expect(exportRes?.dockerbuildFilename).toBeDefined();
expect(exportRes?.dockerbuildSize).toBeDefined();
expect(exportRes?.summaries).toBeDefined();
const uploadRes = await GitHub.uploadArtifact({
filename: exportRes?.dockerbuildFilename,
mimeType: 'application/gzip',
retentionDays: 1
});
expect(uploadRes).toBeDefined();
expect(uploadRes?.url).toBeDefined();
await GitHub.writeBuildSummary({
exportRes: exportRes,
uploadRes: uploadRes,
inputs: {
files: path.join(fixturesDir, 'hello-bake.hcl')
},
bakeDefinition: definition
});
});
it('fails with dockerfile syntax issue', async () => {
const startedTime = new Date();
const buildx = new Buildx();
const build = new Build({buildx: buildx});
fs.mkdirSync(tmpDir, {recursive: true});
await expect(
(async () => {
// prettier-ignore
const buildCmd = await buildx.getCommand([
'--builder', process.env.CTN_BUILDER_NAME ?? 'default',
'build',
'-f', path.join(fixturesDir, 'hello-err.Dockerfile'),
fixturesDir,
'--metadata-file', build.getMetadataFilePath()
]);
await Exec.exec(buildCmd.command, buildCmd.args);
})()
).rejects.toThrow();
const refs = Buildx.refs({
dir: Buildx.refsDir,
builderName: process.env.CTN_BUILDER_NAME ?? 'default',
since: startedTime
});
expect(refs).toBeDefined();
expect(Object.keys(refs).length).toBeGreaterThan(0);
const history = new History({buildx: buildx});
const exportRes = await history.export({
refs: [Object.keys(refs)[0] ?? '']
});
expect(exportRes).toBeDefined();
expect(exportRes?.dockerbuildFilename).toBeDefined();
expect(exportRes?.dockerbuildSize).toBeDefined();
expect(exportRes?.summaries).toBeDefined();
const uploadRes = await GitHub.uploadArtifact({
filename: exportRes?.dockerbuildFilename,
mimeType: 'application/gzip',
retentionDays: 1
});
expect(uploadRes).toBeDefined();
expect(uploadRes?.url).toBeDefined();
await GitHub.writeBuildSummary({
exportRes: exportRes,
uploadRes: uploadRes,
inputs: {
context: fixturesDir,
file: path.join(fixturesDir, 'hello-err.Dockerfile')
}
});
});
it('without build record', async () => {
const startedTime = new Date();
const buildx = new Buildx();
const build = new Build({buildx: buildx});
fs.mkdirSync(tmpDir, {recursive: true});
await expect(
(async () => {
// prettier-ignore
const buildCmd = await buildx.getCommand([
'--builder', process.env.CTN_BUILDER_NAME ?? 'default',
'build',
'-f', path.join(fixturesDir, 'hello.Dockerfile'),
fixturesDir,
'--metadata-file', build.getMetadataFilePath()
]);
await Exec.exec(buildCmd.command, buildCmd.args);
})()
).resolves.not.toThrow();
const refs = Buildx.refs({
dir: Buildx.refsDir,
builderName: process.env.CTN_BUILDER_NAME ?? 'default',
since: startedTime
});
expect(refs).toBeDefined();
expect(Object.keys(refs).length).toBeGreaterThan(0);
const history = new History({buildx: buildx});
const exportRes = await history.export({
refs: [Object.keys(refs)[0] ?? '']
});
expect(exportRes).toBeDefined();
expect(exportRes?.dockerbuildFilename).toBeDefined();
expect(exportRes?.dockerbuildSize).toBeDefined();
expect(exportRes?.summaries).toBeDefined();
await GitHub.writeBuildSummary({
exportRes: exportRes,
inputs: {
context: fixturesDir,
file: path.join(fixturesDir, 'hello.Dockerfile')
}
});
});
});
maybe('annotateBuildWarnings', () => {
it('annoate lint issues', async () => {
const buildx = new Buildx();
const build = new Build({buildx: buildx});
fs.mkdirSync(tmpDir, {recursive: true});
await expect(
(async () => {
// prettier-ignore
const buildCmd = await buildx.getCommand([
'--builder', process.env.CTN_BUILDER_NAME ?? 'default',
'build',
'-f', path.join(fixturesDir, 'lint.Dockerfile'),
fixturesDir,
'--metadata-file', build.getMetadataFilePath()
]);
await Exec.exec(buildCmd.command, buildCmd.args, {
env: Object.assign({}, process.env, {
BUILDX_METADATA_WARNINGS: 'true'
}) as {
[key: string]: string;
}
});
})()
).resolves.not.toThrow();
const metadata = build.resolveMetadata();
expect(metadata).toBeDefined();
const buildRef = build.resolveRef(metadata);
expect(buildRef).toBeDefined();
const buildWarnings = build.resolveWarnings(metadata);
expect(buildWarnings).toBeDefined();
await GitHub.annotateBuildWarnings(path.join(fixturesDir, 'lint.Dockerfile'), buildWarnings);
});
});

View File

@@ -22,17 +22,13 @@ import * as core from '@actions/core';
import {GitHub} from '../src/github';
import {GitHubRepo} from '../src/types/github';
beforeEach(() => {
jest.clearAllMocks();
});
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 () => {
it('returns GitHub repo data', async () => {
const github = new GitHub();
expect((await github.repoData()).name).toEqual('Hello-World');
});
@@ -89,9 +85,18 @@ describe('apiURL', () => {
});
});
describe('repository', () => {
it('returns GitHub repository', async () => {
expect(GitHub.repository).toEqual('docker/actions-toolkit');
});
});
describe('workflowRunURL', () => {
it('returns 123', async () => {
expect(GitHub.workflowRunURL).toEqual('https://github.com/docker/actions-toolkit/actions/runs/123');
it('returns 2188748038', async () => {
expect(GitHub.workflowRunURL()).toEqual('https://github.com/docker/actions-toolkit/actions/runs/2188748038');
});
it('returns 2188748038 with attempts 2', async () => {
expect(GitHub.workflowRunURL(true)).toEqual('https://github.com/docker/actions-toolkit/actions/runs/2188748038/attempts/2');
});
});

46
__tests__/oci/oci.test.ts Normal file
View File

@@ -0,0 +1,46 @@
/**
* Copyright 2024 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, describe, expect, test} from '@jest/globals';
import * as fs from 'fs';
import path from 'path';
import * as rimraf from 'rimraf';
import {OCI} from '../../src/oci/oci';
const fixturesDir = path.join(__dirname, '..', 'fixtures');
// prettier-ignore
const tmpDir = path.join(process.env.TEMP || '/tmp', 'docker-jest');
afterEach(function () {
rimraf.sync(tmpDir);
});
describe('loadArchive', () => {
// prettier-ignore
test.each(fs.readdirSync(path.join(fixturesDir, 'oci-archive')).filter(file => {
return fs.statSync(path.join(path.join(fixturesDir, 'oci-archive'), file)).isFile();
}).map(filename => [filename]))('extracting %p', async (filename) => {
const res = await OCI.loadArchive({
file: path.join(fixturesDir, 'oci-archive', filename)
});
expect(res).toBeDefined();
expect(res?.root.index).toBeDefined();
expect(res?.root.layout).toBeDefined();
// console.log(JSON.stringify(res, null, 2));
});
});

View File

@@ -14,16 +14,12 @@
* limitations under the License.
*/
import {beforeEach, describe, expect, it, jest, test} from '@jest/globals';
import {describe, expect, it, test} from '@jest/globals';
import * as fs from 'fs';
import * as path from 'path';
import {Util} from '../src/util';
beforeEach(() => {
jest.clearAllMocks();
});
describe('getInputList', () => {
it('single line correctly', async () => {
await setInput('foo', 'bar');
@@ -31,6 +27,12 @@ describe('getInputList', () => {
expect(res).toEqual(['bar']);
});
it('empty correctly', async () => {
setInput('foo', '');
const res = Util.getInputList('foo');
expect(res).toEqual([]);
});
it('multiline correctly', async () => {
setInput('foo', 'bar\nbaz');
const res = Util.getInputList('foo');
@@ -335,6 +337,85 @@ describe('formatFileSize', () => {
});
});
describe('generateRandomString', () => {
it('should generate a random string of default length 10', async () => {
const res = Util.generateRandomString();
expect(typeof res).toBe('string');
expect(res.length).toBe(10);
expect(/^[0-9a-f]+$/i.test(res)).toBe(true);
});
it('should generate a random string of specified length', async () => {
const length = 15;
const res = Util.generateRandomString(length);
expect(typeof res).toBe('string');
expect(res.length).toBe(15);
expect(/^[0-9a-f]+$/i.test(res)).toBe(true);
});
});
describe('stringToUnicodeEntities', () => {
it('should convert a string to Unicode entities', () => {
const input = 'Hello, World!';
const expected = '&#x48;&#x65;&#x6c;&#x6c;&#x6f;&#x2c;&#x20;&#x57;&#x6f;&#x72;&#x6c;&#x64;&#x21;';
const result = Util.stringToUnicodeEntities(input);
expect(result).toEqual(expected);
});
it('should handle an empty string', () => {
const input = '';
const expected = '';
const result = Util.stringToUnicodeEntities(input);
expect(result).toEqual(expected);
});
it('should handle special characters', () => {
const input = '@#^&*()';
const expected = '&#x40;&#x23;&#x5e;&#x26;&#x2a;&#x28;&#x29;';
const result = Util.stringToUnicodeEntities(input);
expect(result).toEqual(expected);
});
it('should handle non-English characters', () => {
const input = 'こんにちは';
const expected = '&#x3053;&#x3093;&#x306b;&#x3061;&#x306f;';
const result = Util.stringToUnicodeEntities(input);
expect(result).toEqual(expected);
});
});
describe('countLines', () => {
it('counts total number of lines correctly', () => {
const text = `This
is
a
sample
text
with
multiple
lines`;
const result = Util.countLines(text);
expect(result).toEqual(10); // Including empty lines
});
it('handles edge case with empty string', () => {
const text = '';
const result = Util.countLines(text);
expect(result).toEqual(1); // Empty string should have 1 line
});
it('handles edge case with single line', () => {
const text = 'Single line text';
const result = Util.countLines(text);
expect(result).toEqual(1); // Single line should have 1 line
});
it('handles multiple types of line breaks', () => {
const text = `Line 1\r\nLine 2\rLine 3\nLine 4`;
const result = Util.countLines(text);
expect(result).toEqual(4); // Different line break types should be counted correctly
});
});
// See: https://github.com/actions/toolkit/blob/a1b068ec31a042ff1e10a522d8fdf0b8869d53ca/packages/core/src/core.ts#L89
function getInputName(name: string): string {
return `INPUT_${name.replace(/ /g, '_').toUpperCase()}`;

View File

@@ -16,12 +16,17 @@
ARG NODE_VERSION=20
ARG DOCKER_VERSION=26.0.2
ARG BUILDX_VERSION=0.14.0
ARG BUILDX_VERSION=0.16.1
FROM node:${NODE_VERSION}-alpine AS base
RUN apk add --no-cache cpio findutils git
RUN yarn config set --home enableTelemetry 0
WORKDIR /src
RUN --mount=type=bind,target=.,rw \
--mount=type=cache,target=/src/.yarn/cache <<EOT
corepack enable
yarn --version
yarn config set --home enableTelemetry 0
EOT
FROM base AS deps
RUN --mount=type=bind,target=.,rw \

View File

@@ -14,8 +14,21 @@
* 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,
RUNNER_TEMP: path.join(tmpDir, 'runner-temp'),
RUNNER_TOOL_CACHE: path.join(tmpDir, 'runner-tool-cache')
}) as {
[key: string]: string;
};
module.exports = {
clearMocks: true,
testEnvironment: 'node',
moduleFileExtensions: ['js', 'ts'],
setupFiles: ['dotenv/config'],

View File

@@ -23,6 +23,9 @@ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'docker-actions-toolkit-'))
process.env = Object.assign({}, process.env, {
TEMP: tmpDir,
GITHUB_REPOSITORY: 'docker/actions-toolkit',
GITHUB_RUN_ATTEMPT: 2,
GITHUB_RUN_ID: 2188748038,
GITHUB_RUN_NUMBER: 15,
RUNNER_TEMP: path.join(tmpDir, 'runner-temp'),
RUNNER_TOOL_CACHE: path.join(tmpDir, 'runner-tool-cache')
}) as {

View File

@@ -45,7 +45,7 @@
"registry": "https://registry.npmjs.org/"
},
"dependencies": {
"@actions/artifact": "^2.1.7",
"@actions/artifact": "^2.1.8",
"@actions/cache": "^3.2.4",
"@actions/core": "^1.10.1",
"@actions/exec": "^1.1.1",
@@ -57,31 +57,38 @@
"@octokit/core": "^5.1.0",
"@octokit/plugin-rest-endpoint-methods": "^10.4.0",
"async-retry": "^1.3.3",
"csv-parse": "^5.5.5",
"csv-parse": "^5.5.6",
"gunzip-maybe": "^1.4.2",
"handlebars": "^4.7.8",
"he": "^1.2.0",
"js-yaml": "^4.1.0",
"jwt-decode": "^4.0.0",
"semver": "^7.6.0",
"semver": "^7.6.3",
"tar-stream": "^3.1.7",
"tmp": "^0.2.3"
},
"devDependencies": {
"@types/csv-parse": "^1.2.2",
"@types/js-yaml": "^4.0.5",
"@types/node": "^20.5.9",
"@types/gunzip-maybe": "^1.4.2",
"@types/he": "^1.2.3",
"@types/js-yaml": "^4.0.9",
"@types/node": "^20.12.10",
"@types/semver": "^7.5.8",
"@types/tmp": "^0.2.3",
"@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": "^5.2.2"
"@types/tar-stream": "^3.1.3",
"@types/tmp": "^0.2.6",
"@typescript-eslint/eslint-plugin": "^7.8.0",
"@typescript-eslint/parser": "^7.8.0",
"dotenv": "^16.4.5",
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-jest": "^28.5.0",
"eslint-plugin-prettier": "^5.1.3",
"jest": "^29.7.0",
"prettier": "^3.2.5",
"rimraf": "^5.0.5",
"ts-jest": "^29.1.2",
"ts-node": "^10.9.2",
"typescript": "^5.4.5"
}
}

View File

@@ -19,10 +19,10 @@ import * as semver from 'semver';
import {Buildx} from '../buildx/buildx';
import {Builder} from '../buildx/builder';
import {Docker} from '../docker/docker';
import {Config} from './config';
import {Exec} from '../exec';
import {BuilderInfo, NodeInfo} from '../types/builder';
import {BuilderInfo, NodeInfo} from '../types/buildx/builder';
export interface BuildKitOpts {
buildx?: Buildx;
@@ -51,13 +51,13 @@ export class 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}`], {
return Docker.getExecOutput(['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'], {
return Docker.getExecOutput(['run', '--rm', bkitimage.stdout.trim(), '--version'], {
ignoreReturnCode: true,
silent: true
}).then(bkitversion => {

113
src/buildkit/git.ts Normal file
View File

@@ -0,0 +1,113 @@
/**
* Copyright 2024 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 {GitRef, GitURL, GitURLFragment, URLUserInfo} from '../types/buildkit/git';
export class Git {
private static protoRegexp = new RegExp('^[a-zA-Z0-9]+://');
private static supportedProtos = {
http: {},
https: {},
ssh: {},
git: {}
};
// https://github.com/moby/buildkit/blob/2ec1338fc13f73b43f0b1b4f4678d7cd654bc86c/util/gitutil/git_url.go#L79
public static parseURL(remote: string): GitURL {
const match = remote.match(Git.protoRegexp);
if (match && match.length > 0) {
let proto = match[0].toLowerCase();
proto = proto.slice(0, proto.lastIndexOf('://'));
if (!(proto in Git.supportedProtos)) {
throw new Error(`Invalid protocol: ${proto}`);
}
return Git.fromURL(new URL(remote));
}
throw new Error('Unknown protocol');
}
// https://github.com/moby/buildkit/blob/2ec1338fc13f73b43f0b1b4f4678d7cd654bc86c/util/gitutil/git_url.go#L108
private static fromURL(url: URL): GitURL {
const withoutFragment = new URL(url.toString());
withoutFragment.hash = '';
let user: URLUserInfo | undefined;
if (url.username || url.password) {
user = {
username: url.username,
password: url.password,
passwordSet: url.password !== ''
};
}
// TODO: handle SCP-style URLs
return {
scheme: url.protocol.slice(0, -1),
user: user,
host: `${url.hostname}${url.port ? ':' + url.port : ''}`,
path: url.pathname,
fragment: Git.splitGitFragment(url.hash),
remote: withoutFragment.toString()
};
}
// https://github.com/moby/buildkit/blob/2ec1338fc13f73b43f0b1b4f4678d7cd654bc86c/util/gitutil/git_url.go#L69
private static splitGitFragment(fragment: string): GitURLFragment | undefined {
if (fragment === '') {
return undefined;
}
const [ref, subdir] = fragment.slice(1).split(':');
return {
ref: ref,
subdir: subdir
};
}
// https://github.com/moby/buildkit/blob/2ec1338fc13f73b43f0b1b4f4678d7cd654bc86c/util/gitutil/git_ref.go#L52
public static parseRef(ref: string): GitRef | undefined {
const res: GitRef = {};
let remote: GitURL;
if (ref.startsWith('./') || ref.startsWith('../')) {
throw new Error('Invalid argument');
} else if (ref.startsWith('github.com/')) {
res.indistinguishableFromLocal = true; // Deprecated
remote = Git.fromURL(new URL('https://' + ref));
} else {
remote = Git.parseURL(ref);
if (['http', 'git'].includes(remote.scheme)) {
res.unencryptedTCP = true; // Discouraged, but not deprecated
}
if (['http', 'https'].includes(remote.scheme) && !remote.path.endsWith('.git')) {
throw new Error('Invalid argument');
}
}
res.remote = remote.remote;
if (res.indistinguishableFromLocal) {
res.remote = res.remote.split('://')[1];
}
if (remote.fragment) {
res.commit = remote.fragment.ref;
res.subDir = remote.fragment.subdir;
}
const repoSplitBySlash = res.remote.split('/');
res.shortName = repoSplitBySlash[repoSplitBySlash.length - 1].replace('.git', '');
return res;
}
}

View File

@@ -24,7 +24,8 @@ import {Exec} from '../exec';
import {Util} from '../util';
import {ExecOptions} from '@actions/exec';
import {BakeDefinition, BakeMetadata} from '../types/bake';
import {BakeDefinition} from '../types/buildx/bake';
import {BuildMetadata} from '../types/buildx/build';
export interface BakeOpts {
buildx?: Buildx;
@@ -46,17 +47,19 @@ export interface BakeCmdOpts {
export class Bake {
private readonly buildx: Buildx;
private readonly metadataFilename: string;
constructor(opts?: BakeOpts) {
this.buildx = opts?.buildx || new Buildx();
this.metadataFilename = `bake-metadata-${Util.generateRandomString()}.json`;
}
public static getMetadataFilePath(): string {
return path.join(Context.tmpDir(), 'metadata-file');
public getMetadataFilePath(): string {
return path.join(Context.tmpDir(), this.metadataFilename);
}
public static resolveMetadata(): BakeMetadata | undefined {
const metadataFile = Bake.getMetadataFilePath();
public resolveMetadata(): BuildMetadata | undefined {
const metadataFile = this.getMetadataFilePath();
if (!fs.existsSync(metadataFile)) {
return undefined;
}
@@ -64,13 +67,15 @@ export class Bake {
if (content === 'null') {
return undefined;
}
return <BakeMetadata>JSON.parse(content);
return <BuildMetadata>JSON.parse(content);
}
public static resolveRefs(): Array<string> | undefined {
const metadata = Bake.resolveMetadata();
public resolveRefs(metadata?: BuildMetadata): Array<string> | undefined {
if (!metadata) {
return undefined;
metadata = this.resolveMetadata();
if (!metadata) {
return undefined;
}
}
const refs = new Array<string>();
for (const key in metadata) {
@@ -78,7 +83,7 @@ export class Bake {
refs.push(metadata[key]['buildx.build.ref']);
}
}
return refs;
return refs.length > 0 ? refs : undefined;
}
public async getDefinition(cmdOpts: BakeCmdOpts, execOptions?: ExecOptions): Promise<BakeDefinition> {

View File

@@ -19,31 +19,48 @@ import path from 'path';
import * as core from '@actions/core';
import {parse} from 'csv-parse/sync';
import {Buildx} from './buildx';
import {Context} from '../context';
import {GitHub} from '../github';
import {Util} from '../util';
import {BuildMetadata} from '../types/build';
import {BuildMetadata} from '../types/buildx/build';
import {VertexWarning} from '../types/buildkit/client';
import {ProvenancePredicate} from '../types/intoto/slsa_provenance/v0.2/provenance';
export interface BuildOpts {
buildx?: Buildx;
}
export class Build {
public static getImageIDFilePath(): string {
return path.join(Context.tmpDir(), 'iidfile');
private readonly buildx: Buildx;
private readonly iidFilename: string;
private readonly metadataFilename: string;
constructor(opts?: BuildOpts) {
this.buildx = opts?.buildx || new Buildx();
this.iidFilename = `build-iidfile-${Util.generateRandomString()}.txt`;
this.metadataFilename = `build-metadata-${Util.generateRandomString()}.json`;
}
public static getMetadataFilePath(): string {
return path.join(Context.tmpDir(), 'metadata-file');
public getImageIDFilePath(): string {
return path.join(Context.tmpDir(), this.iidFilename);
}
public static resolveImageID(): string | undefined {
const iidFile = Build.getImageIDFilePath();
public resolveImageID(): string | undefined {
const iidFile = this.getImageIDFilePath();
if (!fs.existsSync(iidFile)) {
return undefined;
}
return fs.readFileSync(iidFile, {encoding: 'utf-8'}).trim();
}
public static resolveMetadata(): BuildMetadata | undefined {
const metadataFile = Build.getMetadataFilePath();
public getMetadataFilePath(): string {
return path.join(Context.tmpDir(), this.metadataFilename);
}
public resolveMetadata(): BuildMetadata | undefined {
const metadataFile = this.getMetadataFilePath();
if (!fs.existsSync(metadataFile)) {
return undefined;
}
@@ -54,10 +71,12 @@ export class Build {
return <BuildMetadata>JSON.parse(content);
}
public static resolveRef(): string | undefined {
const metadata = Build.resolveMetadata();
public resolveRef(metadata?: BuildMetadata): string | undefined {
if (!metadata) {
return undefined;
metadata = this.resolveMetadata();
if (!metadata) {
return undefined;
}
}
if ('buildx.build.ref' in metadata) {
return metadata['buildx.build.ref'];
@@ -65,10 +84,38 @@ export class Build {
return undefined;
}
public static resolveDigest(): string | undefined {
const metadata = Build.resolveMetadata();
public resolveProvenance(metadata?: BuildMetadata): ProvenancePredicate | undefined {
if (!metadata) {
return undefined;
metadata = this.resolveMetadata();
if (!metadata) {
return undefined;
}
}
if ('buildx.build.provenance' in metadata) {
return metadata['buildx.build.provenance'] as ProvenancePredicate;
}
return undefined;
}
public resolveWarnings(metadata?: BuildMetadata): Array<VertexWarning> | undefined {
if (!metadata) {
metadata = this.resolveMetadata();
if (!metadata) {
return undefined;
}
}
if ('buildx.build.warnings' in metadata) {
return metadata['buildx.build.warnings'] as Array<VertexWarning>;
}
return undefined;
}
public resolveDigest(metadata?: BuildMetadata): string | undefined {
if (!metadata) {
metadata = this.resolveMetadata();
if (!metadata) {
return undefined;
}
}
if ('containerimage.digest' in metadata) {
return metadata['containerimage.digest'];
@@ -112,7 +159,7 @@ export class Build {
return input;
}
try {
return core.getBooleanInput(name) ? `builder-id=${GitHub.workflowRunURL}` : 'false';
return core.getBooleanInput(name) ? `builder-id=${GitHub.workflowRunURL(true)}` : 'false';
} catch (err) {
// not a valid boolean, so we assume it's a string
return Build.resolveProvenanceAttrs(input);
@@ -121,7 +168,7 @@ export class Build {
public static resolveProvenanceAttrs(input: string): string {
if (!input) {
return `builder-id=${GitHub.workflowRunURL}`;
return `builder-id=${GitHub.workflowRunURL(true)}`;
}
// parse attributes from input
const fields = parse(input, {
@@ -139,7 +186,46 @@ export class Build {
}
}
// if not add builder-id attribute
return `${input},builder-id=${GitHub.workflowRunURL}`;
return `${input},builder-id=${GitHub.workflowRunURL(true)}`;
}
public static resolveCacheToAttrs(input: string, githubToken?: string): string {
if (!input) {
return input;
}
let cacheType = 'registry';
let ghaCacheRepository = '';
let ghaCacheGHToken = '';
const fields = parse(input, {
relaxColumnCount: true,
skipEmptyLines: true
})[0];
for (const field of fields) {
const parts = field
.toString()
.split(/(?<=^[^=]+?)=/)
.map(item => item.trim());
if (parts[0] === 'type') {
cacheType = parts[1];
} else if (parts[0] === 'repository') {
ghaCacheRepository = parts[1];
} else if (parts[0] === 'ghtoken') {
ghaCacheGHToken = parts[1];
}
}
if (cacheType === 'gha') {
if (!ghaCacheRepository) {
input = `${input},repository=${GitHub.repository}`;
}
if (!ghaCacheGHToken && githubToken) {
input = `${input},ghtoken=${githubToken}`;
}
}
return input;
}
public static hasLocalExporter(exporters: string[]): boolean {

View File

@@ -19,7 +19,7 @@ import * as core from '@actions/core';
import {Buildx} from './buildx';
import {Exec} from '../exec';
import {BuilderInfo, GCPolicy, NodeInfo} from '../types/builder';
import {BuilderInfo, GCPolicy, NodeInfo} from '../types/buildx/builder';
export interface BuilderOpts {
buildx?: Buildx;

View File

@@ -22,7 +22,7 @@ import * as semver from 'semver';
import {Docker} from '../docker/docker';
import {Exec} from '../exec';
import {Cert, LocalRefsOpts, LocalRefsResponse, LocalState} from '../types/buildx';
import {Cert, LocalRefsOpts, LocalRefsResponse, LocalState} from '../types/buildx/buildx';
export interface BuildxOpts {
standalone?: boolean;
@@ -177,6 +177,54 @@ export class Buildx {
return driverOpts;
}
public static localState(ref: string, dir?: string): LocalState {
const [builderName, nodeName, id] = ref.split('/');
if (!builderName || !nodeName || !id) {
throw new Error(`Invalid build reference: ${ref}`);
}
const lsPath = path.join(dir || Buildx.refsDir, builderName, nodeName, id);
if (!fs.existsSync(lsPath)) {
throw new Error(`Local state not found in ${lsPath}`);
}
return Buildx.fixLocalState(<LocalState>JSON.parse(fs.readFileSync(lsPath, 'utf8')));
}
// https://github.com/docker/buildx/pull/2560
private static fixLocalState(ls: LocalState): LocalState {
const fnTrimToValidContext = function (inp: string): [string, string, boolean] {
const match = inp.match(/(.*)(https?:\/{1,2}\S+|ssh:\/{1,2}\S+|git:\/{1,2}\S+)/i);
if (match && match.length == 3) {
const trimed = match[1];
let url = match[2];
if (url.startsWith('https:/') && !url.startsWith('https://')) {
url = url.replace('https:/', 'https://');
}
if (url.startsWith('http:/') && !url.startsWith('http://')) {
url = url.replace('http:/', 'http://');
}
if (url.startsWith('ssh:/') && !url.startsWith('ssh://')) {
url = url.replace('ssh:/', 'ssh://');
}
if (url.startsWith('git:/') && !url.startsWith('git://')) {
url = url.replace('git:/', 'git://');
}
return [url, trimed, true];
}
return [inp, '', false];
};
const [contextPath, trimedPath, isURL] = fnTrimToValidContext(ls.LocalPath);
if (isURL) {
ls.LocalPath = contextPath;
if (ls.DockerfilePath.indexOf(trimedPath) === 0) {
ls.DockerfilePath = ls.DockerfilePath.substring(trimedPath.length);
}
}
ls.LocalPath = ls.LocalPath.endsWith('/-') ? '-' : ls.LocalPath;
ls.DockerfilePath = ls.DockerfilePath.endsWith('/-') ? '-' : ls.DockerfilePath;
return ls;
}
public static refs(opts: LocalRefsOpts, refs: LocalRefsResponse = {}): LocalRefsResponse {
const {dir, builderName, nodeName, since} = opts;
@@ -210,7 +258,7 @@ export class Buildx {
if (since && stat.mtime < since) {
continue;
}
const localState = <LocalState>JSON.parse(fs.readFileSync(filePath, 'utf8'));
const localState = Buildx.fixLocalState(<LocalState>JSON.parse(fs.readFileSync(filePath, 'utf8')));
const ref = `${builderName}/${nodeName}/${file}`;
refs[ref] = localState;
}

211
src/buildx/history.ts Normal file
View File

@@ -0,0 +1,211 @@
/**
* Copyright 2024 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 {ChildProcessByStdio, spawn} from 'child_process';
import fs from 'fs';
import os from 'os';
import path from 'path';
import {Readable, Writable} from 'stream';
import * as core from '@actions/core';
import {Buildx} from './buildx';
import {Context} from '../context';
import {Docker} from '../docker/docker';
import {Exec} from '../exec';
import {GitHub} from '../github';
import {ExportRecordOpts, ExportRecordResponse, Summaries} from '../types/buildx/history';
export interface HistoryOpts {
buildx?: Buildx;
}
export class History {
private readonly buildx: Buildx;
private static readonly EXPORT_BUILD_IMAGE_DEFAULT: string = 'docker.io/dockereng/export-build:latest';
private static readonly EXPORT_BUILD_IMAGE_ENV: string = 'DOCKER_BUILD_EXPORT_BUILD_IMAGE';
constructor(opts?: HistoryOpts) {
this.buildx = opts?.buildx || new Buildx();
}
public async export(opts: ExportRecordOpts): Promise<ExportRecordResponse> {
if (os.platform() === 'win32') {
throw new Error('Exporting a build record is currently not supported on Windows');
}
if (!(await Docker.isAvailable())) {
throw new Error('Docker is required to export a build record');
}
if (!(await Docker.isDaemonRunning())) {
throw new Error('Docker daemon is not running, skipping build record export');
}
if (!(await this.buildx.versionSatisfies('>=0.13.0'))) {
throw new Error('Buildx >= 0.13.0 is required to export a build record');
}
let builderName: string = '';
let nodeName: string = '';
const refs: Array<string> = [];
for (const ref of opts.refs) {
const refParts = ref.split('/');
if (refParts.length != 3) {
throw new Error(`Invalid build ref: ${ref}`);
}
refs.push(refParts[2]);
// Set builder name and node name from the first ref if not already set.
// We assume all refs are from the same builder and node.
if (!builderName) {
builderName = refParts[0];
}
if (!nodeName) {
nodeName = refParts[1];
}
}
if (refs.length === 0) {
throw new Error('No build refs provided');
}
const outDir = path.join(Context.tmpDir(), 'export');
core.info(`exporting build record to ${outDir}`);
fs.mkdirSync(outDir, {recursive: true});
const buildxInFifoPath = Context.tmpName({
template: 'buildx-in-XXXXXX.fifo',
tmpdir: Context.tmpDir()
});
await Exec.exec('mkfifo', [buildxInFifoPath]);
const buildxOutFifoPath = Context.tmpName({
template: 'buildx-out-XXXXXX.fifo',
tmpdir: Context.tmpDir()
});
await Exec.exec('mkfifo', [buildxOutFifoPath]);
const buildxDialStdioCmd = await this.buildx.getCommand(['--builder', builderName, 'dial-stdio']);
core.info(`[command]${buildxDialStdioCmd.command} ${buildxDialStdioCmd.args.join(' ')}`);
const buildxDialStdioProc = spawn(buildxDialStdioCmd.command, buildxDialStdioCmd.args, {
stdio: ['pipe', 'pipe', 'inherit'],
detached: true
});
let buildxDialStdioKilled = false;
fs.createReadStream(buildxInFifoPath).pipe(buildxDialStdioProc.stdin);
buildxDialStdioProc.stdout.pipe(fs.createWriteStream(buildxOutFifoPath));
buildxDialStdioProc.on('exit', (code, signal) => {
buildxDialStdioKilled = true;
if (signal) {
core.info(`Process "buildx dial-stdio" was killed with signal ${signal}`);
} else {
core.info(`Process "buildx dial-stdio" exited with code ${code}`);
}
});
const tmpDockerbuildFilename = path.join(outDir, 'rec.dockerbuild');
const summaryFilename = path.join(outDir, 'summary.json');
let dockerRunProc: ChildProcessByStdio<Writable, Readable, null> | undefined;
let dockerRunProcKilled = false;
await new Promise<void>((resolve, reject) => {
const ebargs: Array<string> = ['--ref-state-dir=/buildx-refs', `--node=${builderName}/${nodeName}`];
for (const ref of refs) {
ebargs.push(`--ref=${ref}`);
}
if (typeof process.getuid === 'function') {
ebargs.push(`--uid=${process.getuid()}`);
}
if (typeof process.getgid === 'function') {
ebargs.push(`--gid=${process.getgid()}`);
}
// prettier-ignore
const dockerRunArgs = [
'run', '--rm', '-i',
'-v', `${Buildx.refsDir}:/buildx-refs`,
'-v', `${outDir}:/out`,
opts.image || process.env[History.EXPORT_BUILD_IMAGE_ENV] || History.EXPORT_BUILD_IMAGE_DEFAULT,
...ebargs
]
core.info(`[command]docker ${dockerRunArgs.join(' ')}`);
dockerRunProc = spawn('docker', dockerRunArgs, {
stdio: ['pipe', 'pipe', 'inherit'],
env: {
...process.env,
DOCKER_CONTENT_TRUST: 'false'
}
});
fs.createReadStream(buildxOutFifoPath).pipe(dockerRunProc.stdin);
dockerRunProc.stdout.pipe(fs.createWriteStream(buildxInFifoPath));
dockerRunProc.on('close', code => {
if (code === 0) {
if (!fs.existsSync(tmpDockerbuildFilename)) {
reject(new Error(`Failed to export build record: ${tmpDockerbuildFilename} not found`));
} else {
resolve();
}
} else {
reject(new Error(`Process "docker run" closed with code ${code}`));
}
});
dockerRunProc.on('error', err => {
core.error(`Error executing "docker run": ${err}`);
reject(err);
});
dockerRunProc.on('exit', (code, signal) => {
dockerRunProcKilled = true;
if (signal) {
core.info(`Process "docker run" was killed with signal ${signal}`);
} else {
core.info(`Process "docker run" exited with code ${code}`);
}
});
})
.catch(err => {
throw err;
})
.finally(() => {
if (buildxDialStdioProc && !buildxDialStdioKilled) {
core.debug('Force terminating "buildx dial-stdio" process');
buildxDialStdioProc.kill('SIGKILL');
}
if (dockerRunProc && !dockerRunProcKilled) {
core.debug('Force terminating "docker run" process');
dockerRunProc.kill('SIGKILL');
}
});
let dockerbuildFilename = `${GitHub.context.repo.owner}~${GitHub.context.repo.repo}~${refs[0].substring(0, 6).toUpperCase()}`;
if (refs.length > 1) {
dockerbuildFilename += `+${refs.length - 1}`;
}
const dockerbuildPath = path.join(outDir, `${dockerbuildFilename}.dockerbuild`);
fs.renameSync(tmpDockerbuildFilename, dockerbuildPath);
const dockerbuildStats = fs.statSync(dockerbuildPath);
core.info(`Parsing ${summaryFilename}`);
fs.statSync(summaryFilename);
const summaries = <Summaries>JSON.parse(fs.readFileSync(summaryFilename, {encoding: 'utf-8'}));
return {
dockerbuildFilename: dockerbuildPath,
dockerbuildSize: dockerbuildStats.size,
summaries: summaries,
builderName: builderName,
nodeName: nodeName,
refs: refs
};
}
}

View File

@@ -31,7 +31,7 @@ import {Docker} from '../docker/docker';
import {Git} from '../git';
import {Util} from '../util';
import {DownloadVersion} from '../types/buildx';
import {DownloadVersion} from '../types/buildx/buildx';
import {GitHubRelease} from '../types/github';
export interface InstallOpts {

View File

@@ -79,6 +79,9 @@ if (Get-Service docker -ErrorAction SilentlyContinue) {
Write-Host "Service removed"
}
$env:Path = "$ToolDir;" + [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
Write-Host "Path: $env:Path"
$env:DOCKER_HOST = $DockerHost
Write-Host "DOCKER_HOST: $env:DOCKER_HOST"

View File

@@ -18,6 +18,7 @@ import fs from 'fs';
import os from 'os';
import path from 'path';
import * as core from '@actions/core';
import {ExecOptions, ExecOutput} from '@actions/exec';
import * as io from '@actions/io';
import {Context} from '../context';
@@ -25,7 +26,7 @@ import {Cache} from '../cache';
import {Exec} from '../exec';
import {Util} from '../util';
import {ConfigFile} from '../types/docker';
import {ConfigFile, ContextInfo} from '../types/docker/docker';
export class Docker {
static get configDir(): string {
@@ -53,12 +54,47 @@ export class Docker {
});
}
public static async isDaemonRunning(): Promise<boolean> {
try {
await Docker.getExecOutput([`version`], {
silent: true
});
return true;
} catch (e) {
return false;
}
}
public static async exec(args?: string[], options?: ExecOptions): Promise<number> {
return Exec.exec('docker', args, Docker.execOptions(options));
}
public static async getExecOutput(args?: string[], options?: ExecOptions): Promise<ExecOutput> {
return Exec.getExecOutput('docker', args, Docker.execOptions(options));
}
private static execOptions(options?: ExecOptions): ExecOptions {
if (!options) {
options = {};
}
if (!options.env) {
options.env = Object.assign({}, process.env, {
DOCKER_CONTENT_TRUST: 'false'
}) as {
[key: string]: string;
};
} else {
options.env.DOCKER_CONTENT_TRUST = 'false';
}
return options;
}
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, {
return await Docker.getExecOutput(args, {
ignoreReturnCode: true,
silent: true
}).then(res => {
@@ -69,12 +105,28 @@ export class Docker {
});
}
public static async contextInspect(name?: string): Promise<ContextInfo> {
const args = ['context', 'inspect', '--format=json'];
if (name) {
args.push(name);
}
return await Docker.getExecOutput(args, {
ignoreReturnCode: true,
silent: true
}).then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
throw new Error(res.stderr.trim());
}
return (<Array<ContextInfo>>JSON.parse(res.stdout.trim()))[0];
});
}
public static async printVersion(): Promise<void> {
await Exec.exec('docker', ['version']);
await Docker.exec(['version']);
}
public static async printInfo(): Promise<void> {
await Exec.exec('docker', ['info']);
await Docker.exec(['info']);
}
public static parseRepoTag(image: string): {repository: string; tag: string} {
@@ -122,7 +174,7 @@ export class Docker {
cacheFoundPath = await imageCache.find();
if (cacheFoundPath) {
core.info(`Image found from cache in ${cacheFoundPath}`);
await Exec.getExecOutput(`docker`, ['load', '-i', cacheFoundPath], {
await Docker.getExecOutput(['load', '-i', cacheFoundPath], {
ignoreReturnCode: true
}).then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
@@ -133,7 +185,7 @@ export class Docker {
}
let pulled = true;
await Exec.getExecOutput(`docker`, ['pull', image], {
await Docker.getExecOutput(['pull', image], {
ignoreReturnCode: true
}).then(res => {
if (res.stderr.length > 0 && res.exitCode != 0) {
@@ -149,7 +201,7 @@ export class Docker {
if (cache && pulled) {
const imageTarPath = path.join(Context.tmpDir(), `${Util.hash(image)}.tar`);
await Exec.getExecOutput(`docker`, ['save', '-o', imageTarPath, image], {
await Docker.getExecOutput(['save', '-o', imageTarPath, image], {
ignoreReturnCode: true
}).then(async res => {
if (res.stderr.length > 0 && res.exitCode != 0) {

View File

@@ -28,6 +28,7 @@ import * as io from '@actions/io';
import * as tc from '@actions/tool-cache';
import {Context} from '../context';
import {Docker} from './docker';
import {Exec} from '../exec';
import {Util} from '../util';
import {limaYamlData, dockerServiceLogsPs1, setupDockerWinPs1} from './assets';
@@ -219,8 +220,8 @@ export class Install {
});
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]);
await Docker.exec(['context', 'create', this.contextName, '--docker', `host=${dockerHost}`]);
await Docker.exec(['context', 'use', this.contextName]);
});
return dockerHost;
@@ -253,6 +254,12 @@ export class Install {
});
}
const envs = Object.assign({}, process.env, {
PATH: `${this.toolDir}:${process.env.PATH}`
}) as {
[key: string]: string;
};
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`;
@@ -262,11 +269,12 @@ export class Install {
// 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
`sudo env "PATH=$PATH" ${bashPath} << EOF
( ${cmd} 2>&1 | tee "${this.runDir}/dockerd.log" ) &
EOF`,
[],
{
env: envs,
detached: true,
shell: true,
stdio: ['ignore', process.stdout, process.stderr]
@@ -280,8 +288,9 @@ EOF`,
try {
await Exec.getExecOutput(`docker version`, undefined, {
silent: true,
env: Object.assign({}, process.env, {
DOCKER_HOST: dockerHost
env: Object.assign({}, envs, {
DOCKER_HOST: dockerHost,
DOCKER_CONTENT_TRUST: 'false'
}) as {
[key: string]: string;
}
@@ -302,8 +311,8 @@ EOF`,
});
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]);
await Docker.exec(['context', 'create', this.contextName, '--docker', `host=${dockerHost}`]);
await Docker.exec(['context', 'use', this.contextName]);
});
return dockerHost;
@@ -345,8 +354,8 @@ EOF`,
});
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]);
await Docker.exec(['context', 'create', this.contextName, '--docker', `host=${dockerHost}`]);
await Docker.exec(['context', 'use', this.contextName]);
});
return dockerHost;
@@ -388,7 +397,7 @@ EOF`,
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 Docker.exec(['context', 'rm', '-f', this.contextName]);
});
await core.group(`Cleaning up runDir`, async () => {
await Exec.exec('sudo', ['rm', '-rf', this.runDir]);
@@ -404,7 +413,7 @@ EOF`,
await Util.sleep(5);
});
await core.group('Removing Docker context', async () => {
await Exec.exec('docker', ['context', 'rm', '-f', this.contextName]);
await Docker.exec(['context', 'rm', '-f', this.contextName]);
});
await core.group(`Cleaning up runDir`, async () => {
await Exec.exec('sudo', ['rm', '-rf', this.runDir], {
@@ -420,7 +429,7 @@ EOF`,
await Exec.exec(logCmd.command, logCmd.args);
});
await core.group('Removing Docker context', async () => {
await Exec.exec('docker', ['context', 'rm', '-f', this.contextName]);
await Docker.exec(['context', 'rm', '-f', this.contextName]);
});
}

View File

@@ -16,13 +16,18 @@
import crypto from 'crypto';
import fs from 'fs';
import he from 'he';
import jsyaml from 'js-yaml';
import os from 'os';
import path from 'path';
import {CreateArtifactRequest, FinalizeArtifactRequest, StringValue} from '@actions/artifact/lib/generated';
import {internalArtifactTwirpClient} from '@actions/artifact/lib/internal/shared/artifact-twirp-client';
import {isGhes} from '@actions/artifact/lib/internal/shared/config';
import {getBackendIdsFromToken} from '@actions/artifact/lib/internal/shared/util';
import {getExpiration} from '@actions/artifact/lib/internal/upload/retention';
import {InvalidResponseError, NetworkError} from '@actions/artifact';
import * as core from '@actions/core';
import {SummaryTableCell} from '@actions/core/lib/summary';
import * as github from '@actions/github';
import {GitHub as Octokit} from '@actions/github/lib/utils';
import {Context} from '@actions/github/lib/context';
@@ -30,7 +35,10 @@ import {TransferProgressEvent} from '@azure/core-http';
import {BlobClient, BlobHTTPHeaders} from '@azure/storage-blob';
import {jwtDecode, JwtPayload} from 'jwt-decode';
import {GitHubActionsRuntimeToken, GitHubActionsRuntimeTokenAC, GitHubRepo, UploadArtifactOpts, UploadArtifactResponse} from './types/github';
import {Util} from './util';
import {VertexWarning} from './types/buildkit/client';
import {BuildSummaryOpts, GitHubActionsRuntimeToken, GitHubActionsRuntimeTokenAC, GitHubRepo, UploadArtifactOpts, UploadArtifactResponse} from './types/github';
export interface GitHubOpts {
token?: string;
@@ -59,8 +67,28 @@ export class GitHub {
return process.env.GITHUB_API_URL || 'https://api.github.com';
}
static get workflowRunURL(): string {
return `${GitHub.serverURL}/${github.context.repo.owner}/${github.context.repo.repo}/actions/runs/${github.context.runId}`;
static get isGHES(): boolean {
// FIXME: we are using the function from GitHub artifact module but should
// be within core module when available.
return isGhes();
}
static get repository(): string {
return `${github.context.repo.owner}/${github.context.repo.repo}`;
}
static get runId(): number {
return process.env.GITHUB_RUN_ID ? +process.env.GITHUB_RUN_ID : github.context.runId;
}
static get runAttempt(): number {
// TODO: runAttempt is not yet part of github.context but will be in a
// future release of @actions/github package: https://github.com/actions/toolkit/commit/faa425440f86f9c16587a19dfb59491253a2c92a
return process.env.GITHUB_RUN_ATTEMPT ? +process.env.GITHUB_RUN_ATTEMPT : 1;
}
public static workflowRunURL(setAttempts?: boolean): string {
return `${GitHub.serverURL}/${GitHub.repository}/actions/runs/${GitHub.runId}${setAttempts ? `/attempts/${GitHub.runAttempt}` : ''}`;
}
static get actionsRuntimeToken(): GitHubActionsRuntimeToken | undefined {
@@ -102,6 +130,10 @@ export class GitHub {
}
public static async uploadArtifact(opts: UploadArtifactOpts): Promise<UploadArtifactResponse> {
if (GitHub.isGHES) {
throw new Error('@actions/artifact v2.0.0+ is currently not supported on GHES.');
}
const artifactName = path.basename(opts.filename);
const backendIds = getBackendIdsFromToken();
const artifactClient = internalArtifactTwirpClient();
@@ -180,7 +212,7 @@ export class GitHub {
const artifactId = BigInt(finalizeArtifactResp.artifactId);
core.info(`Artifact successfully finalized (${artifactId})`);
const artifactURL = `${GitHub.workflowRunURL}/artifacts/${artifactId}`;
const artifactURL = `${GitHub.workflowRunURL()}/artifacts/${artifactId}`;
core.info(`Artifact download URL: ${artifactURL}`);
return {
@@ -190,4 +222,159 @@ export class GitHub {
url: artifactURL
};
}
public static async writeBuildSummary(opts: BuildSummaryOpts): Promise<void> {
// can't use original core.summary.addLink due to the need to make
// EOL optional
const addLink = function (text: string, url: string, addEOL = false): string {
return `<a href="${url}">${text}</a>` + (addEOL ? os.EOL : '');
};
const refsSize = Object.keys(opts.exportRes.refs).length;
const sum = core.summary.addHeading('Docker Build summary', 2);
if (opts.uploadRes) {
// we just need the last two parts of the URL as they are always relative
// to the workflow run URL otherwise URL could be broken if GitHub
// repository name is part of a secret value used in the workflow. e.g.:
// artifact: https://github.com/docker/actions-toolkit/actions/runs/9552208295/artifacts/1609622746
// workflow: https://github.com/docker/actions-toolkit/actions/runs/9552208295
// https://github.com/docker/actions-toolkit/issues/367
const artifactRelativeURL = `./${GitHub.runId}/${opts.uploadRes.url.split('/').slice(-2).join('/')}`;
// prettier-ignore
sum.addRaw(`<p>`)
.addRaw(`For a detailed look at the build, download the following build record archive and import it into Docker Desktop's Builds view. `)
.addBreak()
.addRaw(`Build records include details such as timing, dependencies, results, logs, traces, and other information about a build. `)
.addRaw(addLink('Learn more', 'https://www.docker.com/blog/new-beta-feature-deep-dive-into-github-actions-docker-builds-with-docker-desktop/?utm_source=github&utm_medium=actions'))
.addRaw('</p>')
.addRaw(`<p>`)
.addRaw(`:arrow_down: ${addLink(`<strong>${Util.stringToUnicodeEntities(opts.uploadRes.filename)}</strong>`, artifactRelativeURL)} (${Util.formatFileSize(opts.uploadRes.size)} - includes <strong>${refsSize} build record${refsSize > 1 ? 's' : ''}</strong>)`)
.addRaw(`</p>`);
} else {
// prettier-ignore
sum.addRaw(`<p>`)
.addRaw(`The following table provides a brief summary of your build.`)
.addBreak()
.addRaw(`For a detailed look at the build, including timing, dependencies, results, logs, traces, and other information, consider enabling the export of the build record so you can import it into Docker Desktop's Builds view. `)
.addRaw(addLink('Learn more', 'https://www.docker.com/blog/new-beta-feature-deep-dive-into-github-actions-docker-builds-with-docker-desktop/?utm_source=github&utm_medium=actions'))
.addRaw(`</p>`);
}
// Feedback survey
sum.addRaw(`<p>`).addRaw(`Find this useful? `).addRaw(addLink('Let us know', 'https://docs.docker.com/feedback/gha-build-summary')).addRaw('</p>');
// Preview
sum.addRaw('<p>');
const summaryTableData: Array<Array<SummaryTableCell>> = [
[
{header: true, data: 'ID'},
{header: true, data: 'Name'},
{header: true, data: 'Status'},
{header: true, data: 'Cached'},
{header: true, data: 'Duration'}
]
];
let buildError: string | undefined;
for (const ref in opts.exportRes.summaries) {
if (Object.prototype.hasOwnProperty.call(opts.exportRes.summaries, ref)) {
const summary = opts.exportRes.summaries[ref];
// prettier-ignore
summaryTableData.push([
{data: `<code>${ref.substring(0, 6).toUpperCase()}</code>`},
{data: `<strong>${Util.stringToUnicodeEntities(summary.name)}</strong>`},
{data: `${summary.status === 'completed' ? ':white_check_mark:' : summary.status === 'canceled' ? ':no_entry_sign:' : ':x:'} ${summary.status}`},
{data: `${summary.numCachedSteps > 0 ? Math.round((summary.numCachedSteps / summary.numTotalSteps) * 100) : 0}%`},
{data: summary.duration}
]);
if (summary.error) {
buildError = summary.error;
}
}
}
sum.addTable([...summaryTableData]);
sum.addRaw(`</p>`);
// Build error
if (buildError) {
sum.addRaw(`<blockquote>`);
if (Util.countLines(buildError) > 10) {
// prettier-ignore
sum
.addRaw(`<details><summary><strong>Error</strong></summary>`)
.addCodeBlock(he.encode(buildError), 'text')
.addRaw(`</details>`);
} else {
// prettier-ignore
sum
.addRaw(`<strong>Error</strong>`)
.addBreak()
.addRaw(`<p>`)
.addCodeBlock(he.encode(buildError), 'text')
.addRaw(`</p>`);
}
sum.addRaw(`</blockquote>`);
}
// Build inputs
if (opts.inputs) {
// prettier-ignore
sum.addRaw(`<details><summary><strong>Build inputs</strong></summary>`)
.addCodeBlock(
jsyaml.dump(opts.inputs, {
indent: 2,
lineWidth: -1
}), 'yaml'
)
.addRaw(`</details>`);
}
// Bake definition
if (opts.bakeDefinition) {
// prettier-ignore
sum.addRaw(`<details><summary><strong>Bake definition</strong></summary>`)
.addCodeBlock(JSON.stringify(opts.bakeDefinition, null, 2), 'json')
.addRaw(`</details>`);
}
core.info(`Writing summary`);
await sum.addSeparator().write();
}
public static async annotateBuildWarnings(source: string, warnings?: Array<VertexWarning>): Promise<void> {
(warnings ?? []).forEach(warning => {
if (!warning.detail || !warning.short) {
return;
}
const title = warning.detail.map(encoded => atob(encoded)).join(' ');
let message = atob(warning.short).replace(/\s\(line \d+\)$/, '');
if (warning.url) {
// https://github.com/docker/buildx/blob/d8c9ebde1fdcf659f1fa3efa6ccc27a28b0f1564/commands/build.go#L854
message += `\nMore info: ${warning.url}`;
}
// GitHub annotations don't clearly show ranges of lines, so we'll just
// show the first line
const startLine = warning.range && warning.range.length > 0 ? warning.range[0]?.start.line : undefined;
// TODO: When GitHub annotations support showing ranges properly, we can use this code
// let startLine: number | undefined, endLine: number | undefined;
// for (const range of warning.range ?? []) {
// if (range.start.line && (!startLine || range.start.line < startLine)) {
// startLine = range.start.line;
// }
// if (range.end.line && (!endLine || range.end.line > endLine)) {
// endLine = range.end.line;
// }
// }
core.warning(message, {
title: title,
file: source,
startLine: startLine
});
});
}
}

163
src/oci/oci.ts Normal file
View File

@@ -0,0 +1,163 @@
/**
* Copyright 2024 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 gunzip from 'gunzip-maybe';
import * as path from 'path';
import {Readable} from 'stream';
import * as tar from 'tar-stream';
import {Archive, LoadArchiveOpts} from '../types/oci/oci';
import {Index} from '../types/oci';
import {Manifest} from '../types/oci/manifest';
import {Image} from '../types/oci/config';
import {IMAGE_BLOBS_DIR_V1, IMAGE_INDEX_FILE_V1, IMAGE_LAYOUT_FILE_V1, ImageLayout} from '../types/oci/layout';
import {MEDIATYPE_IMAGE_INDEX_V1, MEDIATYPE_IMAGE_MANIFEST_V1} from '../types/oci/mediatype';
export class OCI {
public static loadArchive(opts: LoadArchiveOpts): Promise<Archive> {
return new Promise<Archive>((resolve, reject) => {
const tarex: tar.Extract = tar.extract();
let rootIndex: Index;
let rootLayout: ImageLayout;
const indexes: Record<string, Index> = {};
const manifests: Record<string, Manifest> = {};
const images: Record<string, Image> = {};
const blobs: Record<string, unknown> = {};
tarex.on('entry', async (header, stream, next) => {
if (header.type === 'file') {
const filename = path.normalize(header.name);
if (filename === IMAGE_INDEX_FILE_V1) {
rootIndex = await OCI.streamToJson<Index>(stream);
} else if (filename === IMAGE_LAYOUT_FILE_V1) {
rootLayout = await OCI.streamToJson<ImageLayout>(stream);
} else if (filename.startsWith(path.join(IMAGE_BLOBS_DIR_V1, path.sep))) {
const blob = await OCI.extractBlob(stream);
const digest = `${filename.split(path.sep)[1]}:${filename.split(path.sep)[filename.split(path.sep).length - 1]}`;
if (OCI.isIndex(blob)) {
indexes[digest] = <Index>JSON.parse(blob);
} else if (OCI.isManifest(blob)) {
manifests[digest] = <Manifest>JSON.parse(blob);
} else if (OCI.isImage(blob)) {
images[digest] = <Image>JSON.parse(blob);
} else {
blobs[digest] = blob;
}
} else {
reject(new Error(`Invalid OCI archive: unexpected file ${filename}`));
}
}
stream.resume();
next();
});
tarex.on('finish', () => {
if (!rootIndex || !rootLayout) {
reject(new Error('Invalid OCI archive: missing index or layout'));
}
resolve({
root: {
index: rootIndex,
layout: rootLayout
},
indexes: indexes,
manifests: manifests,
images: images,
blobs: blobs
} as Archive);
});
tarex.on('error', error => {
reject(error);
});
fs.createReadStream(opts.file).pipe(gunzip()).pipe(tarex);
});
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
private static isIndex(blob: any): boolean {
try {
const index = <Index>JSON.parse(blob);
return index.mediaType === MEDIATYPE_IMAGE_INDEX_V1;
} catch {
return false;
}
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
private static isManifest(blob: any): boolean {
try {
const manifest = <Manifest>JSON.parse(blob);
return manifest.mediaType === MEDIATYPE_IMAGE_MANIFEST_V1 && manifest.layers.length > 0;
} catch {
return false;
}
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
private static isImage(blob: any): boolean {
try {
const image = <Image>JSON.parse(blob);
return image.rootfs.type !== '';
} catch {
return false;
}
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
private static extractBlob(stream: Readable): Promise<any> {
return new Promise<unknown>((resolve, reject) => {
const chunks: Buffer[] = [];
const dstream = stream.pipe(gunzip());
dstream.on('data', chunk => {
chunks.push(chunk);
});
dstream.on('end', () => {
resolve(Buffer.concat(chunks).toString('utf8'));
});
dstream.on('error', async error => {
reject(error);
});
});
}
private static async streamToJson<T>(stream: Readable): Promise<T> {
return new Promise<T>((resolve, reject) => {
const chunks: string[] = [];
let bytes = 0;
stream.on('data', chunk => {
bytes += chunk.length;
if (bytes <= 2 * 1024 * 1024) {
chunks.push(chunk.toString('utf8'));
} else {
reject(new Error('The data stream exceeds the size limit for JSON parsing.'));
}
});
stream.on('end', () => {
try {
resolve(JSON.parse(chunks.join('')));
} catch (error) {
reject(error);
}
});
stream.on('error', async error => {
reject(error);
});
});
}
}

View File

@@ -15,8 +15,9 @@
*/
import {Buildx} from './buildx/buildx';
import {Build as BuildxBuild} from './buildx/build';
import {Bake as BuildxBake} from './buildx/bake';
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';
@@ -32,16 +33,18 @@ export interface ToolkitOpts {
export class Toolkit {
public github: GitHub;
public buildx: Buildx;
public buildxBuild: BuildxBuild;
public buildxBake: BuildxBake;
public buildxInstall: BuildxInstall;
public bake: Bake;
public builder: Builder;
public buildkit: BuildKit;
constructor(opts: ToolkitOpts = {}) {
this.github = new GitHub({token: opts.githubToken});
this.buildx = new Buildx();
this.buildxBuild = new BuildxBuild({buildx: this.buildx});
this.buildxBake = new BuildxBake({buildx: this.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});
}

View File

@@ -0,0 +1,18 @@
/**
* Copyright 2024 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/moby/buildkit/blob/v0.14.0/solver/llbsolver/history.go#L672
export const MEDIATYPE_STATUS_V0 = 'application/vnd.buildkit.status.v0';

View File

@@ -0,0 +1,78 @@
/**
* Copyright 2024 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 {Digest} from '../oci/digest';
import {ProgressGroup, Range, SourceInfo} from './ops';
// https://github.com/moby/buildkit/blob/v0.14.0/client/graph.go#L10-L19
export interface Vertex {
digest?: Digest;
inputs?: Array<Digest>;
name?: string;
started?: Date;
completed?: Date;
cached?: boolean;
error?: string;
progressGroup?: ProgressGroup;
}
// https://github.com/moby/buildkit/blob/v0.14.0/client/graph.go#L21-L30
export interface VertexStatus {
id: string;
vertex?: Digest;
name?: string;
total?: number;
current: number;
timestamp?: Date;
started?: Date;
completed?: Date;
}
// https://github.com/moby/buildkit/blob/v0.14.0/client/graph.go#L32-L37
export interface VertexLog {
vertex?: Digest;
stream?: number;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
data: any;
timestamp: Date;
}
// https://github.com/moby/buildkit/blob/v0.14.0/client/graph.go#L39-L48
export interface VertexWarning {
vertex?: Digest;
level?: number;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
short?: any;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
detail?: Array<any>;
url?: string;
sourceInfo?: SourceInfo;
range?: Array<Range>;
}
// https://github.com/moby/buildkit/blob/v0.14.0/client/graph.go#L50-L55
export interface SolveStatus {
vertexes?: Array<Vertex>;
statuses?: Array<VertexStatus>;
logs?: Array<VertexLog>;
warnings?: Array<VertexWarning>;
}
// https://github.com/moby/buildkit/blob/v0.14.0/client/graph.go#L57-L60
export interface SolveResponse {
exporterResponse: Record<string, string>;
}

View File

@@ -0,0 +1,108 @@
/**
* Copyright 2024 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 {Descriptor} from '../oci/descriptor';
import {Digest} from '../oci/digest';
import {ProgressGroup, Range, SourceInfo} from './ops';
import {RpcStatus} from './rpc';
// https://github.com/moby/buildkit/blob/v0.14.0/api/services/control/control.pb.go#L1504-L1525
export interface BuildHistoryRecord {
Ref: string;
Frontend: string;
FrontendAttrs: Record<string, string>;
Exporters: Array<Exporter>;
error?: RpcStatus;
CreatedAt?: Date;
CompletedAt?: Date;
logs?: Descriptor;
ExporterResponse: Record<string, string>;
Result?: BuildResultInfo;
Results: Record<string, BuildResultInfo>;
Generation: number;
trace?: Descriptor;
pinned: boolean;
numCachedSteps: number;
numTotalSteps: number;
numCompletedSteps: number;
}
// https://github.com/moby/buildkit/blob/v0.14.0/api/services/control/control.pb.go#L1909-L1917
export interface Exporter {
Type: string;
Attrs: Record<string, string>;
}
// https://github.com/moby/buildkit/blob/v0.14.0/api/services/control/control.pb.go#L1845-L1852
export interface BuildResultInfo {
ResultDeprecated?: Descriptor;
Attestations?: Array<Descriptor>;
Results?: Record<number, Descriptor>;
}
// https://github.com/moby/buildkit/blob/v0.14.0/api/services/control/control.pb.go#L751-L759
export interface StatusResponse {
vertexes?: Array<Vertex>;
statuses?: Array<VertexStatus>;
logs?: Array<VertexLog>;
warnings?: Array<VertexWarning>;
}
// https://github.com/moby/buildkit/blob/v0.14.0/api/services/control/control.pb.go#L822-L834
export interface Vertex {
digest: Digest;
inputs: Array<Digest>;
name?: string;
cached?: boolean;
started?: Date;
completed?: Date;
error?: string;
progressGroup?: ProgressGroup;
}
// https://github.com/moby/buildkit/blob/v0.14.0/api/services/control/control.pb.go#L911-L923
export interface VertexStatus {
ID?: string;
vertex: Digest;
name?: string;
current?: number;
total?: number;
timestamp: Date;
started?: Date;
completed?: Date;
}
// https://github.com/moby/buildkit/blob/v0.14.0/api/services/control/control.pb.go#L1007-L1015
export interface VertexLog {
vertex: Digest;
timestamp: Date;
stream?: number;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
msg?: any;
}
// https://github.com/moby/buildkit/blob/v0.14.0/api/services/control/control.pb.go#L1071-L1082
export interface VertexWarning {
vertex: Digest;
level?: number;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
short?: any;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
detail?: Array<any>;
url?: string;
info?: SourceInfo;
ranges?: Array<Range>;
}

44
src/types/buildkit/git.ts Normal file
View File

@@ -0,0 +1,44 @@
/**
* Copyright 2024 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 GitURL {
scheme: string;
host: string;
path: string;
user?: URLUserInfo;
fragment?: GitURLFragment;
remote: string;
}
export interface GitURLFragment {
ref: string;
subdir: string;
}
export interface GitRef {
remote?: string;
shortName?: string;
commit?: string;
subDir?: string;
indistinguishableFromLocal?: boolean;
unencryptedTCP?: boolean;
}
export interface URLUserInfo {
username: string;
password: string;
passwordSet: boolean;
}

82
src/types/buildkit/ops.ts Normal file
View File

@@ -0,0 +1,82 @@
/**
* Copyright 2024 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/moby/buildkit/blob/v0.14.0/solver/pb/ops.pb.go#L1901-L1909
export interface Definition {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
def?: Array<any>;
metadata: Record<string, OpMetadata>;
Source?: Source;
}
// https://github.com/moby/buildkit/blob/v0.14.0/solver/pb/ops.pb.go#L1313-L1323
export interface OpMetadata {
ignore_cache?: boolean;
description?: Record<string, string>;
export_cache?: ExportCache;
caps: Record<string, boolean>;
progress_group?: ProgressGroup;
}
// https://github.com/moby/buildkit/blob/v0.14.0/solver/pb/ops.pb.go#L1390-L1393
export interface Source {
locations?: Record<string, Locations>;
infos?: Array<SourceInfo>;
}
// https://github.com/moby/buildkit/blob/v0.14.0/solver/pb/ops.pb.go#L1439-L1441
export interface Locations {
locations?: Array<Location>;
}
// https://github.com/moby/buildkit/blob/v0.14.0/solver/pb/ops.pb.go#L1545-L1548
export interface Location {
sourceIndex?: number;
ranges?: Array<Range>;
}
// https://github.com/moby/buildkit/blob/v0.14.0/solver/pb/ops.pb.go#L1594-L1597
export interface Range {
start: Position;
end: Position;
}
// https://github.com/moby/buildkit/blob/v0.14.0/solver/pb/ops.pb.go#L1643-L1646
export interface Position {
line: number;
character: number;
}
// https://github.com/moby/buildkit/blob/v0.14.0/solver/pb/ops.pb.go#L1480-L1485
export interface SourceInfo {
filename?: string;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
data?: any;
definition?: Definition;
language?: string;
}
// https://github.com/moby/buildkit/blob/v0.14.0/solver/pb/ops.pb.go#L1691-L1693
export interface ExportCache {
Value?: boolean;
}
// https://github.com/moby/buildkit/blob/v0.14.0/solver/pb/ops.pb.go#L1731-L1735
export interface ProgressGroup {
id?: string;
name?: string;
weak?: boolean;
}

31
src/types/buildkit/rpc.ts Normal file
View File

@@ -0,0 +1,31 @@
/**
* Copyright 2024 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/moby/buildkit/blob/v0.14.0/vendor/github.com/gogo/googleapis/google/rpc/status.pb.go#L36-L49
export interface RpcStatus {
code: number;
message: string;
details: Array<RpcAny>;
}
// https://github.com/moby/buildkit/blob/v0.14.0/vendor/github.com/gogo/protobuf/types/any.pb.go#L108-L143
// Define properties based on google.protobuf.Any. For simplicity, assuming it
// has at least a type_url and a value.
export interface RpcAny {
type_url: string;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
value: any;
}

View File

@@ -19,10 +19,6 @@ export interface BakeDefinition {
target: Record<string, Target>;
}
export interface BakeMetadata {
[target: string]: Record<string, string>;
}
export interface Group {
targets: Array<string>;
}

View File

@@ -15,5 +15,6 @@
*/
export type BuildMetadata = {
[key: string]: string;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[key: string]: any;
};

View File

@@ -0,0 +1,44 @@
/**
* Copyright 2024 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 ExportRecordOpts {
refs: Array<string>;
image?: string;
}
export interface ExportRecordResponse {
dockerbuildFilename: string;
dockerbuildSize: number;
summaries: Summaries;
builderName: string;
nodeName: string;
refs: Array<string>;
}
export interface Summaries {
[ref: string]: RecordSummary;
}
export interface RecordSummary {
name: string;
status: string;
duration: string;
numCachedSteps: number;
numTotalSteps: number;
numCompletedSteps: number;
frontendAttrs: Record<string, string>;
error?: string;
}

View File

@@ -64,3 +64,33 @@ export interface AuthConfig {
identitytoken?: string;
registrytoken?: string;
}
export interface ContextInfo {
Name: string;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
Metadata: any;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
Endpoints: Record<string, EndpointInfo>;
TLSMaterial: Record<string, Array<string>>;
Storage: StorageInfo;
}
export interface EndpointInfo {
Host?: string;
SkipVerify: boolean;
TLSData?: TLSData;
}
export interface TLSData {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
CA: any;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
Key: any;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
Cert: any;
}
export interface StorageInfo {
MetadataPath: string;
TLSPath: string;
}

View File

@@ -17,6 +17,9 @@
import {components as OctoOpenApiTypes} from '@octokit/openapi-types';
import {JwtPayload} from 'jwt-decode';
import {BakeDefinition} from './buildx/bake';
import {ExportRecordResponse} from './buildx/history';
export interface GitHubRelease {
id: number;
tag_name: string;
@@ -47,3 +50,11 @@ export interface UploadArtifactResponse {
size: number;
url: string;
}
export interface BuildSummaryOpts {
exportRes: ExportRecordResponse;
uploadRes?: UploadArtifactResponse;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
inputs?: any;
bakeDefinition?: BakeDefinition;
}

View File

@@ -0,0 +1,20 @@
/**
* Copyright 2024 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/in-toto/in-toto-golang/blob/dd6278764ab1dae7301609c7510129888e2fd569/in_toto/envelope.go#L17
export const MEDIATYPE_PAYLOAD = 'application/vnd.in-toto+json';
export const MEDIATYPE_PREDICATE = 'in-toto.io/predicate-type';

View File

@@ -0,0 +1,69 @@
/**
* Copyright 2024 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/in-toto/in-toto-golang/blob/master/in_toto/slsa_provenance/v0.2/provenance.go
export const PREDICATE_SLSA_PROVENANCE = 'https://slsa.dev/provenance/v0.2';
export interface ProvenancePredicate {
builder: ProvenanceBuilder;
buildType: string;
invocation?: ProvenanceInvocation;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
buildConfig?: any;
metadata: ProvenanceMetadata;
materials?: Material[];
}
export interface ProvenanceBuilder {
id: string;
}
export interface ProvenanceInvocation {
configSource?: ConfigSource;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
parameters?: any;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
environment?: any;
}
export interface DigestSet {
[key: string]: string;
}
export interface ConfigSource {
uri?: string;
digest?: DigestSet;
entryPoint?: string;
}
export interface Completeness {
parameters?: boolean;
environment?: boolean;
materials?: boolean;
}
export interface ProvenanceMetadata {
buildInvocationId?: string;
buildStartedOn?: string;
completeness?: Completeness;
reproducible?: boolean;
}
export interface Material {
uri: string;
digest: DigestSet;
}

52
src/types/oci/config.ts Normal file
View File

@@ -0,0 +1,52 @@
/**
* Copyright 2024 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 {Digest} from './digest';
import {Platform} from './descriptor';
export interface ImageConfig {
User?: string;
ExposedPorts?: Record<string, unknown>;
Env?: string[];
Entrypoint?: string[];
Cmd?: string[];
Volumes?: Record<string, unknown>;
WorkingDir?: string;
Labels?: Record<string, string>;
StopSignal?: string;
ArgsEscaped?: boolean;
}
export interface RootFS {
type: string;
diff_ids: Digest[];
}
export interface History {
created?: string; // assuming RFC 3339 formatted string
created_by?: string;
author?: string;
comment?: string;
empty_layer?: boolean;
}
export interface Image extends Platform {
created?: string; // assuming RFC 3339 formatted string
author?: string;
config?: ImageConfig;
rootfs: RootFS;
history?: History[];
}

View File

@@ -0,0 +1,45 @@
/**
* Copyright 2024 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 {Digest} from './digest';
import {MEDIATYPE_EMPTY_JSON_V1} from './mediatype';
export interface Descriptor {
mediaType: string;
digest: Digest;
size: number;
urls?: string[];
annotations?: Record<string, string>;
data?: string;
platform?: Platform;
artifactType?: string;
}
export interface Platform {
architecture: string;
os: string;
'os.version'?: string;
'os.features'?: string[];
variant?: string;
}
export const DescriptorEmptyJSON: Descriptor = {
mediaType: MEDIATYPE_EMPTY_JSON_V1,
digest: 'sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a',
size: 2,
data: '{}'
};

17
src/types/oci/digest.ts Normal file
View File

@@ -0,0 +1,17 @@
/**
* Copyright 2024 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 type Digest = string;

26
src/types/oci/index.ts Normal file
View File

@@ -0,0 +1,26 @@
/**
* Copyright 2024 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 {Versioned} from './versioned';
import {Descriptor} from './descriptor';
export interface Index extends Versioned {
mediaType?: string;
artifactType?: string;
manifests: Descriptor[];
subject?: Descriptor;
annotations?: Record<string, string>;
}

27
src/types/oci/layout.ts Normal file
View File

@@ -0,0 +1,27 @@
/**
* Copyright 2024 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 const IMAGE_LAYOUT_FILE_V1 = 'oci-layout';
export const IMAGE_LAYOUT_VERSION_V1 = '1.0.0';
export const IMAGE_INDEX_FILE_V1 = 'index.json';
export const IMAGE_BLOBS_DIR_V1 = 'blobs';
export interface ImageLayout {
version: string;
}

27
src/types/oci/manifest.ts Normal file
View File

@@ -0,0 +1,27 @@
/**
* Copyright 2024 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 {Descriptor} from './descriptor';
import {Versioned} from './versioned';
export interface Manifest extends Versioned {
mediaType?: string;
artifactType?: string;
config: Descriptor;
layers: Descriptor[];
subject?: Descriptor;
annotations?: Record<string, string>;
}

View File

@@ -0,0 +1,25 @@
/**
* Copyright 2024 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 const MEDIATYPE_DESCRIPTOR_V1 = 'application/vnd.oci.descriptor.v1+json';
export const MEDIATYPE_IMAGE_MANIFEST_V1 = 'application/vnd.oci.image.manifest.v1+json';
export const MEDIATYPE_IMAGE_INDEX_V1 = 'application/vnd.oci.image.index.v1+json';
export const MEDIATYPE_IMAGE_LAYER_V1 = 'application/vnd.oci.image.layer.v1.tar';
export const MEDIATYPE_EMPTY_JSON_V1 = 'application/vnd.oci.empty.v1+json';

Some files were not shown because too many files have changed in this diff Show More