Compare commits
38 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b732db2937 | ||
|
|
8696544f14 | ||
|
|
d92ed04680 | ||
|
|
3bb4ae38ea | ||
|
|
09c0f6a78e | ||
|
|
3c25c1eed2 | ||
|
|
ee671ae33e | ||
|
|
960acb25ae | ||
|
|
1ff078d955 | ||
|
|
abe7883e9a | ||
|
|
c16b4fdf35 | ||
|
|
211c9b2312 | ||
|
|
a30e0f51eb | ||
|
|
61c3c53dbf | ||
|
|
91a5724116 | ||
|
|
9998df7a3d | ||
|
|
3d448bd483 | ||
|
|
51cc1b5526 | ||
|
|
58584e3d97 | ||
|
|
f06e39e022 | ||
|
|
4c705618e1 | ||
|
|
1ebb922e84 | ||
|
|
9e446b0b90 | ||
|
|
d682d6d4a5 | ||
|
|
ca5ab569e5 | ||
|
|
5b2d914820 | ||
|
|
b873721f89 | ||
|
|
c975cd6494 | ||
|
|
a0a3952b2d | ||
|
|
4af1413de8 | ||
|
|
83a4cb6e7f | ||
|
|
9edbb73678 | ||
|
|
6fc9119f7e | ||
|
|
b2caa9ae45 | ||
|
|
80446a55b4 | ||
|
|
c7c816aa2f | ||
|
|
3f87521aad | ||
|
|
c186677904 |
502
.github/buildx-releases.json
vendored
502
.github/buildx-releases.json
vendored
@@ -1,150 +1,372 @@
|
|||||||
{
|
{
|
||||||
"latest": {
|
"latest": {
|
||||||
"id": 280887108,
|
"id": 293153745,
|
||||||
"tag_name": "v0.31.1",
|
"tag_name": "v0.32.1",
|
||||||
"html_url": "https://github.com/docker/buildx/releases/tag/v0.31.1",
|
"html_url": "https://github.com/docker/buildx/releases/tag/v0.32.1",
|
||||||
"assets": [
|
"assets": [
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.darwin-amd64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.darwin-amd64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.darwin-amd64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.darwin-amd64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.darwin-amd64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.darwin-amd64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.darwin-arm64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.darwin-arm64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.darwin-arm64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.darwin-arm64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.darwin-arm64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.darwin-arm64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.freebsd-amd64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-amd64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.freebsd-amd64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-amd64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.freebsd-amd64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-amd64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.freebsd-amd64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-amd64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.freebsd-arm64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-arm64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.freebsd-arm64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-arm64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.freebsd-arm64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-arm64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.freebsd-arm64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-arm64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-amd64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-amd64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-amd64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-amd64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-amd64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-amd64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-amd64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-amd64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-arm-v6",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v6",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-arm-v6.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v6.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-arm-v6.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v6.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-arm-v6.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v6.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-arm-v7",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v7",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-arm-v7.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v7.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-arm-v7.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v7.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-arm-v7.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v7.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-arm64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-arm64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-arm64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-arm64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-ppc64le",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-ppc64le",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-ppc64le.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-ppc64le.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-ppc64le.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-ppc64le.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-ppc64le.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-ppc64le.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-riscv64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-riscv64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-riscv64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-riscv64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-riscv64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-riscv64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-riscv64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-riscv64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-s390x",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-s390x",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-s390x.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-s390x.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-s390x.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-s390x.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.linux-s390x.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-s390x.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.netbsd-amd64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-amd64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.netbsd-amd64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-amd64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.netbsd-amd64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-amd64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.netbsd-amd64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-amd64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.netbsd-arm64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-arm64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.netbsd-arm64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-arm64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.netbsd-arm64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-arm64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.netbsd-arm64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-arm64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.openbsd-amd64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-amd64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.openbsd-amd64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-amd64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.openbsd-amd64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-amd64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.openbsd-amd64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-amd64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.openbsd-arm64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-arm64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.openbsd-arm64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-arm64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.openbsd-arm64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-arm64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.openbsd-arm64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-arm64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.windows-amd64.exe",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-amd64.exe",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.windows-amd64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-amd64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.windows-amd64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-amd64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.windows-amd64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-amd64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.windows-arm64.exe",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-arm64.exe",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.windows-arm64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-arm64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.windows-arm64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-arm64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/buildx-v0.31.1.windows-arm64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-arm64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.31.1/checksums.txt"
|
"https://github.com/docker/buildx/releases/download/v0.32.1/checksums.txt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"v0.32.1": {
|
||||||
|
"id": 293153745,
|
||||||
|
"tag_name": "v0.32.1",
|
||||||
|
"html_url": "https://github.com/docker/buildx/releases/tag/v0.32.1",
|
||||||
|
"assets": [
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.darwin-amd64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.darwin-amd64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.darwin-amd64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.darwin-arm64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.darwin-arm64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.darwin-arm64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-amd64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-amd64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-amd64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-amd64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-arm64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-arm64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-arm64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-arm64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-amd64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-amd64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-amd64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-amd64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v6",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v6.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v6.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v6.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v7",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v7.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v7.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v7.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-ppc64le",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-ppc64le.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-ppc64le.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-ppc64le.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-riscv64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-riscv64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-riscv64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-riscv64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-s390x",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-s390x.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-s390x.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-s390x.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-amd64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-amd64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-amd64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-amd64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-arm64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-arm64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-arm64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-arm64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-amd64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-amd64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-amd64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-amd64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-arm64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-arm64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-arm64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-arm64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-amd64.exe",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-amd64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-amd64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-amd64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-arm64.exe",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-arm64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-arm64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-arm64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.1/checksums.txt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"v0.32.0": {
|
||||||
|
"id": 292739715,
|
||||||
|
"tag_name": "v0.32.0",
|
||||||
|
"html_url": "https://github.com/docker/buildx/releases/tag/v0.32.0",
|
||||||
|
"assets": [
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.darwin-amd64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.darwin-amd64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.darwin-amd64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.darwin-arm64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.darwin-arm64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.darwin-arm64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.freebsd-amd64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.freebsd-amd64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.freebsd-amd64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.freebsd-amd64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.freebsd-arm64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.freebsd-arm64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.freebsd-arm64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.freebsd-arm64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-amd64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-amd64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-amd64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-amd64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-arm-v6",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-arm-v6.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-arm-v6.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-arm-v6.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-arm-v7",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-arm-v7.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-arm-v7.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-arm-v7.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-arm64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-arm64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-arm64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-arm64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-ppc64le",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-ppc64le.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-ppc64le.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-ppc64le.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-riscv64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-riscv64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-riscv64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-riscv64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-s390x",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-s390x.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-s390x.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.linux-s390x.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.netbsd-amd64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.netbsd-amd64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.netbsd-amd64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.netbsd-amd64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.netbsd-arm64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.netbsd-arm64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.netbsd-arm64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.netbsd-arm64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.openbsd-amd64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.openbsd-amd64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.openbsd-amd64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.openbsd-amd64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.openbsd-arm64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.openbsd-arm64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.openbsd-arm64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.openbsd-arm64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.windows-amd64.exe",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.windows-amd64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.windows-amd64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.windows-amd64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.windows-arm64.exe",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.windows-arm64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.windows-arm64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/buildx-v0.32.0.windows-arm64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0/checksums.txt"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"edge": {
|
"edge": {
|
||||||
"id": 290111799,
|
"id": 293153745,
|
||||||
"tag_name": "v0.32.0-rc1",
|
"tag_name": "v0.32.1",
|
||||||
"html_url": "https://github.com/docker/buildx/releases/tag/v0.32.0-rc1",
|
"html_url": "https://github.com/docker/buildx/releases/tag/v0.32.1",
|
||||||
"assets": [
|
"assets": [
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.darwin-amd64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.darwin-amd64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.darwin-amd64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.darwin-amd64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.darwin-amd64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.darwin-amd64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.darwin-arm64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.darwin-arm64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.darwin-arm64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.darwin-arm64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.darwin-arm64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.darwin-arm64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.freebsd-amd64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-amd64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.freebsd-amd64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-amd64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.freebsd-amd64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-amd64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.freebsd-amd64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-amd64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.freebsd-arm64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-arm64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.freebsd-arm64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-arm64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.freebsd-arm64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-arm64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.freebsd-arm64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.freebsd-arm64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-amd64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-amd64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-amd64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-amd64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-amd64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-amd64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-amd64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-amd64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-arm-v6",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v6",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-arm-v6.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v6.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-arm-v6.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v6.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-arm-v6.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v6.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-arm-v7",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v7",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-arm-v7.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v7.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-arm-v7.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v7.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-arm-v7.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm-v7.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-arm64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-arm64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-arm64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-arm64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-arm64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-ppc64le",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-ppc64le",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-ppc64le.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-ppc64le.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-ppc64le.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-ppc64le.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-ppc64le.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-ppc64le.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-riscv64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-riscv64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-riscv64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-riscv64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-riscv64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-riscv64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-riscv64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-riscv64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-s390x",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-s390x",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-s390x.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-s390x.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-s390x.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-s390x.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.linux-s390x.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.linux-s390x.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.netbsd-amd64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-amd64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.netbsd-amd64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-amd64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.netbsd-amd64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-amd64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.netbsd-amd64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-amd64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.netbsd-arm64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-arm64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.netbsd-arm64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-arm64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.netbsd-arm64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-arm64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.netbsd-arm64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.netbsd-arm64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.openbsd-amd64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-amd64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.openbsd-amd64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-amd64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.openbsd-amd64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-amd64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.openbsd-amd64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-amd64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.openbsd-arm64",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-arm64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.openbsd-arm64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-arm64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.openbsd-arm64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-arm64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.openbsd-arm64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.openbsd-arm64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.windows-amd64.exe",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-amd64.exe",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.windows-amd64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-amd64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.windows-amd64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-amd64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.windows-amd64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-amd64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.windows-arm64.exe",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-arm64.exe",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.windows-arm64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-arm64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.windows-arm64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-arm64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/buildx-v0.32.0-rc1.windows-arm64.sigstore.json",
|
"https://github.com/docker/buildx/releases/download/v0.32.1/buildx-v0.32.1.windows-arm64.sigstore.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.32.0-rc1/checksums.txt"
|
"https://github.com/docker/buildx/releases/download/v0.32.1/checksums.txt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"v0.32.0-rc2": {
|
||||||
|
"id": 291436359,
|
||||||
|
"tag_name": "v0.32.0-rc2",
|
||||||
|
"html_url": "https://github.com/docker/buildx/releases/tag/v0.32.0-rc2",
|
||||||
|
"assets": [
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.darwin-amd64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.darwin-amd64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.darwin-amd64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.darwin-arm64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.darwin-arm64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.darwin-arm64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.freebsd-amd64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.freebsd-amd64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.freebsd-amd64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.freebsd-amd64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.freebsd-arm64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.freebsd-arm64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.freebsd-arm64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.freebsd-arm64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-amd64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-amd64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-amd64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-amd64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-arm-v6",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-arm-v6.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-arm-v6.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-arm-v6.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-arm-v7",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-arm-v7.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-arm-v7.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-arm-v7.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-arm64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-arm64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-arm64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-arm64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-ppc64le",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-ppc64le.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-ppc64le.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-ppc64le.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-riscv64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-riscv64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-riscv64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-riscv64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-s390x",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-s390x.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-s390x.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.linux-s390x.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.netbsd-amd64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.netbsd-amd64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.netbsd-amd64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.netbsd-amd64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.netbsd-arm64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.netbsd-arm64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.netbsd-arm64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.netbsd-arm64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.openbsd-amd64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.openbsd-amd64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.openbsd-amd64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.openbsd-amd64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.openbsd-arm64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.openbsd-arm64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.openbsd-arm64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.openbsd-arm64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.windows-amd64.exe",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.windows-amd64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.windows-amd64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.windows-amd64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.windows-arm64.exe",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.windows-arm64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.windows-arm64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/buildx-v0.32.0-rc2.windows-arm64.sigstore.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.32.0-rc2/checksums.txt"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"v0.32.0-rc1": {
|
"v0.32.0-rc1": {
|
||||||
|
|||||||
30
.github/docker-releases.json
vendored
30
.github/docker-releases.json
vendored
@@ -1,8 +1,26 @@
|
|||||||
{
|
{
|
||||||
"latest": {
|
"latest": {
|
||||||
"id": 282275652,
|
"id": 293527283,
|
||||||
"tag_name": "docker-v29.2.1",
|
"tag_name": "docker-v29.3.0",
|
||||||
"html_url": "https://github.com/moby/moby/releases/tag/docker-v29.2.1",
|
"html_url": "https://github.com/moby/moby/releases/tag/docker-v29.3.0",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v29.3.0": {
|
||||||
|
"id": 293527283,
|
||||||
|
"tag_name": "docker-v29.3.0",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/docker-v29.3.0",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"edge": {
|
||||||
|
"id": 293527283,
|
||||||
|
"tag_name": "docker-v29.3.0",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/docker-v29.3.0",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v29.3.0-rc.1": {
|
||||||
|
"id": 291481223,
|
||||||
|
"tag_name": "docker-v29.3.0-rc.1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/docker-v29.3.0-rc.1",
|
||||||
"assets": []
|
"assets": []
|
||||||
},
|
},
|
||||||
"v29.2.1": {
|
"v29.2.1": {
|
||||||
@@ -17,12 +35,6 @@
|
|||||||
"html_url": "https://github.com/moby/moby/releases/tag/docker-v29.2.0",
|
"html_url": "https://github.com/moby/moby/releases/tag/docker-v29.2.0",
|
||||||
"assets": []
|
"assets": []
|
||||||
},
|
},
|
||||||
"edge": {
|
|
||||||
"id": 282275652,
|
|
||||||
"tag_name": "docker-v29.2.1",
|
|
||||||
"html_url": "https://github.com/moby/moby/releases/tag/docker-v29.2.1",
|
|
||||||
"assets": []
|
|
||||||
},
|
|
||||||
"v29.2.0-rc.2": {
|
"v29.2.0-rc.2": {
|
||||||
"id": 277933908,
|
"id": 277933908,
|
||||||
"tag_name": "docker-v29.2.0-rc.2",
|
"tag_name": "docker-v29.2.0-rc.2",
|
||||||
|
|||||||
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@@ -24,7 +24,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
-
|
-
|
||||||
name: Build
|
name: Build
|
||||||
uses: docker/bake-action@v6
|
uses: docker/bake-action@v7
|
||||||
with:
|
with:
|
||||||
targets: build
|
targets: build
|
||||||
env:
|
env:
|
||||||
|
|||||||
2
.github/workflows/codeql.yml
vendored
2
.github/workflows/codeql.yml
vendored
@@ -12,7 +12,7 @@ permissions:
|
|||||||
security-events: write
|
security-events: write
|
||||||
|
|
||||||
env:
|
env:
|
||||||
NODE_VERSION: 20
|
NODE_VERSION: "24"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
analyze:
|
analyze:
|
||||||
|
|||||||
2
.github/workflows/publish.yml
vendored
2
.github/workflows/publish.yml
vendored
@@ -14,7 +14,7 @@ on:
|
|||||||
- 'v*'
|
- 'v*'
|
||||||
|
|
||||||
env:
|
env:
|
||||||
NODE_VERSION: "24" # at least Node 24 is required for Trusted Publishing with OIDC
|
NODE_VERSION: "24"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish:
|
publish:
|
||||||
|
|||||||
14
.github/workflows/test.yml
vendored
14
.github/workflows/test.yml
vendored
@@ -14,9 +14,9 @@ on:
|
|||||||
- '.github/*-releases.json'
|
- '.github/*-releases.json'
|
||||||
|
|
||||||
env:
|
env:
|
||||||
NODE_VERSION: "20"
|
NODE_VERSION: "24"
|
||||||
BUILDX_VERSION: "v0.32.0-rc1"
|
BUILDX_VERSION: "v0.32.1"
|
||||||
BUILDKIT_IMAGE: "moby/buildkit:v0.28.0-rc1"
|
BUILDKIT_IMAGE: "moby/buildkit:v0.28.0"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
@@ -36,7 +36,7 @@ jobs:
|
|||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v6
|
||||||
-
|
-
|
||||||
name: Test
|
name: Test
|
||||||
uses: docker/bake-action@v6
|
uses: docker/bake-action@v7
|
||||||
with:
|
with:
|
||||||
source: .
|
source: .
|
||||||
targets: test-coverage
|
targets: test-coverage
|
||||||
@@ -156,7 +156,7 @@ jobs:
|
|||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v6
|
||||||
-
|
-
|
||||||
name: Expose GitHub Runtime
|
name: Expose GitHub Runtime
|
||||||
uses: crazy-max/ghaction-github-runtime@v3
|
uses: crazy-max/ghaction-github-runtime@v4
|
||||||
-
|
-
|
||||||
# FIXME: Needs to setup node twice on Windows: https://github.com/actions/setup-node/issues/1357#issuecomment-3254613964
|
# FIXME: Needs to setup node twice on Windows: https://github.com/actions/setup-node/issues/1357#issuecomment-3254613964
|
||||||
name: Setup Node
|
name: Setup Node
|
||||||
@@ -179,7 +179,7 @@ jobs:
|
|||||||
-
|
-
|
||||||
name: Set up Docker Buildx
|
name: Set up Docker Buildx
|
||||||
if: startsWith(matrix.os, 'ubuntu')
|
if: startsWith(matrix.os, 'ubuntu')
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v4
|
||||||
with:
|
with:
|
||||||
version: ${{ env.BUILDX_VERSION }}
|
version: ${{ env.BUILDX_VERSION }}
|
||||||
driver: docker
|
driver: docker
|
||||||
@@ -187,7 +187,7 @@ jobs:
|
|||||||
name: Set up container builder
|
name: Set up container builder
|
||||||
if: startsWith(matrix.os, 'ubuntu')
|
if: startsWith(matrix.os, 'ubuntu')
|
||||||
id: builder
|
id: builder
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v4
|
||||||
with:
|
with:
|
||||||
version: ${{ env.BUILDX_VERSION }}
|
version: ${{ env.BUILDX_VERSION }}
|
||||||
driver-opts: image=${{ env.BUILDKIT_IMAGE }}
|
driver-opts: image=${{ env.BUILDKIT_IMAGE }}
|
||||||
|
|||||||
10
.github/workflows/validate.yml
vendored
10
.github/workflows/validate.yml
vendored
@@ -17,15 +17,15 @@ jobs:
|
|||||||
prepare:
|
prepare:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
outputs:
|
outputs:
|
||||||
targets: ${{ steps.generate.outputs.targets }}
|
matrix: ${{ steps.generate.outputs.matrix }}
|
||||||
steps:
|
steps:
|
||||||
-
|
-
|
||||||
name: Checkout
|
name: Checkout
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v6
|
||||||
-
|
-
|
||||||
name: List targets
|
name: Generate matrix
|
||||||
id: generate
|
id: generate
|
||||||
uses: docker/bake-action/subaction/list-targets@v6
|
uses: docker/bake-action/subaction/matrix@v7
|
||||||
with:
|
with:
|
||||||
target: validate
|
target: validate
|
||||||
|
|
||||||
@@ -36,10 +36,10 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
target: ${{ fromJson(needs.prepare.outputs.targets) }}
|
include: ${{ fromJson(needs.prepare.outputs.matrix) }}
|
||||||
steps:
|
steps:
|
||||||
-
|
-
|
||||||
name: Validate
|
name: Validate
|
||||||
uses: docker/bake-action@v6
|
uses: docker/bake-action@v7
|
||||||
with:
|
with:
|
||||||
targets: ${{ matrix.target }}
|
targets: ${{ matrix.target }}
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ describe('satisfies', () => {
|
|||||||
test.each([
|
test.each([
|
||||||
['builder2', '>=0.10.0', true],
|
['builder2', '>=0.10.0', true],
|
||||||
['builder2', '>0.11.0', false]
|
['builder2', '>0.11.0', false]
|
||||||
])('given %p', async (builderName, range, expected) => {
|
])('given %o', async (builderName, range, expected) => {
|
||||||
const buildkit = new BuildKit();
|
const buildkit = new BuildKit();
|
||||||
expect(await buildkit.versionSatisfies(builderName, range)).toBe(expected);
|
expect(await buildkit.versionSatisfies(builderName, range)).toBe(expected);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ describe('resolve', () => {
|
|||||||
`,
|
`,
|
||||||
null
|
null
|
||||||
]
|
]
|
||||||
])('given %p config', async (val: string, file: boolean, exValue: string, error: Error | null) => {
|
])('given %o config', async (val: string, file: boolean, exValue: string, error: Error | null) => {
|
||||||
try {
|
try {
|
||||||
const buildkit = new BuildKit();
|
const buildkit = new BuildKit();
|
||||||
let config: string;
|
let config: string;
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ describe('parseURL', () => {
|
|||||||
} as GitURL,
|
} as GitURL,
|
||||||
false
|
false
|
||||||
],
|
],
|
||||||
])('given %p', async (ref: string, expected: GitURL, expectedErr: boolean) => {
|
])('given %o', async (ref: string, expected: GitURL, expectedErr: boolean) => {
|
||||||
try {
|
try {
|
||||||
const got = Git.parseURL(ref);
|
const got = Git.parseURL(ref);
|
||||||
expect(got.scheme).toEqual(expected.scheme);
|
expect(got.scheme).toEqual(expected.scheme);
|
||||||
@@ -329,7 +329,7 @@ describe('parseRef', () => {
|
|||||||
'.git',
|
'.git',
|
||||||
undefined
|
undefined
|
||||||
],
|
],
|
||||||
])('given %p', async (ref: string, expected: GitRef | undefined) => {
|
])('given %o', async (ref: string, expected: GitRef | undefined) => {
|
||||||
try {
|
try {
|
||||||
const got = Git.parseRef(ref);
|
const got = Git.parseRef(ref);
|
||||||
expect(got).toEqual(expected);
|
expect(got).toEqual(expected);
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ maybe('getDefinition', () => {
|
|||||||
// path.join(fixturesDir, 'bake-test-docker-action-remote-private.json'),
|
// path.join(fixturesDir, 'bake-test-docker-action-remote-private.json'),
|
||||||
// true,
|
// true,
|
||||||
// ]
|
// ]
|
||||||
])('given %p', async (source: string, targets: string[], out: string, auth) => {
|
])('given %o', async (source: string, targets: string[], out: string, auth) => {
|
||||||
const gitAuthToken = process.env.GITHUB_TOKEN || '';
|
const gitAuthToken = process.env.GITHUB_TOKEN || '';
|
||||||
if (auth && !gitAuthToken) {
|
if (auth && !gitAuthToken) {
|
||||||
console.log(`Git auth token not available, skipping test`);
|
console.log(`Git auth token not available, skipping test`);
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ describe('getDefinition', () => {
|
|||||||
undefined,
|
undefined,
|
||||||
path.join(fixturesDir, 'bake-03-default.json')
|
path.join(fixturesDir, 'bake-03-default.json')
|
||||||
],
|
],
|
||||||
])('given %p', async (files: string[], targets: string[], overrides: string[], execOptions: ExecOptions | undefined, out: string) => {
|
])('given %o', async (files: string[], targets: string[], overrides: string[], execOptions: ExecOptions | undefined, out: string) => {
|
||||||
const bake = new Bake();
|
const bake = new Bake();
|
||||||
const expectedDef = <BakeDefinition>JSON.parse(fs.readFileSync(out, {encoding: 'utf-8'}).trim())
|
const expectedDef = <BakeDefinition>JSON.parse(fs.readFileSync(out, {encoding: 'utf-8'}).trim())
|
||||||
expect(await bake.getDefinition({
|
expect(await bake.getDefinition({
|
||||||
@@ -185,7 +185,7 @@ describe('hasLocalExporter', () => {
|
|||||||
} as unknown as BakeDefinition,
|
} as unknown as BakeDefinition,
|
||||||
true
|
true
|
||||||
]
|
]
|
||||||
])('given %o returns %p', async (def: BakeDefinition, expected: boolean) => {
|
])('given %o returns %o', async (def: BakeDefinition, expected: boolean) => {
|
||||||
expect(Bake.hasLocalExporter(def)).toEqual(expected);
|
expect(Bake.hasLocalExporter(def)).toEqual(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -285,7 +285,7 @@ describe('hasTarExporter', () => {
|
|||||||
} as unknown as BakeDefinition,
|
} as unknown as BakeDefinition,
|
||||||
false
|
false
|
||||||
],
|
],
|
||||||
])('given %o returns %p', async (def: BakeDefinition, expected: boolean) => {
|
])('given %o returns %o', async (def: BakeDefinition, expected: boolean) => {
|
||||||
expect(Bake.hasTarExporter(def)).toEqual(expected);
|
expect(Bake.hasTarExporter(def)).toEqual(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -440,7 +440,7 @@ describe('hasDockerExporter', () => {
|
|||||||
true,
|
true,
|
||||||
true
|
true
|
||||||
],
|
],
|
||||||
])('given %o and load:%p returns %p', async (def: BakeDefinition, expected: boolean, load: boolean | undefined) => {
|
])('given %o and load: %o returns %o', async (def: BakeDefinition, expected: boolean, load: boolean | undefined) => {
|
||||||
expect(Bake.hasDockerExporter(def, load)).toEqual(expected);
|
expect(Bake.hasDockerExporter(def, load)).toEqual(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -481,7 +481,7 @@ describe('hasGitAuthTokenSecret', () => {
|
|||||||
} as unknown as BakeDefinition,
|
} as unknown as BakeDefinition,
|
||||||
true
|
true
|
||||||
],
|
],
|
||||||
])('given %o returns %p', async (def: BakeDefinition, expected: boolean) => {
|
])('given %o returns %o', async (def: BakeDefinition, expected: boolean) => {
|
||||||
expect(Bake.hasGitAuthTokenSecret(def)).toEqual(expected);
|
expect(Bake.hasGitAuthTokenSecret(def)).toEqual(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -536,7 +536,7 @@ describe('hasProvenanceAttestation', () => {
|
|||||||
} as unknown as BakeDefinition,
|
} as unknown as BakeDefinition,
|
||||||
true
|
true
|
||||||
]
|
]
|
||||||
])('given %o returns %p', async (def: BakeDefinition, expected: boolean) => {
|
])('given %o returns %o', async (def: BakeDefinition, expected: boolean) => {
|
||||||
expect(Bake.hasProvenanceAttestation(def)).toEqual(expected);
|
expect(Bake.hasProvenanceAttestation(def)).toEqual(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -591,7 +591,7 @@ describe('hasSBOMAttestation', () => {
|
|||||||
} as unknown as BakeDefinition,
|
} as unknown as BakeDefinition,
|
||||||
true
|
true
|
||||||
]
|
]
|
||||||
])('given %o returns %p', async (def: BakeDefinition, expected: boolean) => {
|
])('given %o returns %o', async (def: BakeDefinition, expected: boolean) => {
|
||||||
expect(Bake.hasSBOMAttestation(def)).toEqual(expected);
|
expect(Bake.hasSBOMAttestation(def)).toEqual(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -22,6 +22,9 @@ import * as rimraf from 'rimraf';
|
|||||||
|
|
||||||
import {Context} from '../../src/context.js';
|
import {Context} from '../../src/context.js';
|
||||||
import {Build} from '../../src/buildx/build.js';
|
import {Build} from '../../src/buildx/build.js';
|
||||||
|
import {Buildx} from '../../src/buildx/buildx.js';
|
||||||
|
|
||||||
|
import {GitContextFormat} from '../../src/types/buildx/build.js';
|
||||||
|
|
||||||
const fixturesDir = path.join(__dirname, '..', '.fixtures');
|
const fixturesDir = path.join(__dirname, '..', '.fixtures');
|
||||||
const tmpDir = fs.mkdtempSync(path.join(process.env.TEMP || os.tmpdir(), 'buildx-build-'));
|
const tmpDir = fs.mkdtempSync(path.join(process.env.TEMP || os.tmpdir(), 'buildx-build-'));
|
||||||
@@ -41,6 +44,66 @@ afterEach(() => {
|
|||||||
rimraf.sync(tmpDir);
|
rimraf.sync(tmpDir);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('gitContext', () => {
|
||||||
|
const originalEnv = process.env;
|
||||||
|
beforeEach(() => {
|
||||||
|
vi.resetModules();
|
||||||
|
process.env = {
|
||||||
|
...originalEnv,
|
||||||
|
DOCKER_DEFAULT_GIT_CONTEXT_PR_HEAD_REF: '',
|
||||||
|
BUILDX_SEND_GIT_QUERY_AS_INPUT: ''
|
||||||
|
};
|
||||||
|
});
|
||||||
|
afterEach(() => {
|
||||||
|
process.env = originalEnv;
|
||||||
|
});
|
||||||
|
|
||||||
|
type GitContextTestCase = {
|
||||||
|
ref: string;
|
||||||
|
format: GitContextFormat | undefined;
|
||||||
|
prHeadRef: boolean;
|
||||||
|
sendGitQueryAsInput: boolean;
|
||||||
|
buildxQuerySupport: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
// prettier-ignore
|
||||||
|
const gitContextCases: [GitContextTestCase, string][] = [
|
||||||
|
// no format set (defaults to fragment)
|
||||||
|
[{ref: 'refs/heads/master', format: undefined, prHeadRef: false, sendGitQueryAsInput: false, buildxQuerySupport: true}, 'https://github.com/docker/actions-toolkit.git#860c1904a1ce19322e91ac35af1ab07466440c37'],
|
||||||
|
[{ref: 'master', format: undefined, prHeadRef: false, sendGitQueryAsInput: false, buildxQuerySupport: true}, 'https://github.com/docker/actions-toolkit.git#860c1904a1ce19322e91ac35af1ab07466440c37'],
|
||||||
|
[{ref: 'refs/pull/15/merge', format: undefined, prHeadRef: false, sendGitQueryAsInput: false, buildxQuerySupport: true}, 'https://github.com/docker/actions-toolkit.git#refs/pull/15/merge'],
|
||||||
|
[{ref: 'refs/tags/v1.0.0', format: undefined, prHeadRef: false, sendGitQueryAsInput: false, buildxQuerySupport: true}, 'https://github.com/docker/actions-toolkit.git#860c1904a1ce19322e91ac35af1ab07466440c37'],
|
||||||
|
[{ref: 'refs/pull/15/merge', format: undefined, prHeadRef: true, sendGitQueryAsInput: false, buildxQuerySupport: true}, 'https://github.com/docker/actions-toolkit.git#refs/pull/15/head'],
|
||||||
|
// no format set (defaults to query only when client-side query resolution is enabled and supported)
|
||||||
|
[{ref: 'refs/heads/master', format: undefined, prHeadRef: false, sendGitQueryAsInput: true, buildxQuerySupport: true}, 'https://github.com/docker/actions-toolkit.git?ref=refs/heads/master&checksum=860c1904a1ce19322e91ac35af1ab07466440c37'],
|
||||||
|
[{ref: 'refs/pull/15/merge', format: undefined, prHeadRef: false, sendGitQueryAsInput: true, buildxQuerySupport: true}, 'https://github.com/docker/actions-toolkit.git?ref=refs/pull/15/merge&checksum=860c1904a1ce19322e91ac35af1ab07466440c37'],
|
||||||
|
[{ref: 'refs/pull/15/merge', format: undefined, prHeadRef: true, sendGitQueryAsInput: true, buildxQuerySupport: true}, 'https://github.com/docker/actions-toolkit.git?ref=refs/pull/15/head&checksum=860c1904a1ce19322e91ac35af1ab07466440c37'],
|
||||||
|
[{ref: 'refs/heads/master', format: undefined, prHeadRef: false, sendGitQueryAsInput: true, buildxQuerySupport: false}, 'https://github.com/docker/actions-toolkit.git#860c1904a1ce19322e91ac35af1ab07466440c37'],
|
||||||
|
// query format
|
||||||
|
[{ref: 'refs/heads/master', format: 'query', prHeadRef: false, sendGitQueryAsInput: false, buildxQuerySupport: true}, 'https://github.com/docker/actions-toolkit.git?ref=refs/heads/master&checksum=860c1904a1ce19322e91ac35af1ab07466440c37'],
|
||||||
|
[{ref: 'master', format: 'query', prHeadRef: false, sendGitQueryAsInput: false, buildxQuerySupport: true}, 'https://github.com/docker/actions-toolkit.git?ref=refs/heads/master&checksum=860c1904a1ce19322e91ac35af1ab07466440c37'],
|
||||||
|
[{ref: 'refs/pull/15/merge', format: 'query', prHeadRef: false, sendGitQueryAsInput: false, buildxQuerySupport: true}, 'https://github.com/docker/actions-toolkit.git?ref=refs/pull/15/merge&checksum=860c1904a1ce19322e91ac35af1ab07466440c37'],
|
||||||
|
[{ref: 'refs/tags/v1.0.0', format: 'query', prHeadRef: false, sendGitQueryAsInput: false, buildxQuerySupport: true}, 'https://github.com/docker/actions-toolkit.git?ref=refs/tags/v1.0.0&checksum=860c1904a1ce19322e91ac35af1ab07466440c37'],
|
||||||
|
[{ref: 'refs/pull/15/merge', format: 'query', prHeadRef: true, sendGitQueryAsInput: false, buildxQuerySupport: true}, 'https://github.com/docker/actions-toolkit.git?ref=refs/pull/15/head&checksum=860c1904a1ce19322e91ac35af1ab07466440c37'],
|
||||||
|
// fragment format
|
||||||
|
[{ref: 'refs/heads/master', format: 'fragment', prHeadRef: false, sendGitQueryAsInput: false, buildxQuerySupport: true}, 'https://github.com/docker/actions-toolkit.git#860c1904a1ce19322e91ac35af1ab07466440c37'],
|
||||||
|
[{ref: 'master', format: 'fragment', prHeadRef: false, sendGitQueryAsInput: false, buildxQuerySupport: true}, 'https://github.com/docker/actions-toolkit.git#860c1904a1ce19322e91ac35af1ab07466440c37'],
|
||||||
|
[{ref: 'refs/pull/15/merge', format: 'fragment', prHeadRef: false, sendGitQueryAsInput: false, buildxQuerySupport: true}, 'https://github.com/docker/actions-toolkit.git#refs/pull/15/merge'],
|
||||||
|
[{ref: 'refs/tags/v1.0.0', format: 'fragment', prHeadRef: false, sendGitQueryAsInput: false, buildxQuerySupport: true}, 'https://github.com/docker/actions-toolkit.git#860c1904a1ce19322e91ac35af1ab07466440c37'],
|
||||||
|
[{ref: 'refs/pull/15/merge', format: 'fragment', prHeadRef: true, sendGitQueryAsInput: false, buildxQuerySupport: true}, 'https://github.com/docker/actions-toolkit.git#refs/pull/15/head'],
|
||||||
|
];
|
||||||
|
|
||||||
|
test.each(gitContextCases)('given %o should return %o', async (input: GitContextTestCase, expected: string) => {
|
||||||
|
const {ref, format, prHeadRef, sendGitQueryAsInput, buildxQuerySupport} = input;
|
||||||
|
process.env.DOCKER_DEFAULT_GIT_CONTEXT_PR_HEAD_REF = prHeadRef ? 'true' : '';
|
||||||
|
process.env.BUILDX_SEND_GIT_QUERY_AS_INPUT = sendGitQueryAsInput ? 'true' : '';
|
||||||
|
const buildx = new Buildx();
|
||||||
|
vi.spyOn(buildx, 'versionSatisfies').mockResolvedValue(buildxQuerySupport);
|
||||||
|
const build = new Build({buildx});
|
||||||
|
expect(await build.gitContext(ref, '860c1904a1ce19322e91ac35af1ab07466440c37', format)).toEqual(expected);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('resolveImageID', () => {
|
describe('resolveImageID', () => {
|
||||||
it('matches', async () => {
|
it('matches', async () => {
|
||||||
const imageID = 'sha256:bfb45ab72e46908183546477a08f8867fc40cebadd00af54b071b097aed127a9';
|
const imageID = 'sha256:bfb45ab72e46908183546477a08f8867fc40cebadd00af54b071b097aed127a9';
|
||||||
@@ -136,7 +199,7 @@ describe('getProvenanceInput', () => {
|
|||||||
'',
|
'',
|
||||||
''
|
''
|
||||||
],
|
],
|
||||||
])('given input %p', async (input: string, expected: string) => {
|
])('given input %o', async (input: string, expected: string) => {
|
||||||
setInput('provenance', input);
|
setInput('provenance', input);
|
||||||
expect(Build.getProvenanceInput('provenance')).toEqual(expected);
|
expect(Build.getProvenanceInput('provenance')).toEqual(expected);
|
||||||
});
|
});
|
||||||
@@ -165,7 +228,7 @@ describe('resolveProvenanceAttrs', () => {
|
|||||||
'',
|
'',
|
||||||
'builder-id=https://github.com/docker/actions-toolkit/actions/runs/2188748038/attempts/2'
|
'builder-id=https://github.com/docker/actions-toolkit/actions/runs/2188748038/attempts/2'
|
||||||
],
|
],
|
||||||
])('given %p', async (input: string, expected: string) => {
|
])('given %o', async (input: string, expected: string) => {
|
||||||
expect(Build.resolveProvenanceAttrs(input)).toEqual(expected);
|
expect(Build.resolveProvenanceAttrs(input)).toEqual(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -180,7 +243,7 @@ describe('resolveSecret', () => {
|
|||||||
['=bbbbbbb', false, '', '', new Error('=bbbbbbb is not a valid secret')],
|
['=bbbbbbb', false, '', '', new Error('=bbbbbbb is not a valid secret')],
|
||||||
[`foo=${path.join(fixturesDir, 'secret.txt')}`, true, 'foo', 'bar', null],
|
[`foo=${path.join(fixturesDir, 'secret.txt')}`, true, 'foo', 'bar', null],
|
||||||
[`notfound=secret`, true, '', '', new Error('secret file secret not found')]
|
[`notfound=secret`, true, '', '', new Error('secret file secret not found')]
|
||||||
])('given %p key and %p secret', async (kvp: string, file: boolean, exKey: string, exValue: string, error: Error | null) => {
|
])('given %o key and %o secret', async (kvp: string, file: boolean, exKey: string, exValue: string, error: Error | null) => {
|
||||||
try {
|
try {
|
||||||
let secret: string;
|
let secret: string;
|
||||||
if (file) {
|
if (file) {
|
||||||
@@ -201,7 +264,7 @@ describe('resolveSecret', () => {
|
|||||||
['FOO=', 'FOO', '', new Error('FOO= is not a valid secret')],
|
['FOO=', 'FOO', '', new Error('FOO= is not a valid secret')],
|
||||||
['=bar', '', '', new Error('=bar is not a valid secret')],
|
['=bar', '', '', new Error('=bar is not a valid secret')],
|
||||||
['FOO=bar=baz', 'FOO', 'bar=baz', null]
|
['FOO=bar=baz', 'FOO', 'bar=baz', null]
|
||||||
])('given %p key and %p env', async (kvp: string, exKey: string, exValue: string, error: Error | null) => {
|
])('given %o key and %o env', async (kvp: string, exKey: string, exValue: string, error: Error | null) => {
|
||||||
try {
|
try {
|
||||||
const secret = Build.resolveSecretEnv(kvp);
|
const secret = Build.resolveSecretEnv(kvp);
|
||||||
expect(secret).toEqual(`id=${exKey},env=${exValue}`);
|
expect(secret).toEqual(`id=${exKey},env=${exValue}`);
|
||||||
@@ -255,7 +318,7 @@ describe('resolveCacheToAttrs', () => {
|
|||||||
'abcd1234',
|
'abcd1234',
|
||||||
'type=gha,repository=foo/bar,mode=max,ghtoken=abcd1234',
|
'type=gha,repository=foo/bar,mode=max,ghtoken=abcd1234',
|
||||||
],
|
],
|
||||||
])('given %p', async (input: string, githubToken: string | undefined, expected: string) => {
|
])('given %o', async (input: string, githubToken: string | undefined, expected: string) => {
|
||||||
expect(Build.resolveCacheToAttrs(input, githubToken)).toEqual(expected);
|
expect(Build.resolveCacheToAttrs(input, githubToken)).toEqual(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -271,7 +334,7 @@ describe('hasLocalExporter', () => {
|
|||||||
[['"type=tar","dest=/tmp/image.tar"'], false],
|
[['"type=tar","dest=/tmp/image.tar"'], false],
|
||||||
[['" type= local" , dest=./release-out'], true],
|
[['" type= local" , dest=./release-out'], true],
|
||||||
[['.'], true]
|
[['.'], true]
|
||||||
])('given %p returns %p', async (exporters: Array<string>, expected: boolean) => {
|
])('given %o returns %o', async (exporters: Array<string>, expected: boolean) => {
|
||||||
expect(Build.hasLocalExporter(exporters)).toEqual(expected);
|
expect(Build.hasLocalExporter(exporters)).toEqual(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -287,7 +350,7 @@ describe('hasTarExporter', () => {
|
|||||||
[['"type=tar","dest=/tmp/image.tar"'], true],
|
[['"type=tar","dest=/tmp/image.tar"'], true],
|
||||||
[['" type= local" , dest=./release-out'], false],
|
[['" type= local" , dest=./release-out'], false],
|
||||||
[['.'], false]
|
[['.'], false]
|
||||||
])('given %p returns %p', async (exporters: Array<string>, expected: boolean) => {
|
])('given %o returns %o', async (exporters: Array<string>, expected: boolean) => {
|
||||||
expect(Build.hasTarExporter(exporters)).toEqual(expected);
|
expect(Build.hasTarExporter(exporters)).toEqual(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -305,7 +368,7 @@ describe('hasDockerExporter', () => {
|
|||||||
[['type=docker'], true, false],
|
[['type=docker'], true, false],
|
||||||
[['type=docker'], true, true],
|
[['type=docker'], true, true],
|
||||||
[['.'], true, true],
|
[['.'], true, true],
|
||||||
])('given %p returns %p', async (exporters: Array<string>, expected: boolean, load: boolean | undefined) => {
|
])('given %o returns %o', async (exporters: Array<string>, expected: boolean, load: boolean | undefined) => {
|
||||||
expect(Build.hasDockerExporter(exporters, load)).toEqual(expected);
|
expect(Build.hasDockerExporter(exporters, load)).toEqual(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -316,7 +379,7 @@ describe('hasAttestationType', () => {
|
|||||||
['type=provenance,mode=min', 'provenance', true],
|
['type=provenance,mode=min', 'provenance', true],
|
||||||
['type=sbom,true', 'sbom', true],
|
['type=sbom,true', 'sbom', true],
|
||||||
['type=foo,bar', 'provenance', false],
|
['type=foo,bar', 'provenance', false],
|
||||||
])('given %p for %p returns %p', async (attrs: string, name: string, expected: boolean) => {
|
])('given %o for %o returns %o', async (attrs: string, name: string, expected: boolean) => {
|
||||||
expect(Build.hasAttestationType(name, attrs)).toEqual(expected);
|
expect(Build.hasAttestationType(name, attrs)).toEqual(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -340,7 +403,7 @@ describe('resolveAttestationAttrs', () => {
|
|||||||
'',
|
'',
|
||||||
''
|
''
|
||||||
],
|
],
|
||||||
])('given %p', async (input: string, expected: string) => {
|
])('given %o', async (input: string, expected: string) => {
|
||||||
expect(Build.resolveAttestationAttrs(input)).toEqual(expected);
|
expect(Build.resolveAttestationAttrs(input)).toEqual(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -351,7 +414,7 @@ describe('hasGitAuthTokenSecret', () => {
|
|||||||
[['A_SECRET=abcdef0123456789'], undefined, false],
|
[['A_SECRET=abcdef0123456789'], undefined, false],
|
||||||
[['GIT_AUTH_TOKEN=abcdefghijklmno=0123456789'], undefined, true],
|
[['GIT_AUTH_TOKEN=abcdefghijklmno=0123456789'], undefined, true],
|
||||||
[['GIT_AUTH_TOKEN.github.com=abcdefghijklmno=0123456789'], 'github.com', true],
|
[['GIT_AUTH_TOKEN.github.com=abcdefghijklmno=0123456789'], 'github.com', true],
|
||||||
])('given %p secret', async (kvp: Array<string>, domain: string | undefined, expected: boolean) => {
|
])('given %o secret', async (kvp: Array<string>, domain: string | undefined, expected: boolean) => {
|
||||||
expect(Build.hasGitAuthTokenSecret(kvp, domain)).toBe(expected);
|
expect(Build.hasGitAuthTokenSecret(kvp, domain)).toBe(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -548,7 +548,7 @@ baz = qux
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
])('given %p', async (inspectFile, expected) => {
|
])('given %o', async (inspectFile, expected) => {
|
||||||
expect(await Builder.parseInspect(fs.readFileSync(path.join(fixturesDir, inspectFile)).toString())).toEqual(expected);
|
expect(await Builder.parseInspect(fs.readFileSync(path.join(fixturesDir, inspectFile)).toString())).toEqual(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ describe('parseVersion', () => {
|
|||||||
['github.com/docker/buildx v0.4.1 bda4882a65349ca359216b135896bddc1d92461c', '0.4.1'],
|
['github.com/docker/buildx v0.4.1 bda4882a65349ca359216b135896bddc1d92461c', '0.4.1'],
|
||||||
['github.com/docker/buildx v0.4.2 fb7b670b764764dc4716df3eba07ffdae4cc47b2', '0.4.2'],
|
['github.com/docker/buildx v0.4.2 fb7b670b764764dc4716df3eba07ffdae4cc47b2', '0.4.2'],
|
||||||
['github.com/docker/buildx f117971 f11797113e5a9b86bd976329c5dbb8a8bfdfadfa', 'f117971']
|
['github.com/docker/buildx f117971 f11797113e5a9b86bd976329c5dbb8a8bfdfadfa', 'f117971']
|
||||||
])('given %p', async (stdout, expected) => {
|
])('given %o', async (stdout, expected) => {
|
||||||
expect(Buildx.parseVersion(stdout)).toEqual(expected);
|
expect(Buildx.parseVersion(stdout)).toEqual(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -155,7 +155,7 @@ describe('versionSatisfies', () => {
|
|||||||
['0.4.1', '>=0.3.2', true],
|
['0.4.1', '>=0.3.2', true],
|
||||||
['bda4882a65349ca359216b135896bddc1d92461c', '>0.1.0', false],
|
['bda4882a65349ca359216b135896bddc1d92461c', '>0.1.0', false],
|
||||||
['f117971', '>0.6.0', true]
|
['f117971', '>0.6.0', true]
|
||||||
])('given %p', async (version, range, expected) => {
|
])('given %o', async (version, range, expected) => {
|
||||||
const buildx = new Buildx();
|
const buildx = new Buildx();
|
||||||
expect(await buildx.versionSatisfies(range, version)).toBe(expected);
|
expect(await buildx.versionSatisfies(range, version)).toBe(expected);
|
||||||
});
|
});
|
||||||
@@ -236,7 +236,7 @@ describe('resolveCertsDriverOpts', () => {
|
|||||||
],
|
],
|
||||||
[]
|
[]
|
||||||
],
|
],
|
||||||
])('%p. given %p endpoint, %p driver', async (id: number, endpoint: string, driver: string, cert: Cert, expectedFiles: Array<string>, expectedOpts: Array<string>) => {
|
])('%o. given %o endpoint, %o driver', async (id: number, endpoint: string, driver: string, cert: Cert, expectedFiles: Array<string>, expectedOpts: Array<string>) => {
|
||||||
fs.mkdirSync(Buildx.certsDir, {recursive: true});
|
fs.mkdirSync(Buildx.certsDir, {recursive: true});
|
||||||
expect(Buildx.resolveCertsDriverOpts(driver, endpoint, cert)).toEqual(expectedOpts);
|
expect(Buildx.resolveCertsDriverOpts(driver, endpoint, cert)).toEqual(expectedOpts);
|
||||||
for (const k in expectedFiles) {
|
for (const k in expectedFiles) {
|
||||||
@@ -298,7 +298,7 @@ describe('localState', () => {
|
|||||||
DockerfilePath: '-'
|
DockerfilePath: '-'
|
||||||
} as LocalState,
|
} as LocalState,
|
||||||
]
|
]
|
||||||
])('given %p', async (ref: string, expected: LocalState) => {
|
])('given %o', async (ref: string, expected: LocalState) => {
|
||||||
const localState = Buildx.localState(ref, path.join(fixturesDir, 'buildx-refs'));
|
const localState = Buildx.localState(ref, path.join(fixturesDir, 'buildx-refs'));
|
||||||
expect(localState).toEqual(expected);
|
expect(localState).toEqual(expected);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -187,40 +187,4 @@ maybe('export', () => {
|
|||||||
expect(fs.existsSync(exportRes?.dockerbuildFilename)).toBe(true);
|
expect(fs.existsSync(exportRes?.dockerbuildFilename)).toBe(true);
|
||||||
expect(exportRes?.summaries).toBeDefined();
|
expect(exportRes?.summaries).toBeDefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('export using container', 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 ?? ''],
|
|
||||||
useContainer: true
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(exportRes).toBeDefined();
|
|
||||||
expect(exportRes?.dockerbuildFilename).toBeDefined();
|
|
||||||
expect(exportRes?.dockerbuildSize).toBeDefined();
|
|
||||||
expect(fs.existsSync(exportRes?.dockerbuildFilename)).toBe(true);
|
|
||||||
expect(exportRes?.summaries).toBeDefined();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -94,3 +94,14 @@ maybe('attestationDigests', () => {
|
|||||||
expect(digests).toEqual(['sha256:0709528fae1747ce17638ad2978ee7936b38a294136eaadaf692e415f64b1e03']);
|
expect(digests).toEqual(['sha256:0709528fae1747ce17638ad2978ee7936b38a294136eaadaf692e415f64b1e03']);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
maybe('create', () => {
|
||||||
|
it('skips create command execution when skipExec is set', async () => {
|
||||||
|
const result = await new ImageTools().create({
|
||||||
|
sources: ['sha256:0709528fae1747ce17638ad2978ee7936b38a294136eaadaf692e415f64b1e03'],
|
||||||
|
tags: ['docker.io/user/app', 'docker.io/user/app2'],
|
||||||
|
skipExec: true
|
||||||
|
});
|
||||||
|
expect(result).toBeUndefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
141
__tests__/buildx/imagetools.test.ts
Normal file
141
__tests__/buildx/imagetools.test.ts
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2026 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, it, vi} from 'vitest';
|
||||||
|
import fs from 'fs';
|
||||||
|
import os from 'os';
|
||||||
|
import path from 'path';
|
||||||
|
import * as rimraf from 'rimraf';
|
||||||
|
|
||||||
|
import {Buildx} from '../../src/buildx/buildx.js';
|
||||||
|
import {ImageTools} from '../../src/buildx/imagetools.js';
|
||||||
|
import {Context} from '../../src/context.js';
|
||||||
|
import {Exec} from '../../src/exec.js';
|
||||||
|
|
||||||
|
const tmpDir = fs.mkdtempSync(path.join(process.env.TEMP || os.tmpdir(), 'buildx-imagetools-'));
|
||||||
|
const metadataFile = path.join(tmpDir, 'imagetools-metadata.json');
|
||||||
|
|
||||||
|
vi.spyOn(Context, 'tmpDir').mockImplementation((): string => {
|
||||||
|
fs.mkdirSync(tmpDir, {recursive: true});
|
||||||
|
return tmpDir;
|
||||||
|
});
|
||||||
|
|
||||||
|
vi.spyOn(Context, 'tmpName').mockImplementation((): string => {
|
||||||
|
return metadataFile;
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
vi.clearAllMocks();
|
||||||
|
rimraf.sync(tmpDir);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('create', () => {
|
||||||
|
it('parses metadata and supports cwd sources', async () => {
|
||||||
|
const getCommand = vi.fn().mockResolvedValue({
|
||||||
|
command: 'docker',
|
||||||
|
args: ['buildx', 'imagetools', 'create']
|
||||||
|
});
|
||||||
|
const buildx = {getCommand} as unknown as Buildx;
|
||||||
|
|
||||||
|
fs.writeFileSync(
|
||||||
|
metadataFile,
|
||||||
|
JSON.stringify({
|
||||||
|
'containerimage.descriptor': {
|
||||||
|
mediaType: 'application/vnd.oci.image.index.v1+json',
|
||||||
|
digest: 'sha256:19ffeab6f8bc9293ac2c3fdf94ebe28396254c993aea0b5a542cfb02e0883fa3',
|
||||||
|
size: 4654
|
||||||
|
},
|
||||||
|
'image.name': 'docker.io/user/app,docker.io/user/app2'
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
const execSpy = vi.spyOn(Exec, 'getExecOutput').mockResolvedValue({
|
||||||
|
exitCode: 0,
|
||||||
|
stdout: '',
|
||||||
|
stderr: ''
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = await new ImageTools({buildx}).create({
|
||||||
|
sources: ['cwd://descriptor.json', 'docker.io/library/alpine:latest'],
|
||||||
|
tags: ['docker.io/user/app:latest'],
|
||||||
|
silent: true
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(getCommand).toHaveBeenCalledWith(['imagetools', 'create', '--tag', 'docker.io/user/app:latest', '--metadata-file', metadataFile, '--file', 'descriptor.json', 'docker.io/library/alpine:latest']);
|
||||||
|
expect(execSpy).toHaveBeenCalledWith('docker', ['buildx', 'imagetools', 'create'], {
|
||||||
|
ignoreReturnCode: true,
|
||||||
|
silent: true
|
||||||
|
});
|
||||||
|
expect(result).toEqual({
|
||||||
|
digest: 'sha256:19ffeab6f8bc9293ac2c3fdf94ebe28396254c993aea0b5a542cfb02e0883fa3',
|
||||||
|
descriptor: {
|
||||||
|
mediaType: 'application/vnd.oci.image.index.v1+json',
|
||||||
|
digest: 'sha256:19ffeab6f8bc9293ac2c3fdf94ebe28396254c993aea0b5a542cfb02e0883fa3',
|
||||||
|
size: 4654
|
||||||
|
},
|
||||||
|
imageNames: ['docker.io/user/app', 'docker.io/user/app2']
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('does not parse metadata in dry-run mode', async () => {
|
||||||
|
const getCommand = vi.fn().mockResolvedValue({
|
||||||
|
command: 'docker',
|
||||||
|
args: ['buildx', 'imagetools', 'create']
|
||||||
|
});
|
||||||
|
const buildx = {getCommand} as unknown as Buildx;
|
||||||
|
|
||||||
|
const execSpy = vi.spyOn(Exec, 'getExecOutput').mockResolvedValue({
|
||||||
|
exitCode: 0,
|
||||||
|
stdout: '',
|
||||||
|
stderr: ''
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = await new ImageTools({buildx}).create({
|
||||||
|
sources: ['docker.io/library/alpine:latest'],
|
||||||
|
dryRun: true,
|
||||||
|
silent: true
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(getCommand).toHaveBeenCalledWith(['imagetools', 'create', '--dry-run', 'docker.io/library/alpine:latest']);
|
||||||
|
expect(execSpy).toHaveBeenCalledWith('docker', ['buildx', 'imagetools', 'create'], {
|
||||||
|
ignoreReturnCode: true,
|
||||||
|
silent: true
|
||||||
|
});
|
||||||
|
expect(result).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('skips command execution when skipExec is enabled', async () => {
|
||||||
|
const getCommand = vi.fn().mockResolvedValue({
|
||||||
|
command: 'docker',
|
||||||
|
args: ['buildx', 'imagetools', 'create']
|
||||||
|
});
|
||||||
|
const buildx = {getCommand} as unknown as Buildx;
|
||||||
|
const execSpy = vi.spyOn(Exec, 'getExecOutput').mockResolvedValue({
|
||||||
|
exitCode: 0,
|
||||||
|
stdout: '',
|
||||||
|
stderr: ''
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = await new ImageTools({buildx}).create({
|
||||||
|
sources: ['docker.io/library/alpine:latest'],
|
||||||
|
skipExec: true
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(getCommand).toHaveBeenCalledWith(['imagetools', 'create', '--metadata-file', metadataFile, 'docker.io/library/alpine:latest']);
|
||||||
|
expect(execSpy).not.toHaveBeenCalled();
|
||||||
|
expect(result).toBeUndefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -37,7 +37,7 @@ describe('download', () => {
|
|||||||
['v0.10.5', true],
|
['v0.10.5', true],
|
||||||
['latest', true]
|
['latest', true]
|
||||||
])(
|
])(
|
||||||
'acquires %p of buildx (standalone: %p)', async (version, standalone) => {
|
'acquires %o of buildx (standalone: %o)', async (version, standalone) => {
|
||||||
const install = new Install({standalone: standalone});
|
const install = new Install({standalone: standalone});
|
||||||
const toolPath = await install.download({version});
|
const toolPath = await install.download({version});
|
||||||
expect(fs.existsSync(toolPath)).toBe(true);
|
expect(fs.existsSync(toolPath)).toBe(true);
|
||||||
@@ -56,7 +56,7 @@ describe('download', () => {
|
|||||||
['v0.9.0'],
|
['v0.9.0'],
|
||||||
['v0.10.5'],
|
['v0.10.5'],
|
||||||
])(
|
])(
|
||||||
'acquires %p of buildx with cache', async (version) => {
|
'acquires %o of buildx with cache', async (version) => {
|
||||||
const install = new Install({standalone: false});
|
const install = new Install({standalone: false});
|
||||||
const toolPath = await install.download({version});
|
const toolPath = await install.download({version});
|
||||||
expect(fs.existsSync(toolPath)).toBe(true);
|
expect(fs.existsSync(toolPath)).toBe(true);
|
||||||
@@ -67,7 +67,7 @@ describe('download', () => {
|
|||||||
['v0.11.2'],
|
['v0.11.2'],
|
||||||
['v0.12.0'],
|
['v0.12.0'],
|
||||||
])(
|
])(
|
||||||
'acquires %p of buildx without cache', async (version) => {
|
'acquires %o of buildx without cache', async (version) => {
|
||||||
const install = new Install({standalone: false});
|
const install = new Install({standalone: false});
|
||||||
const toolPath = await install.download({version: version, ghaNoCache: true});
|
const toolPath = await install.download({version: version, ghaNoCache: true});
|
||||||
expect(fs.existsSync(toolPath)).toBe(true);
|
expect(fs.existsSync(toolPath)).toBe(true);
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ describe('parseVersion', () => {
|
|||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
test.each([
|
test.each([
|
||||||
['Docker Compose version v2.31.0', '2.31.0'],
|
['Docker Compose version v2.31.0', '2.31.0'],
|
||||||
])('given %p', async (stdout, expected) => {
|
])('given %o', async (stdout, expected) => {
|
||||||
expect(Compose.parseVersion(stdout)).toEqual(expected);
|
expect(Compose.parseVersion(stdout)).toEqual(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ describe('download', () => {
|
|||||||
['v2.32.4', true],
|
['v2.32.4', true],
|
||||||
['latest', true]
|
['latest', true]
|
||||||
])(
|
])(
|
||||||
'acquires %p of compose (standalone: %p)', async (version, standalone) => {
|
'acquires %o of compose (standalone: %o)', async (version, standalone) => {
|
||||||
const install = new Install({standalone: standalone});
|
const install = new Install({standalone: standalone});
|
||||||
const toolPath = await install.download(version);
|
const toolPath = await install.download(version);
|
||||||
expect(fs.existsSync(toolPath)).toBe(true);
|
expect(fs.existsSync(toolPath)).toBe(true);
|
||||||
@@ -56,7 +56,7 @@ describe('download', () => {
|
|||||||
['v2.31.0'],
|
['v2.31.0'],
|
||||||
['v2.32.4'],
|
['v2.32.4'],
|
||||||
])(
|
])(
|
||||||
'acquires %p of compose with cache', async (version) => {
|
'acquires %o of compose with cache', async (version) => {
|
||||||
const install = new Install({standalone: false});
|
const install = new Install({standalone: false});
|
||||||
const toolPath = await install.download(version);
|
const toolPath = await install.download(version);
|
||||||
expect(fs.existsSync(toolPath)).toBe(true);
|
expect(fs.existsSync(toolPath)).toBe(true);
|
||||||
@@ -67,7 +67,7 @@ describe('download', () => {
|
|||||||
['v2.27.1'],
|
['v2.27.1'],
|
||||||
['v2.28.0'],
|
['v2.28.0'],
|
||||||
])(
|
])(
|
||||||
'acquires %p of compose without cache', async (version) => {
|
'acquires %o of compose without cache', async (version) => {
|
||||||
const install = new Install({standalone: false});
|
const install = new Install({standalone: false});
|
||||||
const toolPath = await install.download(version, true);
|
const toolPath = await install.download(version, true);
|
||||||
expect(fs.existsSync(toolPath)).toBe(true);
|
expect(fs.existsSync(toolPath)).toBe(true);
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {describe, expect, vi, it, afterEach, beforeEach, test} from 'vitest';
|
import {describe, expect, it, afterEach} from 'vitest';
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import os from 'os';
|
import os from 'os';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
@@ -23,57 +23,35 @@ import * as rimraf from 'rimraf';
|
|||||||
import {Context} from '../src/context.js';
|
import {Context} from '../src/context.js';
|
||||||
|
|
||||||
const tmpDir = fs.mkdtempSync(path.join(process.env.TEMP || os.tmpdir(), 'context-'));
|
const tmpDir = fs.mkdtempSync(path.join(process.env.TEMP || os.tmpdir(), 'context-'));
|
||||||
const tmpName = path.join(tmpDir, '.tmpname-vi');
|
|
||||||
|
|
||||||
vi.spyOn(Context, 'tmpDir').mockImplementation((): string => {
|
|
||||||
fs.mkdirSync(tmpDir, {recursive: true});
|
|
||||||
return tmpDir;
|
|
||||||
});
|
|
||||||
|
|
||||||
vi.spyOn(Context, 'tmpName').mockImplementation((): string => {
|
|
||||||
return tmpName;
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
rimraf.sync(tmpDir);
|
rimraf.sync(tmpDir);
|
||||||
|
fs.mkdirSync(tmpDir, {recursive: true});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('gitRef', () => {
|
describe('tmpDir', () => {
|
||||||
it('returns refs/heads/master', async () => {
|
it('returns an existing directory and keeps it stable', () => {
|
||||||
expect(Context.gitRef()).toEqual('refs/heads/master');
|
const dir = Context.tmpDir();
|
||||||
|
expect(fs.existsSync(dir)).toBe(true);
|
||||||
|
expect(fs.statSync(dir).isDirectory()).toBe(true);
|
||||||
|
expect(Context.tmpDir()).toEqual(dir);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('parseGitRef', () => {
|
describe('tmpName', () => {
|
||||||
const originalEnv = process.env;
|
it('returns a path for the provided tmpdir and template', () => {
|
||||||
beforeEach(() => {
|
const name = Context.tmpName({
|
||||||
vi.resetModules();
|
tmpdir: tmpDir,
|
||||||
process.env = {
|
template: '.tmpname-XXXXXX'
|
||||||
...originalEnv,
|
});
|
||||||
DOCKER_GIT_CONTEXT_PR_HEAD_REF: ''
|
expect(path.dirname(name)).toEqual(tmpDir);
|
||||||
};
|
expect(path.basename(name)).toMatch(/^\.tmpname-/);
|
||||||
|
expect(fs.existsSync(name)).toBe(false);
|
||||||
});
|
});
|
||||||
afterEach(() => {
|
|
||||||
process.env = originalEnv;
|
|
||||||
});
|
|
||||||
// prettier-ignore
|
|
||||||
test.each([
|
|
||||||
['refs/heads/master', '860c1904a1ce19322e91ac35af1ab07466440c37', false, '860c1904a1ce19322e91ac35af1ab07466440c37'],
|
|
||||||
['master', '860c1904a1ce19322e91ac35af1ab07466440c37', false, '860c1904a1ce19322e91ac35af1ab07466440c37'],
|
|
||||||
['refs/pull/15/merge', '860c1904a1ce19322e91ac35af1ab07466440c37', false, 'refs/pull/15/merge'],
|
|
||||||
['refs/heads/master', '', false, 'refs/heads/master'],
|
|
||||||
['master', '', false, 'master'],
|
|
||||||
['refs/tags/v1.0.0', '', false, 'refs/tags/v1.0.0'],
|
|
||||||
['refs/pull/15/merge', '', false, 'refs/pull/15/merge'],
|
|
||||||
['refs/pull/15/merge', '', true, 'refs/pull/15/head'],
|
|
||||||
])('given %p and %p, should return %p', async (ref: string, sha: string, prHeadRef: boolean, expected: string) => {
|
|
||||||
process.env.DOCKER_DEFAULT_GIT_CONTEXT_PR_HEAD_REF = prHeadRef ? 'true' : '';
|
|
||||||
expect(Context.parseGitRef(ref, sha)).toEqual(expected);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('gitContext', () => {
|
it('returns different paths on consecutive calls', () => {
|
||||||
it('returns refs/heads/master', async () => {
|
const first = Context.tmpName({tmpdir: tmpDir, template: '.tmpname-XXXXXX'});
|
||||||
expect(Context.gitContext()).toEqual('https://github.com/docker/actions-toolkit.git#refs/heads/master');
|
const second = Context.tmpName({tmpdir: tmpDir, template: '.tmpname-XXXXXX'});
|
||||||
|
expect(first).not.toEqual(second);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ describe('versionSatisfies', () => {
|
|||||||
['v0.4.1', '>=0.3.2', true],
|
['v0.4.1', '>=0.3.2', true],
|
||||||
['v0.8.0', '>0.6.0', true],
|
['v0.8.0', '>0.6.0', true],
|
||||||
['v0.8.0', '<0.3.0', false]
|
['v0.8.0', '<0.3.0', false]
|
||||||
])('given %p', async (version, range, expected) => {
|
])('given %o', async (version, range, expected) => {
|
||||||
const cosign = new Cosign();
|
const cosign = new Cosign();
|
||||||
expect(await cosign.versionSatisfies(range, version)).toBe(expected);
|
expect(await cosign.versionSatisfies(range, version)).toBe(expected);
|
||||||
});
|
});
|
||||||
@@ -71,7 +71,7 @@ describe('parseCommandOutput', () => {
|
|||||||
[path.join(fixturesDir, 'cosign', 'sign-output1.txt')],
|
[path.join(fixturesDir, 'cosign', 'sign-output1.txt')],
|
||||||
[path.join(fixturesDir, 'cosign', 'sign-output2.txt')],
|
[path.join(fixturesDir, 'cosign', 'sign-output2.txt')],
|
||||||
[path.join(fixturesDir, 'cosign', 'sign-output3.txt')],
|
[path.join(fixturesDir, 'cosign', 'sign-output3.txt')],
|
||||||
])('parsing %p', async (fixturePath: string) => {
|
])('parsing %o', async (fixturePath: string) => {
|
||||||
const signResult = Cosign.parseCommandOutput(fs.readFileSync(fixturePath, 'utf-8'));
|
const signResult = Cosign.parseCommandOutput(fs.readFileSync(fixturePath, 'utf-8'));
|
||||||
expect(signResult).toBeDefined();
|
expect(signResult).toBeDefined();
|
||||||
expect(signResult.bundle).toBeDefined();
|
expect(signResult.bundle).toBeDefined();
|
||||||
@@ -80,7 +80,7 @@ describe('parseCommandOutput', () => {
|
|||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
test.each([
|
test.each([
|
||||||
[path.join(fixturesDir, 'cosign', 'verify-output-err1.txt')],
|
[path.join(fixturesDir, 'cosign', 'verify-output-err1.txt')],
|
||||||
])('parsing %p', async (fixturePath: string) => {
|
])('parsing %o', async (fixturePath: string) => {
|
||||||
const signResult = Cosign.parseCommandOutput(fs.readFileSync(fixturePath, 'utf-8'));
|
const signResult = Cosign.parseCommandOutput(fs.readFileSync(fixturePath, 'utf-8'));
|
||||||
expect(signResult).toBeDefined();
|
expect(signResult).toBeDefined();
|
||||||
expect(signResult.bundle).toBeUndefined();
|
expect(signResult.bundle).toBeUndefined();
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ describe('download', () => {
|
|||||||
['v3.0.1'],
|
['v3.0.1'],
|
||||||
['latest']
|
['latest']
|
||||||
])(
|
])(
|
||||||
'acquires %p of cosign', async (version) => {
|
'acquires %o of cosign', async (version) => {
|
||||||
const install = new Install();
|
const install = new Install();
|
||||||
const toolPath = await install.download({version});
|
const toolPath = await install.download({version});
|
||||||
expect(fs.existsSync(toolPath)).toBe(true);
|
expect(fs.existsSync(toolPath)).toBe(true);
|
||||||
@@ -51,7 +51,7 @@ describe('download', () => {
|
|||||||
['v2.6.1'],
|
['v2.6.1'],
|
||||||
['v3.0.1'],
|
['v3.0.1'],
|
||||||
])(
|
])(
|
||||||
'acquires %p of cosign with cache', async (version) => {
|
'acquires %o of cosign with cache', async (version) => {
|
||||||
const install = new Install();
|
const install = new Install();
|
||||||
const toolPath = await install.download({version});
|
const toolPath = await install.download({version});
|
||||||
expect(fs.existsSync(toolPath)).toBe(true);
|
expect(fs.existsSync(toolPath)).toBe(true);
|
||||||
@@ -62,7 +62,7 @@ describe('download', () => {
|
|||||||
['v2.5.3'],
|
['v2.5.3'],
|
||||||
['v2.6.0'],
|
['v2.6.0'],
|
||||||
])(
|
])(
|
||||||
'acquires %p of cosign without cache', async (version) => {
|
'acquires %o of cosign without cache', async (version) => {
|
||||||
const install = new Install();
|
const install = new Install();
|
||||||
const toolPath = await install.download({
|
const toolPath = await install.download({
|
||||||
version: version,
|
version: version,
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ describe('download', () => {
|
|||||||
[image('27.3.1'), 'linux'],
|
[image('27.3.1'), 'linux'],
|
||||||
[image('27.3.1'), 'win32'],
|
[image('27.3.1'), 'win32'],
|
||||||
])(
|
])(
|
||||||
'acquires %p of docker (%s)', async (source, platformOS) => {
|
'acquires %o of docker (%s)', async (source, platformOS) => {
|
||||||
mockPlatform(platformOS as NodeJS.Platform);
|
mockPlatform(platformOS as NodeJS.Platform);
|
||||||
mockArch('x64');
|
mockArch('x64');
|
||||||
const install = new Install({
|
const install = new Install({
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ describe('releases', () => {
|
|||||||
['.github/docker-releases.json'],
|
['.github/docker-releases.json'],
|
||||||
['.github/regclient-releases.json'],
|
['.github/regclient-releases.json'],
|
||||||
['.github/undock-releases.json'],
|
['.github/undock-releases.json'],
|
||||||
])('returns %p', async (path: string) => {
|
])('returns %o', async (path: string) => {
|
||||||
const github = new GitHub();
|
const github = new GitHub();
|
||||||
const releases = await github.releases('App', {
|
const releases = await github.releases('App', {
|
||||||
owner: 'docker',
|
owner: 'docker',
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ describe('loadArchive', () => {
|
|||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
test.each(fs.readdirSync(path.join(fixturesDir, 'oci-archive')).filter(file => {
|
test.each(fs.readdirSync(path.join(fixturesDir, 'oci-archive')).filter(file => {
|
||||||
return fs.statSync(path.join(path.join(fixturesDir, 'oci-archive'), file)).isFile();
|
return fs.statSync(path.join(path.join(fixturesDir, 'oci-archive'), file)).isFile();
|
||||||
}).map(filename => [filename]))('extracting %p', async (filename) => {
|
}).map(filename => [filename]))('extracting %o', async (filename) => {
|
||||||
const res = await OCI.loadArchive({
|
const res = await OCI.loadArchive({
|
||||||
file: path.join(fixturesDir, 'oci-archive', filename)
|
file: path.join(fixturesDir, 'oci-archive', filename)
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ describe('download', () => {
|
|||||||
['v0.8.2'],
|
['v0.8.2'],
|
||||||
['latest']
|
['latest']
|
||||||
])(
|
])(
|
||||||
'acquires %p of regclient', async (version) => {
|
'acquires %o of regclient', async (version) => {
|
||||||
const install = new Install();
|
const install = new Install();
|
||||||
const toolPath = await install.download(version);
|
const toolPath = await install.download(version);
|
||||||
expect(fs.existsSync(toolPath)).toBe(true);
|
expect(fs.existsSync(toolPath)).toBe(true);
|
||||||
@@ -49,7 +49,7 @@ describe('download', () => {
|
|||||||
// following versions are already cached to htc from previous test cases
|
// following versions are already cached to htc from previous test cases
|
||||||
['v0.8.2'],
|
['v0.8.2'],
|
||||||
])(
|
])(
|
||||||
'acquires %p of regclient with cache', async (version) => {
|
'acquires %o of regclient with cache', async (version) => {
|
||||||
const install = new Install();
|
const install = new Install();
|
||||||
const toolPath = await install.download(version);
|
const toolPath = await install.download(version);
|
||||||
expect(fs.existsSync(toolPath)).toBe(true);
|
expect(fs.existsSync(toolPath)).toBe(true);
|
||||||
@@ -59,7 +59,7 @@ describe('download', () => {
|
|||||||
test.each([
|
test.each([
|
||||||
['v0.8.1'],
|
['v0.8.1'],
|
||||||
])(
|
])(
|
||||||
'acquires %p of regclient without cache', async (version) => {
|
'acquires %o of regclient without cache', async (version) => {
|
||||||
const install = new Install();
|
const install = new Install();
|
||||||
const toolPath = await install.download(version, true);
|
const toolPath = await install.download(version, true);
|
||||||
expect(fs.existsSync(toolPath)).toBe(true);
|
expect(fs.existsSync(toolPath)).toBe(true);
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ describe('manifestGet', () => {
|
|||||||
test.each([
|
test.each([
|
||||||
['moby/moby-bin:28.1.0-rc.2'],
|
['moby/moby-bin:28.1.0-rc.2'],
|
||||||
['crazymax/diun:4.17.0'],
|
['crazymax/diun:4.17.0'],
|
||||||
])('given %p', async image => {
|
])('given %o', async image => {
|
||||||
const regctl = new Regctl();
|
const regctl = new Regctl();
|
||||||
const manifest = await regctl.manifestGet({
|
const manifest = await regctl.manifestGet({
|
||||||
image: image,
|
image: image,
|
||||||
@@ -45,7 +45,7 @@ describe('blobGet', () => {
|
|||||||
test.each([
|
test.each([
|
||||||
['moby/moby-bin', 'sha256:234fccbd13fde0ba978a19f728cbdc67e29bc76247ac560822bb6ae5236c0bf0'],
|
['moby/moby-bin', 'sha256:234fccbd13fde0ba978a19f728cbdc67e29bc76247ac560822bb6ae5236c0bf0'],
|
||||||
['crazymax/diun', 'sha256:1e4881f66e0ec0f1710b837002107050bbbc0a231d8a42d7f422b56a139900bb'],
|
['crazymax/diun', 'sha256:1e4881f66e0ec0f1710b837002107050bbbc0a231d8a42d7f422b56a139900bb'],
|
||||||
])('given %p', async (repo, digest) => {
|
])('given %o', async (repo, digest) => {
|
||||||
const regctl = new Regctl();
|
const regctl = new Regctl();
|
||||||
const blob = await regctl.blobGet({
|
const blob = await regctl.blobGet({
|
||||||
repository: repo,
|
repository: repo,
|
||||||
@@ -60,7 +60,7 @@ describe('image config', () => {
|
|||||||
test.each([
|
test.each([
|
||||||
['moby/moby-bin:28.1.0-rc.2'],
|
['moby/moby-bin:28.1.0-rc.2'],
|
||||||
['crazymax/diun:4.17.0'],
|
['crazymax/diun:4.17.0'],
|
||||||
])('given %p', async image => {
|
])('given %o', async image => {
|
||||||
const regctl = new Regctl();
|
const regctl = new Regctl();
|
||||||
const manifest = await regctl.manifestGet({
|
const manifest = await regctl.manifestGet({
|
||||||
image: image,
|
image: image,
|
||||||
@@ -115,7 +115,7 @@ describe('versionSatisfies', () => {
|
|||||||
['v0.8.2', '>=0.6.0', true],
|
['v0.8.2', '>=0.6.0', true],
|
||||||
['v0.8.0', '>0.6.0', true],
|
['v0.8.0', '>0.6.0', true],
|
||||||
['v0.8.0', '<0.3.0', false]
|
['v0.8.0', '<0.3.0', false]
|
||||||
])('given %p', async (version, range, expected) => {
|
])('given %o', async (version, range, expected) => {
|
||||||
const regctl = new Regctl();
|
const regctl = new Regctl();
|
||||||
expect(await regctl.versionSatisfies(range, version)).toBe(expected);
|
expect(await regctl.versionSatisfies(range, version)).toBe(expected);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ describe('download', () => {
|
|||||||
['v0.7.0'],
|
['v0.7.0'],
|
||||||
['latest']
|
['latest']
|
||||||
])(
|
])(
|
||||||
'acquires %p of undock', async (version) => {
|
'acquires %o of undock', async (version) => {
|
||||||
const install = new Install();
|
const install = new Install();
|
||||||
const toolPath = await install.download(version);
|
const toolPath = await install.download(version);
|
||||||
expect(fs.existsSync(toolPath)).toBe(true);
|
expect(fs.existsSync(toolPath)).toBe(true);
|
||||||
@@ -51,7 +51,7 @@ describe('download', () => {
|
|||||||
['v0.4.0'],
|
['v0.4.0'],
|
||||||
['v0.7.0'],
|
['v0.7.0'],
|
||||||
])(
|
])(
|
||||||
'acquires %p of undock with cache', async (version) => {
|
'acquires %o of undock with cache', async (version) => {
|
||||||
const install = new Install();
|
const install = new Install();
|
||||||
const toolPath = await install.download(version);
|
const toolPath = await install.download(version);
|
||||||
expect(fs.existsSync(toolPath)).toBe(true);
|
expect(fs.existsSync(toolPath)).toBe(true);
|
||||||
@@ -62,7 +62,7 @@ describe('download', () => {
|
|||||||
['v0.5.0'],
|
['v0.5.0'],
|
||||||
['v0.6.0'],
|
['v0.6.0'],
|
||||||
])(
|
])(
|
||||||
'acquires %p of undock without cache', async (version) => {
|
'acquires %o of undock without cache', async (version) => {
|
||||||
const install = new Install();
|
const install = new Install();
|
||||||
const toolPath = await install.download(version, true);
|
const toolPath = await install.download(version, true);
|
||||||
expect(fs.existsSync(toolPath)).toBe(true);
|
expect(fs.existsSync(toolPath)).toBe(true);
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ describe('versionSatisfies', () => {
|
|||||||
['v0.4.1', '>=0.3.2', true],
|
['v0.4.1', '>=0.3.2', true],
|
||||||
['v0.8.0', '>0.6.0', true],
|
['v0.8.0', '>0.6.0', true],
|
||||||
['v0.8.0', '<0.3.0', false]
|
['v0.8.0', '<0.3.0', false]
|
||||||
])('given %p', async (version, range, expected) => {
|
])('given %o', async (version, range, expected) => {
|
||||||
const undock = new Undock();
|
const undock = new Undock();
|
||||||
expect(await undock.versionSatisfies(range, version)).toBe(expected);
|
expect(await undock.versionSatisfies(range, version)).toBe(expected);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -87,6 +87,12 @@ describe('getInputList', () => {
|
|||||||
expect(res).toEqual(['foo=bar', 'bar=qux']);
|
expect(res).toEqual(['foo=bar', 'bar=qux']);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('multiline with comment and no infix comment', async () => {
|
||||||
|
setInput('labels', '# ignore this\nfoo=bar\nbar=qux#baz');
|
||||||
|
const res = Util.getInputList('labels', {comment: '#', commentNoInfix: true});
|
||||||
|
expect(res).toEqual(['foo=bar', 'bar=qux#baz']);
|
||||||
|
});
|
||||||
|
|
||||||
it('different new lines and ignoring comma correctly', async () => {
|
it('different new lines and ignoring comma correctly', async () => {
|
||||||
setInput('cache-from', 'user/app:cache\r\ntype=local,src=path/to/dir');
|
setInput('cache-from', 'user/app:cache\r\ntype=local,src=path/to/dir');
|
||||||
const res = Util.getInputList('cache-from', {ignoreComma: true});
|
const res = Util.getInputList('cache-from', {ignoreComma: true});
|
||||||
@@ -247,7 +253,7 @@ describe('isValidURL', () => {
|
|||||||
['git://github.com/user/repo.git', false],
|
['git://github.com/user/repo.git', false],
|
||||||
['github.com/moby/buildkit.git#main', false],
|
['github.com/moby/buildkit.git#main', false],
|
||||||
['v0.4.1', false]
|
['v0.4.1', false]
|
||||||
])('given %p', async (url, expected) => {
|
])('given %o', async (url, expected) => {
|
||||||
expect(Util.isValidURL(url)).toEqual(expected);
|
expect(Util.isValidURL(url)).toEqual(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -260,7 +266,7 @@ describe('isValidRef', () => {
|
|||||||
['git://github.com/user/repo.git', true],
|
['git://github.com/user/repo.git', true],
|
||||||
['github.com/moby/buildkit.git#main', true],
|
['github.com/moby/buildkit.git#main', true],
|
||||||
['v0.4.1', false]
|
['v0.4.1', false]
|
||||||
])('given %p', async (url, expected) => {
|
])('given %o', async (url, expected) => {
|
||||||
expect(Util.isValidRef(url)).toEqual(expected);
|
expect(Util.isValidRef(url)).toEqual(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -278,7 +284,7 @@ describe('trimPrefix', () => {
|
|||||||
['abcdabc', 'abc', 'dabc'],
|
['abcdabc', 'abc', 'dabc'],
|
||||||
['abcabc', 'abc', 'abc'],
|
['abcabc', 'abc', 'abc'],
|
||||||
['abcdabc', 'd', 'abcdabc']
|
['abcdabc', 'd', 'abcdabc']
|
||||||
])('given %p', async (str, prefix, expected) => {
|
])('given %o', async (str, prefix, expected) => {
|
||||||
expect(Util.trimPrefix(str, prefix)).toEqual(expected);
|
expect(Util.trimPrefix(str, prefix)).toEqual(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -295,7 +301,7 @@ describe('trimSuffix', () => {
|
|||||||
['abcdabc', 'abc', 'abcd'],
|
['abcdabc', 'abc', 'abcd'],
|
||||||
['abcabc', 'abc', 'abc'],
|
['abcabc', 'abc', 'abc'],
|
||||||
['abcdabc', 'd', 'abcdabc']
|
['abcdabc', 'd', 'abcdabc']
|
||||||
])('given %p', async (str, suffix, expected) => {
|
])('given %o', async (str, suffix, expected) => {
|
||||||
expect(Util.trimSuffix(str, suffix)).toEqual(expected);
|
expect(Util.trimSuffix(str, suffix)).toEqual(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -309,6 +315,7 @@ describe('hash', () => {
|
|||||||
// https://github.com/golang/go/blob/f6b93a4c358b28b350dd8fe1780c1f78e520c09c/src/strconv/atob_test.go#L36-L58
|
// https://github.com/golang/go/blob/f6b93a4c358b28b350dd8fe1780c1f78e520c09c/src/strconv/atob_test.go#L36-L58
|
||||||
describe('parseBool', () => {
|
describe('parseBool', () => {
|
||||||
[
|
[
|
||||||
|
{input: undefined, expected: false, throwsError: false},
|
||||||
{input: '', expected: false, throwsError: true},
|
{input: '', expected: false, throwsError: true},
|
||||||
{input: 'asdf', expected: false, throwsError: true},
|
{input: 'asdf', expected: false, throwsError: true},
|
||||||
{input: '0', expected: false, throwsError: false},
|
{input: '0', expected: false, throwsError: false},
|
||||||
@@ -336,6 +343,13 @@ describe('parseBool', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('parseBoolOrDefault', () => {
|
||||||
|
it('returns default value when input is invalid', () => {
|
||||||
|
expect(Util.parseBoolOrDefault('asdf')).toBe(false);
|
||||||
|
expect(Util.parseBoolOrDefault('asdf', true)).toBe(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('formatFileSize', () => {
|
describe('formatFileSize', () => {
|
||||||
test('should return "0 Bytes" when given 0 bytes', () => {
|
test('should return "0 Bytes" when given 0 bytes', () => {
|
||||||
expect(Util.formatFileSize(0)).toBe('0 Bytes');
|
expect(Util.formatFileSize(0)).toBe('0 Bytes');
|
||||||
|
|||||||
@@ -14,9 +14,9 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
ARG NODE_VERSION=20
|
ARG NODE_VERSION=24
|
||||||
ARG DOCKER_VERSION=29.2
|
ARG DOCKER_VERSION=29.2
|
||||||
ARG BUILDX_VERSION=0.32.0-rc1
|
ARG BUILDX_VERSION=0.32.1
|
||||||
ARG COMPOSE_VERSION=2.39.1
|
ARG COMPOSE_VERSION=2.39.1
|
||||||
ARG UNDOCK_VERSION=0.10.0
|
ARG UNDOCK_VERSION=0.10.0
|
||||||
ARG REGCTL_VERSION=v0.8.2
|
ARG REGCTL_VERSION=v0.8.2
|
||||||
|
|||||||
@@ -70,7 +70,7 @@
|
|||||||
"@types/gunzip-maybe": "^1.4.3",
|
"@types/gunzip-maybe": "^1.4.3",
|
||||||
"@types/he": "^1.2.3",
|
"@types/he": "^1.2.3",
|
||||||
"@types/js-yaml": "^4.0.9",
|
"@types/js-yaml": "^4.0.9",
|
||||||
"@types/node": "^20.19.35",
|
"@types/node": "^24.11.0",
|
||||||
"@types/semver": "^7.7.1",
|
"@types/semver": "^7.7.1",
|
||||||
"@types/tar-stream": "^3.1.4",
|
"@types/tar-stream": "^3.1.4",
|
||||||
"@types/tmp": "^0.2.6",
|
"@types/tmp": "^0.2.6",
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import * as core from '@actions/core';
|
import * as core from '@actions/core';
|
||||||
|
import * as github from '@actions/github';
|
||||||
import {parse} from 'csv-parse/sync';
|
import {parse} from 'csv-parse/sync';
|
||||||
|
|
||||||
import {Buildx} from './buildx.js';
|
import {Buildx} from './buildx.js';
|
||||||
@@ -24,7 +25,7 @@ import {Context} from '../context.js';
|
|||||||
import {GitHub} from '../github/github.js';
|
import {GitHub} from '../github/github.js';
|
||||||
import {Util} from '../util.js';
|
import {Util} from '../util.js';
|
||||||
|
|
||||||
import {BuildMetadata} from '../types/buildx/build.js';
|
import {BuildMetadata, GitContextFormat} from '../types/buildx/build.js';
|
||||||
import {VertexWarning} from '../types/buildkit/client.js';
|
import {VertexWarning} from '../types/buildkit/client.js';
|
||||||
import {ProvenancePredicate} from '../types/intoto/slsa_provenance/v0.2/provenance.js';
|
import {ProvenancePredicate} from '../types/intoto/slsa_provenance/v0.2/provenance.js';
|
||||||
|
|
||||||
@@ -48,6 +49,33 @@ export class Build {
|
|||||||
this.metadataFilename = `build-metadata-${Util.generateRandomString()}.json`;
|
this.metadataFilename = `build-metadata-${Util.generateRandomString()}.json`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async gitContext(ref?: string, sha?: string, format?: GitContextFormat): Promise<string> {
|
||||||
|
const setPullRequestHeadRef = Util.parseBoolOrDefault(process.env.DOCKER_DEFAULT_GIT_CONTEXT_PR_HEAD_REF);
|
||||||
|
ref = ref || github.context.ref;
|
||||||
|
sha = sha || github.context.sha;
|
||||||
|
if (!ref.startsWith('refs/')) {
|
||||||
|
ref = `refs/heads/${ref}`;
|
||||||
|
} else if (ref.startsWith(`refs/pull/`) && setPullRequestHeadRef) {
|
||||||
|
ref = ref.replace(/\/merge$/g, '/head');
|
||||||
|
}
|
||||||
|
const baseURL = `${GitHub.serverURL}/${github.context.repo.owner}/${github.context.repo.repo}.git`;
|
||||||
|
if (!format) {
|
||||||
|
const sendGitQueryAsInput = Util.parseBoolOrDefault(process.env.BUILDX_SEND_GIT_QUERY_AS_INPUT);
|
||||||
|
if (sendGitQueryAsInput && (await this.buildx.versionSatisfies('>=0.29.0'))) {
|
||||||
|
format = 'query';
|
||||||
|
} else {
|
||||||
|
format = 'fragment';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (format === 'query') {
|
||||||
|
return `${baseURL}?ref=${ref}${sha ? `&checksum=${sha}` : ''}`;
|
||||||
|
}
|
||||||
|
if (sha && !ref.startsWith(`refs/pull/`)) {
|
||||||
|
return `${baseURL}#${sha}`;
|
||||||
|
}
|
||||||
|
return `${baseURL}#${ref}`;
|
||||||
|
}
|
||||||
|
|
||||||
public getImageIDFilePath(): string {
|
public getImageIDFilePath(): string {
|
||||||
return path.join(Context.tmpDir(), this.iidFilename);
|
return path.join(Context.tmpDir(), this.iidFilename);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,16 +14,12 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {ChildProcessByStdio, spawn} from 'child_process';
|
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import os from 'os';
|
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import {Readable, Writable} from 'stream';
|
|
||||||
import * as core from '@actions/core';
|
import * as core from '@actions/core';
|
||||||
|
|
||||||
import {Buildx} from './buildx.js';
|
import {Buildx} from './buildx.js';
|
||||||
import {Context} from '../context.js';
|
import {Context} from '../context.js';
|
||||||
import {Docker} from '../docker/docker.js';
|
|
||||||
import {Exec} from '../exec.js';
|
import {Exec} from '../exec.js';
|
||||||
import {GitHub} from '../github/github.js';
|
import {GitHub} from '../github/github.js';
|
||||||
import {Util} from '../util.js';
|
import {Util} from '../util.js';
|
||||||
@@ -74,6 +70,10 @@ export class History {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async export(opts: ExportOpts): Promise<ExportResponse> {
|
public async export(opts: ExportOpts): Promise<ExportResponse> {
|
||||||
|
if (!(await this.buildx.versionSatisfies('>=0.23.0'))) {
|
||||||
|
throw new Error('Buildx >= 0.23.0 is required to export a build record');
|
||||||
|
}
|
||||||
|
|
||||||
let builderName: string = '';
|
let builderName: string = '';
|
||||||
let nodeName: string = '';
|
let nodeName: string = '';
|
||||||
const refs: Array<string> = [];
|
const refs: Array<string> = [];
|
||||||
@@ -101,10 +101,6 @@ export class History {
|
|||||||
core.info(`exporting build record to ${outDir}`);
|
core.info(`exporting build record to ${outDir}`);
|
||||||
fs.mkdirSync(outDir, {recursive: true});
|
fs.mkdirSync(outDir, {recursive: true});
|
||||||
|
|
||||||
if (opts.useContainer || (await this.buildx.versionSatisfies('<0.23.0'))) {
|
|
||||||
return await this.exportLegacy(builderName, nodeName, refs, outDir, opts.image);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (await this.buildx.versionSatisfies('<0.24.0')) {
|
if (await this.buildx.versionSatisfies('<0.24.0')) {
|
||||||
// wait 3 seconds to ensure build records are finalized: https://github.com/moby/buildkit/pull/5109
|
// wait 3 seconds to ensure build records are finalized: https://github.com/moby/buildkit/pull/5109
|
||||||
// not necessary since buildx 0.24.0: https://github.com/docker/buildx/pull/3152
|
// not necessary since buildx 0.24.0: https://github.com/docker/buildx/pull/3152
|
||||||
@@ -162,143 +158,6 @@ export class History {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private async exportLegacy(builderName: string, nodeName: string, refs: Array<string>, outDir: string, image?: string): Promise<ExportResponse> {
|
|
||||||
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 needs to be running to export a build record');
|
|
||||||
}
|
|
||||||
if (!(await this.buildx.versionSatisfies('>=0.13.0'))) {
|
|
||||||
throw new Error('Buildx >= 0.13.0 is required to export a build record');
|
|
||||||
}
|
|
||||||
|
|
||||||
// wait 3 seconds to ensure build records are finalized: https://github.com/moby/buildkit/pull/5109
|
|
||||||
await Util.sleep(3);
|
|
||||||
|
|
||||||
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`,
|
|
||||||
image || process.env['DOCKER_BUILD_EXPORT_BUILD_IMAGE'] || 'docker.io/dockereng/export-build:latest',
|
|
||||||
...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');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const dockerbuildPath = path.join(outDir, `${History.exportFilename(refs)}.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,
|
|
||||||
builderName: builderName,
|
|
||||||
nodeName: nodeName,
|
|
||||||
refs: refs,
|
|
||||||
summaries: summaries
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private static exportFilename(refs: Array<string>): string {
|
private static exportFilename(refs: Array<string>): string {
|
||||||
let name = `${GitHub.context.repo.owner}~${GitHub.context.repo.repo}~${refs[0].substring(0, 6).toUpperCase()}`;
|
let name = `${GitHub.context.repo.owner}~${GitHub.context.repo.repo}~${refs[0].substring(0, 6).toUpperCase()}`;
|
||||||
if (refs.length > 1) {
|
if (refs.length > 1) {
|
||||||
|
|||||||
@@ -14,10 +14,14 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import fs from 'fs';
|
||||||
|
import * as core from '@actions/core';
|
||||||
|
|
||||||
import {Buildx} from './buildx.js';
|
import {Buildx} from './buildx.js';
|
||||||
|
import {Context} from '../context.js';
|
||||||
import {Exec} from '../exec.js';
|
import {Exec} from '../exec.js';
|
||||||
|
|
||||||
import {Manifest as ImageToolsManifest} from '../types/buildx/imagetools.js';
|
import {CreateOpts, CreateResponse, CreateResult, Manifest as ImageToolsManifest} from '../types/buildx/imagetools.js';
|
||||||
import {Image} from '../types/oci/config.js';
|
import {Image} from '../types/oci/config.js';
|
||||||
import {Descriptor, Platform} from '../types/oci/descriptor.js';
|
import {Descriptor, Platform} from '../types/oci/descriptor.js';
|
||||||
import {Digest} from '../types/oci/digest.js';
|
import {Digest} from '../types/oci/digest.js';
|
||||||
@@ -41,6 +45,10 @@ export class ImageTools {
|
|||||||
return await this.getCommand(['inspect', ...args]);
|
return await this.getCommand(['inspect', ...args]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async getCreateCommand(args: Array<string>) {
|
||||||
|
return await this.getCommand(['create', ...args]);
|
||||||
|
}
|
||||||
|
|
||||||
public async inspectImage(name: string): Promise<Record<string, Image> | Image> {
|
public async inspectImage(name: string): Promise<Record<string, Image> | Image> {
|
||||||
const cmd = await this.getInspectCommand([name, '--format', '{{json .Image}}']);
|
const cmd = await this.getInspectCommand([name, '--format', '{{json .Image}}']);
|
||||||
return await Exec.getExecOutput(cmd.command, cmd.args, {
|
return await Exec.getExecOutput(cmd.command, cmd.args, {
|
||||||
@@ -118,4 +126,78 @@ export class ImageTools {
|
|||||||
public async attestationDigests(name: string, platform?: Platform): Promise<Array<Digest>> {
|
public async attestationDigests(name: string, platform?: Platform): Promise<Array<Digest>> {
|
||||||
return (await this.attestationDescriptors(name, platform)).map(attestation => attestation.digest);
|
return (await this.attestationDescriptors(name, platform)).map(attestation => attestation.digest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async create(opts: CreateOpts): Promise<CreateResult | undefined> {
|
||||||
|
const args: Array<string> = [];
|
||||||
|
|
||||||
|
const metadataFile = Context.tmpName({tmpdir: Context.tmpDir(), template: 'imagetools-metadata-XXXXXX'});
|
||||||
|
const fileSources: Array<string> = [];
|
||||||
|
const sources: Array<string> = [];
|
||||||
|
for (const source of opts.sources) {
|
||||||
|
if (source.startsWith('cwd://')) {
|
||||||
|
const fileSource = source.substring('cwd://'.length);
|
||||||
|
if (fileSource.length > 0) {
|
||||||
|
fileSources.push(fileSource);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
sources.push(source);
|
||||||
|
}
|
||||||
|
if (opts.tags) {
|
||||||
|
for (const tag of opts.tags) {
|
||||||
|
args.push('--tag', tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (opts.platforms) {
|
||||||
|
for (const platform of opts.platforms) {
|
||||||
|
args.push('--platform', platform);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (opts.dryRun) {
|
||||||
|
args.push('--dry-run');
|
||||||
|
} else {
|
||||||
|
args.push('--metadata-file', metadataFile);
|
||||||
|
}
|
||||||
|
for (const fileSource of fileSources) {
|
||||||
|
args.push('--file', fileSource);
|
||||||
|
}
|
||||||
|
for (const source of sources) {
|
||||||
|
args.push(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
const cmd = await this.getCreateCommand(args);
|
||||||
|
if (opts.skipExec) {
|
||||||
|
core.info(`[command]${cmd.command} ${cmd.args.join(' ')}`);
|
||||||
|
core.info(`Skipped create command`);
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
return await Exec.getExecOutput(cmd.command, cmd.args, {
|
||||||
|
ignoreReturnCode: true,
|
||||||
|
silent: opts.silent
|
||||||
|
}).then(res => {
|
||||||
|
if (res.stderr.length > 0 && res.exitCode != 0) {
|
||||||
|
throw new Error(res.stderr.trim());
|
||||||
|
}
|
||||||
|
if (!opts.dryRun) {
|
||||||
|
if (!fs.existsSync(metadataFile)) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
const dt = fs.readFileSync(metadataFile, {encoding: 'utf-8'}).trim();
|
||||||
|
if (dt === '' || dt === 'null') {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
const response = <CreateResponse>JSON.parse(dt);
|
||||||
|
const descriptor = response['containerimage.descriptor'];
|
||||||
|
if (!descriptor) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
digest: response['containerimage.digest'] || descriptor.digest,
|
||||||
|
descriptor: descriptor,
|
||||||
|
imageNames: response['image.name'] ? response['image.name'].split(',').map(name => name.trim()) : []
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,9 +18,6 @@ import fs from 'fs';
|
|||||||
import os from 'os';
|
import os from 'os';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import * as tmp from 'tmp';
|
import * as tmp from 'tmp';
|
||||||
import * as github from '@actions/github';
|
|
||||||
|
|
||||||
import {GitHub} from './github/github.js';
|
|
||||||
|
|
||||||
export class Context {
|
export class Context {
|
||||||
private static readonly _tmpDir = fs.mkdtempSync(path.join(Context.ensureDirExists(process.env.RUNNER_TEMP || os.tmpdir()), 'docker-actions-toolkit-'));
|
private static readonly _tmpDir = fs.mkdtempSync(path.join(Context.ensureDirExists(process.env.RUNNER_TEMP || os.tmpdir()), 'docker-actions-toolkit-'));
|
||||||
@@ -37,25 +34,4 @@ export class Context {
|
|||||||
public static tmpName(options?: tmp.TmpNameOptions): string {
|
public static tmpName(options?: tmp.TmpNameOptions): string {
|
||||||
return tmp.tmpNameSync(options);
|
return tmp.tmpNameSync(options);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static gitRef(): string {
|
|
||||||
return Context.parseGitRef(github.context.ref, github.context.sha);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static parseGitRef(ref: string, sha: string): string {
|
|
||||||
const setPullRequestHeadRef: boolean = !!(process.env.DOCKER_DEFAULT_GIT_CONTEXT_PR_HEAD_REF && process.env.DOCKER_DEFAULT_GIT_CONTEXT_PR_HEAD_REF === 'true');
|
|
||||||
if (sha && ref && !ref.startsWith('refs/')) {
|
|
||||||
ref = `refs/heads/${ref}`;
|
|
||||||
}
|
|
||||||
if (sha && !ref.startsWith(`refs/pull/`)) {
|
|
||||||
ref = sha;
|
|
||||||
} else if (ref.startsWith(`refs/pull/`) && setPullRequestHeadRef) {
|
|
||||||
ref = ref.replace(/\/merge$/g, '/head');
|
|
||||||
}
|
|
||||||
return ref;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static gitContext(): string {
|
|
||||||
return `${GitHub.serverURL}/${github.context.repo.owner}/${github.context.repo.repo}.git#${Context.gitRef()}`;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,8 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
export type GitContextFormat = 'fragment' | 'query';
|
||||||
|
|
||||||
export type BuildMetadata = {
|
export type BuildMetadata = {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
[key: string]: any;
|
[key: string]: any;
|
||||||
|
|||||||
@@ -107,7 +107,6 @@ export interface ExportOpts {
|
|||||||
refs: Array<string>;
|
refs: Array<string>;
|
||||||
noSummaries?: boolean;
|
noSummaries?: boolean;
|
||||||
image?: string;
|
image?: string;
|
||||||
useContainer?: boolean;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ExportResponse {
|
export interface ExportResponse {
|
||||||
|
|||||||
@@ -26,3 +26,25 @@ export interface Manifest extends Versioned {
|
|||||||
manifests?: Descriptor[];
|
manifests?: Descriptor[];
|
||||||
annotations?: Record<string, string>;
|
annotations?: Record<string, string>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://docs.docker.com/reference/cli/docker/buildx/imagetools/create/#options
|
||||||
|
export interface CreateOpts {
|
||||||
|
sources: Array<string>;
|
||||||
|
tags?: Array<string>;
|
||||||
|
platforms?: Array<string>;
|
||||||
|
dryRun?: boolean;
|
||||||
|
silent?: boolean;
|
||||||
|
skipExec?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CreateResponse {
|
||||||
|
'containerimage.digest'?: Digest;
|
||||||
|
'containerimage.descriptor'?: Descriptor;
|
||||||
|
'image.name'?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CreateResult {
|
||||||
|
digest: Digest;
|
||||||
|
descriptor: Descriptor;
|
||||||
|
imageNames: Array<string>;
|
||||||
|
}
|
||||||
|
|||||||
15
src/util.ts
15
src/util.ts
@@ -24,6 +24,7 @@ import {parse} from 'csv-parse/sync';
|
|||||||
export interface ListOpts {
|
export interface ListOpts {
|
||||||
ignoreComma?: boolean;
|
ignoreComma?: boolean;
|
||||||
comment?: string;
|
comment?: string;
|
||||||
|
commentNoInfix?: boolean;
|
||||||
quote?: string | boolean | Buffer | null;
|
quote?: string | boolean | Buffer | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,6 +43,7 @@ export class Util {
|
|||||||
columns: false,
|
columns: false,
|
||||||
relaxQuotes: true,
|
relaxQuotes: true,
|
||||||
comment: opts?.comment,
|
comment: opts?.comment,
|
||||||
|
comment_no_infix: opts?.commentNoInfix,
|
||||||
relaxColumnCount: true,
|
relaxColumnCount: true,
|
||||||
skipEmptyLines: true,
|
skipEmptyLines: true,
|
||||||
quote: opts?.quote
|
quote: opts?.quote
|
||||||
@@ -155,7 +157,10 @@ export class Util {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// https://github.com/golang/go/blob/f6b93a4c358b28b350dd8fe1780c1f78e520c09c/src/strconv/atob.go#L7-L18
|
// https://github.com/golang/go/blob/f6b93a4c358b28b350dd8fe1780c1f78e520c09c/src/strconv/atob.go#L7-L18
|
||||||
public static parseBool(str: string): boolean {
|
public static parseBool(str: string | undefined): boolean {
|
||||||
|
if (str === undefined) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
switch (str) {
|
switch (str) {
|
||||||
case '1':
|
case '1':
|
||||||
case 't':
|
case 't':
|
||||||
@@ -176,6 +181,14 @@ export class Util {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static parseBoolOrDefault(str: string | undefined, defaultValue = false): boolean {
|
||||||
|
try {
|
||||||
|
return this.parseBool(str);
|
||||||
|
} catch {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static formatFileSize(bytes: number): string {
|
public static formatFileSize(bytes: number): string {
|
||||||
if (bytes === 0) return '0 Bytes';
|
if (bytes === 0) return '0 Bytes';
|
||||||
const k = 1024;
|
const k = 1024;
|
||||||
|
|||||||
20
yarn.lock
20
yarn.lock
@@ -386,7 +386,7 @@ __metadata:
|
|||||||
"@types/gunzip-maybe": "npm:^1.4.3"
|
"@types/gunzip-maybe": "npm:^1.4.3"
|
||||||
"@types/he": "npm:^1.2.3"
|
"@types/he": "npm:^1.2.3"
|
||||||
"@types/js-yaml": "npm:^4.0.9"
|
"@types/js-yaml": "npm:^4.0.9"
|
||||||
"@types/node": "npm:^20.19.35"
|
"@types/node": "npm:^24.11.0"
|
||||||
"@types/semver": "npm:^7.7.1"
|
"@types/semver": "npm:^7.7.1"
|
||||||
"@types/tar-stream": "npm:^3.1.4"
|
"@types/tar-stream": "npm:^3.1.4"
|
||||||
"@types/tmp": "npm:^0.2.6"
|
"@types/tmp": "npm:^0.2.6"
|
||||||
@@ -1368,12 +1368,12 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@types/node@npm:^20.19.35":
|
"@types/node@npm:^24.11.0":
|
||||||
version: 20.19.35
|
version: 24.11.0
|
||||||
resolution: "@types/node@npm:20.19.35"
|
resolution: "@types/node@npm:24.11.0"
|
||||||
dependencies:
|
dependencies:
|
||||||
undici-types: "npm:~6.21.0"
|
undici-types: "npm:~7.16.0"
|
||||||
checksum: 10/f14fa74f9ae4d1109d8a8e3ec31b6518122b3d31c28fd5725cb3eef8ff64d7cf6f8da9c84c78b512e2968006ec325c82a413cc2062da7b3c3230c882e88babba
|
checksum: 10/d2f4f898c6a0f14980e55c697904fb58681729fc46b4e264d5f64dc391b23da73c9b422cfffbca28c045e6e8eca72dab5f28ed633faa95398ef1528af5398382
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@@ -4781,10 +4781,10 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"undici-types@npm:~6.21.0":
|
"undici-types@npm:~7.16.0":
|
||||||
version: 6.21.0
|
version: 7.16.0
|
||||||
resolution: "undici-types@npm:6.21.0"
|
resolution: "undici-types@npm:7.16.0"
|
||||||
checksum: 10/ec8f41aa4359d50f9b59fa61fe3efce3477cc681908c8f84354d8567bb3701fafdddf36ef6bff307024d3feb42c837cf6f670314ba37fc8145e219560e473d14
|
checksum: 10/db43439f69c2d94cc29f75cbfe9de86df87061d6b0c577ebe9bb3255f49b22c50162a7d7eb413b0458b6510b8ca299ac7cff38c3a29fbd31af9f504bcf7fbc0d
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user