Compare commits
211 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ff509b09e3 | ||
|
|
794148e937 | ||
|
|
68fd63a69e | ||
|
|
a619d07b13 | ||
|
|
7a2707542f | ||
|
|
b9e1a8724d | ||
|
|
68633e712c | ||
|
|
8a5874c915 | ||
|
|
121f70dc94 | ||
|
|
ad06f2a639 | ||
|
|
b6da7a2050 | ||
|
|
bb3b1ba599 | ||
|
|
ea697eb50e | ||
|
|
7b4015430d | ||
|
|
1bfdd1d8c0 | ||
|
|
c7a53cd33e | ||
|
|
976ef75074 | ||
|
|
b23c9810de | ||
|
|
5ab8d39173 | ||
|
|
fec5979e2a | ||
|
|
edf0c6e0df | ||
|
|
41439563c4 | ||
|
|
5e5ef36a8e | ||
|
|
c09122e635 | ||
|
|
aa82a2fc79 | ||
|
|
bcb7741d19 | ||
|
|
58866dcebd | ||
|
|
09bf2161e9 | ||
|
|
6f40bf1fe2 | ||
|
|
04e7d5416b | ||
|
|
4dc0686a1f | ||
|
|
5a20e819d2 | ||
|
|
be98587238 | ||
|
|
d1f4283ae5 | ||
|
|
fccce81f9c | ||
|
|
0e821a0c1f | ||
|
|
a4f2334d09 | ||
|
|
b2c080aba3 | ||
|
|
6d5e976102 | ||
|
|
a874a29054 | ||
|
|
feaf48d463 | ||
|
|
ce74df3e8c | ||
|
|
3d078e8211 | ||
|
|
43f27ccecf | ||
|
|
4731c96418 | ||
|
|
e1c74199da | ||
|
|
e12c042e86 | ||
|
|
f630d6c05e | ||
|
|
5dba2fe582 | ||
|
|
fea2daff92 | ||
|
|
28314383db | ||
|
|
495227c371 | ||
|
|
232976be61 | ||
|
|
c8b99c2422 | ||
|
|
044181df46 | ||
|
|
990a226a96 | ||
|
|
238b35d5ec | ||
|
|
70df5c1471 | ||
|
|
94a5190281 | ||
|
|
81aefc93a4 | ||
|
|
3b90a8be48 | ||
|
|
bc8619386e | ||
|
|
34677a2e0a | ||
|
|
46ff1377e2 | ||
|
|
59501e62b4 | ||
|
|
fa8b332d39 | ||
|
|
1a0e910dd6 | ||
|
|
ce1befb3f6 | ||
|
|
edd4df2160 | ||
|
|
052fb0d672 | ||
|
|
b7b0b4c90e | ||
|
|
6ddae4e63e | ||
|
|
01c877d58f | ||
|
|
53963b9b70 | ||
|
|
c04b6bed97 | ||
|
|
3f7ebbd664 | ||
|
|
7361719af0 | ||
|
|
dc66f26c9f | ||
|
|
b14c41d999 | ||
|
|
9209bef96d | ||
|
|
f473a29cad | ||
|
|
1f0b6fae3c | ||
|
|
447ec66e02 | ||
|
|
d3a8ffa1b2 | ||
|
|
204c4d7e38 | ||
|
|
201d5c7c28 | ||
|
|
6c78ea88af | ||
|
|
6da579582a | ||
|
|
62a0cec76c | ||
|
|
f3e619ac0d | ||
|
|
86e6d2d813 | ||
|
|
3f928383ff | ||
|
|
1b5a7ad8cb | ||
|
|
b381f09fbb | ||
|
|
88374b9d89 | ||
|
|
2eb7c42ef6 | ||
|
|
c87163fbe4 | ||
|
|
e9c2b861e8 | ||
|
|
be2b07b476 | ||
|
|
e6e9ee8c00 | ||
|
|
fa1fc6bf68 | ||
|
|
21d9e67d3d | ||
|
|
aaaec24fee | ||
|
|
739fe4a80c | ||
|
|
8c4124d200 | ||
|
|
76c63e19da | ||
|
|
ace326f534 | ||
|
|
d439fcbe10 | ||
|
|
5891a8ba9c | ||
|
|
c574cb7c80 | ||
|
|
091de209c9 | ||
|
|
c369f5eabd | ||
|
|
bad91fef5a | ||
|
|
eec732af11 | ||
|
|
6ddef8a463 | ||
|
|
1de251545a | ||
|
|
af76018577 | ||
|
|
7c54b0d570 | ||
|
|
977644b1c4 | ||
|
|
d5da34a80b | ||
|
|
de3328fb33 | ||
|
|
391c776af6 | ||
|
|
8d2c24dd89 | ||
|
|
43b8598a0b | ||
|
|
5a96697651 | ||
|
|
02d0feb7df | ||
|
|
b5f9106e08 | ||
|
|
f93cd6712c | ||
|
|
6cd97b3669 | ||
|
|
4a13975fd1 | ||
|
|
97a949444d | ||
|
|
77e52fe6b0 | ||
|
|
60f9b4c28d | ||
|
|
2a091a2c69 | ||
|
|
62397de881 | ||
|
|
834b79b6b3 | ||
|
|
a83640a03c | ||
|
|
ec774f564b | ||
|
|
51a104851d | ||
|
|
af36b73f0f | ||
|
|
4e27e0c148 | ||
|
|
17de3961ec | ||
|
|
5ec79aa91e | ||
|
|
fd005ff6bd | ||
|
|
44525b4c00 | ||
|
|
c1a823ad97 | ||
|
|
2a3bfd0f48 | ||
|
|
4ecc47d56a | ||
|
|
9408be1597 | ||
|
|
a66547715c | ||
|
|
d6de3818d5 | ||
|
|
3b8fc6d50c | ||
|
|
67d9ba86a9 | ||
|
|
ea9281e5c7 | ||
|
|
9692462ba3 | ||
|
|
278be13d5c | ||
|
|
a50587eea4 | ||
|
|
b279e571bd | ||
|
|
4a3bd8a107 | ||
|
|
d81b8b7eba | ||
|
|
7e6c67aea2 | ||
|
|
9a44e6e916 | ||
|
|
c91976e40d | ||
|
|
04d9e88a88 | ||
|
|
bf532ecbf3 | ||
|
|
e9b479a6b6 | ||
|
|
1cacc175a5 | ||
|
|
4d25d37a04 | ||
|
|
814ebfcf9c | ||
|
|
cce3bda2c4 | ||
|
|
752172b953 | ||
|
|
da806c7a72 | ||
|
|
e7b2ffaa07 | ||
|
|
d1d0bdb690 | ||
|
|
aebb71c0a7 | ||
|
|
26d4e15b95 | ||
|
|
d749a37a94 | ||
|
|
eb73b82786 | ||
|
|
076df0c172 | ||
|
|
43e4bfc11b | ||
|
|
43319f41b9 | ||
|
|
d6e7855c71 | ||
|
|
96fbf6ca32 | ||
|
|
39e9b0e5c1 | ||
|
|
0804e7ee73 | ||
|
|
568184333d | ||
|
|
5caa3ec458 | ||
|
|
3c328a53eb | ||
|
|
2c62255f2d | ||
|
|
ed7e9a44e0 | ||
|
|
dd0f91b30b | ||
|
|
5c369b71ab | ||
|
|
8ac9d9c3bd | ||
|
|
c6b95cb147 | ||
|
|
4b7b2c4fd1 | ||
|
|
ea42e3a061 | ||
|
|
0bcd5b25a2 | ||
|
|
4b68aa828a | ||
|
|
ba8d872626 | ||
|
|
2ecc3150d2 | ||
|
|
5bc1041760 | ||
|
|
ed5ad08108 | ||
|
|
acc213a00a | ||
|
|
e6e18dee25 | ||
|
|
d9bd2d45ba | ||
|
|
1229986252 | ||
|
|
2925ff2bef | ||
|
|
41bd4c9503 | ||
|
|
b93cb9e902 | ||
|
|
6e5cf7117a | ||
|
|
f3bf577877 |
1133
.github/buildx-lab-releases.json
vendored
1133
.github/buildx-lab-releases.json
vendored
File diff suppressed because it is too large
Load Diff
1039
.github/buildx-releases.json
vendored
1039
.github/buildx-releases.json
vendored
File diff suppressed because it is too large
Load Diff
1060
.github/compose-lab-releases.json
vendored
Normal file
1060
.github/compose-lab-releases.json
vendored
Normal file
File diff suppressed because it is too large
Load Diff
421
.github/compose-releases.json
vendored
421
.github/compose-releases.json
vendored
@@ -1,35 +1,320 @@
|
|||||||
{
|
{
|
||||||
"latest": {
|
"latest": {
|
||||||
"id": 194965790,
|
"id": 213118897,
|
||||||
"tag_name": "v2.32.4",
|
"tag_name": "v2.35.1",
|
||||||
"html_url": "https://github.com/docker/compose/releases/tag/v2.32.4",
|
"html_url": "https://github.com/docker/compose/releases/tag/v2.35.1",
|
||||||
"assets": [
|
"assets": [
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/LICENSE",
|
"https://github.com/docker/compose/releases/download/v2.35.1/LICENSE",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/checksums.txt",
|
"https://github.com/docker/compose/releases/download/v2.35.1/checksums.txt",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-darwin-aarch64",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-aarch64",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-darwin-aarch64.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-aarch64.provenance.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-darwin-x86_64",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-aarch64.sbom.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-darwin-x86_64.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-aarch64.sha256",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-aarch64",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-x86_64",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-aarch64.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-x86_64.provenance.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-armv6",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-x86_64.sbom.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-armv6.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-x86_64.sha256",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-armv7",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-aarch64",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-armv7.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-aarch64.provenance.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-ppc64le",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-aarch64.sbom.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-ppc64le.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-aarch64.sha256",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-riscv64",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv6",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-riscv64.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv6.provenance.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-s390x",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv6.sbom.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-s390x.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv6.sha256",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-x86_64",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv7",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-x86_64.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv7.provenance.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-windows-aarch64.exe",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv7.sbom.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-windows-aarch64.exe.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv7.sha256",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-windows-x86_64.exe",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-ppc64le",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-windows-x86_64.exe.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-ppc64le.provenance.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/provenance.json",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-ppc64le.sbom.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/provenance.json.sha256"
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-ppc64le.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-riscv64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-riscv64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-riscv64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-riscv64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-s390x",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-s390x.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-s390x.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-s390x.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-x86_64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-x86_64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-x86_64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-x86_64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-aarch64.exe",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-aarch64.exe.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-aarch64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-aarch64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-x86_64.exe",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-x86_64.exe.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-x86_64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-x86_64.sbom.json"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"v2.35.1": {
|
||||||
|
"id": 213118897,
|
||||||
|
"tag_name": "v2.35.1",
|
||||||
|
"html_url": "https://github.com/docker/compose/releases/tag/v2.35.1",
|
||||||
|
"assets": [
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/LICENSE",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/checksums.txt",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-aarch64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-aarch64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-aarch64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-aarch64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-x86_64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-x86_64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-x86_64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-x86_64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-aarch64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-aarch64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-aarch64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-aarch64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv6",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv6.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv6.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv6.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv7",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv7.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv7.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv7.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-ppc64le",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-ppc64le.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-ppc64le.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-ppc64le.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-riscv64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-riscv64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-riscv64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-riscv64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-s390x",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-s390x.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-s390x.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-s390x.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-x86_64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-x86_64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-x86_64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-x86_64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-aarch64.exe",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-aarch64.exe.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-aarch64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-aarch64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-x86_64.exe",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-x86_64.exe.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-x86_64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-x86_64.sbom.json"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"v2.35.0": {
|
||||||
|
"id": 211546500,
|
||||||
|
"tag_name": "v2.35.0",
|
||||||
|
"html_url": "https://github.com/docker/compose/releases/tag/v2.35.0",
|
||||||
|
"assets": [
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/LICENSE",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/checksums.txt",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-darwin-aarch64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-darwin-aarch64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-darwin-aarch64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-darwin-aarch64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-darwin-x86_64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-darwin-x86_64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-darwin-x86_64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-darwin-x86_64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-aarch64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-aarch64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-aarch64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-aarch64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-armv6",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-armv6.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-armv6.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-armv6.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-armv7",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-armv7.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-armv7.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-armv7.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-ppc64le",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-ppc64le.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-ppc64le.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-ppc64le.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-riscv64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-riscv64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-riscv64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-riscv64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-s390x",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-s390x.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-s390x.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-s390x.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-x86_64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-x86_64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-x86_64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-linux-x86_64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-windows-aarch64.exe",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-windows-aarch64.exe.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-windows-aarch64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-windows-aarch64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-windows-x86_64.exe",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-windows-x86_64.exe.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-windows-x86_64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.0/docker-compose-windows-x86_64.sbom.json"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"v2.34.0": {
|
||||||
|
"id": 205630343,
|
||||||
|
"tag_name": "v2.34.0",
|
||||||
|
"html_url": "https://github.com/docker/compose/releases/tag/v2.34.0",
|
||||||
|
"assets": [
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/LICENSE",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/checksums.txt",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-darwin-aarch64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-darwin-aarch64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-darwin-aarch64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-darwin-aarch64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-darwin-x86_64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-darwin-x86_64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-darwin-x86_64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-darwin-x86_64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-aarch64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-aarch64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-aarch64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-aarch64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-armv6",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-armv6.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-armv6.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-armv6.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-armv7",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-armv7.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-armv7.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-armv7.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-ppc64le",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-ppc64le.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-ppc64le.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-ppc64le.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-riscv64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-riscv64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-riscv64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-riscv64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-s390x",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-s390x.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-s390x.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-s390x.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-x86_64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-x86_64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-x86_64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-x86_64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-windows-aarch64.exe",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-windows-aarch64.exe.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-windows-aarch64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-windows-aarch64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-windows-x86_64.exe",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-windows-x86_64.exe.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-windows-x86_64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-windows-x86_64.sbom.json"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"v2.33.1": {
|
||||||
|
"id": 201696564,
|
||||||
|
"tag_name": "v2.33.1",
|
||||||
|
"html_url": "https://github.com/docker/compose/releases/tag/v2.33.1",
|
||||||
|
"assets": [
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/LICENSE",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/checksums.txt",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-darwin-aarch64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-darwin-aarch64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-darwin-aarch64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-darwin-aarch64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-darwin-x86_64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-darwin-x86_64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-darwin-x86_64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-darwin-x86_64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-aarch64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-aarch64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-aarch64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-aarch64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-armv6",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-armv6.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-armv6.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-armv6.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-armv7",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-armv7.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-armv7.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-armv7.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-ppc64le",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-ppc64le.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-ppc64le.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-ppc64le.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-riscv64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-riscv64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-riscv64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-riscv64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-s390x",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-s390x.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-s390x.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-s390x.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-x86_64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-x86_64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-x86_64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-linux-x86_64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-windows-aarch64.exe",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-windows-aarch64.exe.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-windows-aarch64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-windows-aarch64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-windows-x86_64.exe",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-windows-x86_64.exe.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-windows-x86_64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.1/docker-compose-windows-x86_64.sbom.json"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"v2.33.0": {
|
||||||
|
"id": 199781357,
|
||||||
|
"tag_name": "v2.33.0",
|
||||||
|
"html_url": "https://github.com/docker/compose/releases/tag/v2.33.0",
|
||||||
|
"assets": [
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/LICENSE",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/checksums.txt",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-darwin-aarch64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-darwin-aarch64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-darwin-aarch64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-darwin-aarch64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-darwin-x86_64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-darwin-x86_64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-darwin-x86_64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-darwin-x86_64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-aarch64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-aarch64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-aarch64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-aarch64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-armv6",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-armv6.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-armv6.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-armv6.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-armv7",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-armv7.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-armv7.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-armv7.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-ppc64le",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-ppc64le.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-ppc64le.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-ppc64le.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-riscv64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-riscv64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-riscv64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-riscv64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-s390x",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-s390x.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-s390x.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-s390x.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-x86_64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-x86_64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-x86_64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-linux-x86_64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-windows-aarch64.exe",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-windows-aarch64.exe.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-windows-aarch64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-windows-aarch64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-windows-x86_64.exe",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-windows-x86_64.exe.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-windows-x86_64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.33.0/docker-compose-windows-x86_64.sbom.json"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"v2.32.4": {
|
"v2.32.4": {
|
||||||
@@ -1124,36 +1409,56 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"edge": {
|
"edge": {
|
||||||
"id": 194965790,
|
"id": 213118897,
|
||||||
"tag_name": "v2.32.4",
|
"tag_name": "v2.35.1",
|
||||||
"html_url": "https://github.com/docker/compose/releases/tag/v2.32.4",
|
"html_url": "https://github.com/docker/compose/releases/tag/v2.35.1",
|
||||||
"assets": [
|
"assets": [
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/LICENSE",
|
"https://github.com/docker/compose/releases/download/v2.35.1/LICENSE",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/checksums.txt",
|
"https://github.com/docker/compose/releases/download/v2.35.1/checksums.txt",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-darwin-aarch64",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-aarch64",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-darwin-aarch64.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-aarch64.provenance.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-darwin-x86_64",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-aarch64.sbom.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-darwin-x86_64.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-aarch64.sha256",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-aarch64",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-x86_64",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-aarch64.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-x86_64.provenance.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-armv6",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-x86_64.sbom.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-armv6.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-darwin-x86_64.sha256",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-armv7",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-aarch64",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-armv7.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-aarch64.provenance.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-ppc64le",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-aarch64.sbom.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-ppc64le.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-aarch64.sha256",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-riscv64",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv6",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-riscv64.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv6.provenance.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-s390x",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv6.sbom.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-s390x.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv6.sha256",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-x86_64",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv7",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-x86_64.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv7.provenance.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-windows-aarch64.exe",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv7.sbom.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-windows-aarch64.exe.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-armv7.sha256",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-windows-x86_64.exe",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-ppc64le",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-windows-x86_64.exe.sha256",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-ppc64le.provenance.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/provenance.json",
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-ppc64le.sbom.json",
|
||||||
"https://github.com/docker/compose/releases/download/v2.32.4/provenance.json.sha256"
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-ppc64le.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-riscv64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-riscv64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-riscv64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-riscv64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-s390x",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-s390x.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-s390x.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-s390x.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-x86_64",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-x86_64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-x86_64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-linux-x86_64.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-aarch64.exe",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-aarch64.exe.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-aarch64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-aarch64.sbom.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-x86_64.exe",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-x86_64.exe.sha256",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-x86_64.provenance.json",
|
||||||
|
"https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-windows-x86_64.sbom.json"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"v2.24.0-birthday.10": {
|
"v2.24.0-birthday.10": {
|
||||||
|
|||||||
98
.github/docker-releases.json
vendored
98
.github/docker-releases.json
vendored
@@ -1,17 +1,101 @@
|
|||||||
{
|
{
|
||||||
"latest": {
|
"latest": {
|
||||||
"id": 194138446,
|
"id": 213296967,
|
||||||
"tag_name": "v27.5.0",
|
"tag_name": "v28.1.1",
|
||||||
"html_url": "https://github.com/moby/moby/releases/tag/v27.5.0",
|
"html_url": "https://github.com/moby/moby/releases/tag/v28.1.1",
|
||||||
"assets": []
|
"assets": []
|
||||||
},
|
},
|
||||||
"v27.5.0": {
|
"v28.1.1": {
|
||||||
"id": 194138446,
|
"id": 213296967,
|
||||||
"tag_name": "v27.5.0",
|
"tag_name": "v28.1.1",
|
||||||
"html_url": "https://github.com/moby/moby/releases/tag/v27.5.0",
|
"html_url": "https://github.com/moby/moby/releases/tag/v28.1.1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v28.1.0": {
|
||||||
|
"id": 213053128,
|
||||||
|
"tag_name": "v28.1.0",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v28.1.0",
|
||||||
"assets": []
|
"assets": []
|
||||||
},
|
},
|
||||||
"edge": {
|
"edge": {
|
||||||
|
"id": 213296967,
|
||||||
|
"tag_name": "v28.1.1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v28.1.1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v28.1.0-rc.2": {
|
||||||
|
"id": 212786864,
|
||||||
|
"tag_name": "v28.1.0-rc.2",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v28.1.0-rc.2",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v28.1.0-rc.1": {
|
||||||
|
"id": 211865941,
|
||||||
|
"tag_name": "v28.1.0-rc.1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v28.1.0-rc.1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v28.0.4": {
|
||||||
|
"id": 208163246,
|
||||||
|
"tag_name": "v28.0.4",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v28.0.4",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v28.0.3": {
|
||||||
|
"id": 208121902,
|
||||||
|
"tag_name": "v28.0.3",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v28.0.3",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v28.0.2": {
|
||||||
|
"id": 205678192,
|
||||||
|
"tag_name": "v28.0.2",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v28.0.2",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v28.0.1": {
|
||||||
|
"id": 202550735,
|
||||||
|
"tag_name": "v28.0.1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v28.0.1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v28.0.0": {
|
||||||
|
"id": 201152110,
|
||||||
|
"tag_name": "v28.0.0",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v28.0.0",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v28.0.0-rc.3": {
|
||||||
|
"id": 201046359,
|
||||||
|
"tag_name": "v28.0.0-rc.3",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v28.0.0-rc.3",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v28.0.0-rc.2": {
|
||||||
|
"id": 200732563,
|
||||||
|
"tag_name": "v28.0.0-rc.2",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v28.0.0-rc.2",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v28.0.0-rc.1": {
|
||||||
|
"id": 198950838,
|
||||||
|
"tag_name": "v28.0.0-rc.1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v28.0.0-rc.1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v25.0.8": {
|
||||||
|
"id": 198023936,
|
||||||
|
"tag_name": "v25.0.8",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v25.0.8",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v27.5.1": {
|
||||||
|
"id": 196137348,
|
||||||
|
"tag_name": "v27.5.1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v27.5.1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v27.5.0": {
|
||||||
"id": 194138446,
|
"id": 194138446,
|
||||||
"tag_name": "v27.5.0",
|
"tag_name": "v27.5.0",
|
||||||
"html_url": "https://github.com/moby/moby/releases/tag/v27.5.0",
|
"html_url": "https://github.com/moby/moby/releases/tag/v27.5.0",
|
||||||
|
|||||||
1076
.github/regclient-releases.json
vendored
Normal file
1076
.github/regclient-releases.json
vendored
Normal file
File diff suppressed because it is too large
Load Diff
204
.github/undock-releases.json
vendored
204
.github/undock-releases.json
vendored
@@ -1,46 +1,90 @@
|
|||||||
{
|
{
|
||||||
"latest": {
|
"latest": {
|
||||||
"id": 192171889,
|
"id": 213293369,
|
||||||
"tag_name": "v0.9.0",
|
"tag_name": "v0.10.0",
|
||||||
"html_url": "https://github.com/crazy-max/undock/releases/tag/v0.9.0",
|
"html_url": "https://github.com/crazy-max/undock/releases/tag/v0.10.0",
|
||||||
"assets": [
|
"assets": [
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/checksums.txt",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/checksums.txt",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_darwin_amd64.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_darwin_amd64.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_darwin_amd64.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_darwin_amd64.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_darwin_amd64.tar.gz",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_darwin_amd64.tar.gz",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_darwin_arm64.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_darwin_arm64.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_darwin_arm64.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_darwin_arm64.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_darwin_arm64.tar.gz",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_darwin_arm64.tar.gz",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_amd64.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_amd64.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_amd64.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_amd64.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_amd64.tar.gz",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_amd64.tar.gz",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_arm64.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_arm64.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_arm64.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_arm64.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_arm64.tar.gz",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_arm64.tar.gz",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_armv5.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv5.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_armv5.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv5.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_armv5.tar.gz",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv5.tar.gz",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_armv6.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv6.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_armv6.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv6.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_armv6.tar.gz",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv6.tar.gz",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_armv7.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv7.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_armv7.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv7.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_armv7.tar.gz",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv7.tar.gz",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_ppc64le.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_ppc64le.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_ppc64le.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_ppc64le.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_ppc64le.tar.gz",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_ppc64le.tar.gz",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_riscv64.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_riscv64.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_riscv64.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_riscv64.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_riscv64.tar.gz",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_riscv64.tar.gz",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_s390x.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_s390x.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_s390x.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_s390x.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_s390x.tar.gz",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_s390x.tar.gz",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_windows_amd64.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_windows_amd64.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_windows_amd64.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_windows_amd64.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_windows_amd64.zip",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_windows_amd64.zip",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_windows_arm64.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_windows_arm64.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_windows_arm64.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_windows_arm64.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_windows_arm64.zip"
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_windows_arm64.zip"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"v0.10.0": {
|
||||||
|
"id": 213293369,
|
||||||
|
"tag_name": "v0.10.0",
|
||||||
|
"html_url": "https://github.com/crazy-max/undock/releases/tag/v0.10.0",
|
||||||
|
"assets": [
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/checksums.txt",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_darwin_amd64.provenance.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_darwin_amd64.sbom.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_darwin_amd64.tar.gz",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_darwin_arm64.provenance.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_darwin_arm64.sbom.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_darwin_arm64.tar.gz",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_amd64.provenance.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_amd64.sbom.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_amd64.tar.gz",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_arm64.provenance.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_arm64.sbom.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_arm64.tar.gz",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv5.provenance.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv5.sbom.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv5.tar.gz",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv6.provenance.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv6.sbom.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv6.tar.gz",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv7.provenance.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv7.sbom.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv7.tar.gz",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_ppc64le.provenance.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_ppc64le.sbom.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_ppc64le.tar.gz",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_riscv64.provenance.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_riscv64.sbom.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_riscv64.tar.gz",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_s390x.provenance.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_s390x.sbom.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_s390x.tar.gz",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_windows_amd64.provenance.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_windows_amd64.sbom.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_windows_amd64.zip",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_windows_arm64.provenance.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_windows_arm64.sbom.json",
|
||||||
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_windows_arm64.zip"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"v0.9.0": {
|
"v0.9.0": {
|
||||||
@@ -153,47 +197,47 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"edge": {
|
"edge": {
|
||||||
"id": 192171889,
|
"id": 213293369,
|
||||||
"tag_name": "v0.9.0",
|
"tag_name": "v0.10.0",
|
||||||
"html_url": "https://github.com/crazy-max/undock/releases/tag/v0.9.0",
|
"html_url": "https://github.com/crazy-max/undock/releases/tag/v0.10.0",
|
||||||
"assets": [
|
"assets": [
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/checksums.txt",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/checksums.txt",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_darwin_amd64.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_darwin_amd64.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_darwin_amd64.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_darwin_amd64.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_darwin_amd64.tar.gz",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_darwin_amd64.tar.gz",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_darwin_arm64.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_darwin_arm64.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_darwin_arm64.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_darwin_arm64.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_darwin_arm64.tar.gz",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_darwin_arm64.tar.gz",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_amd64.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_amd64.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_amd64.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_amd64.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_amd64.tar.gz",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_amd64.tar.gz",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_arm64.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_arm64.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_arm64.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_arm64.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_arm64.tar.gz",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_arm64.tar.gz",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_armv5.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv5.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_armv5.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv5.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_armv5.tar.gz",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv5.tar.gz",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_armv6.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv6.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_armv6.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv6.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_armv6.tar.gz",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv6.tar.gz",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_armv7.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv7.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_armv7.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv7.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_armv7.tar.gz",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_armv7.tar.gz",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_ppc64le.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_ppc64le.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_ppc64le.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_ppc64le.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_ppc64le.tar.gz",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_ppc64le.tar.gz",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_riscv64.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_riscv64.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_riscv64.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_riscv64.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_riscv64.tar.gz",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_riscv64.tar.gz",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_s390x.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_s390x.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_s390x.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_s390x.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_linux_s390x.tar.gz",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_s390x.tar.gz",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_windows_amd64.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_windows_amd64.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_windows_amd64.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_windows_amd64.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_windows_amd64.zip",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_windows_amd64.zip",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_windows_arm64.provenance.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_windows_arm64.provenance.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_windows_arm64.sbom.json",
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_windows_arm64.sbom.json",
|
||||||
"https://github.com/crazy-max/undock/releases/download/v0.9.0/undock_0.9.0_windows_arm64.zip"
|
"https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_windows_arm64.zip"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"v0.7.0-rc.1": {
|
"v0.7.0-rc.1": {
|
||||||
|
|||||||
58
.github/workflows/compose-lab-releases-json.yml
vendored
Normal file
58
.github/workflows/compose-lab-releases-json.yml
vendored
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
name: compose-lab-releases-json
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 */12 * * *'
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'main'
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- '.github/workflows/compose-lab-releases-json.yml'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
generate:
|
||||||
|
uses: crazy-max/.github/.github/workflows/releases-json.yml@7f83a5a887650a38e4d0e05d5262309cfaa31459
|
||||||
|
with:
|
||||||
|
repository: docker/compose-desktop
|
||||||
|
artifact_name: compose-lab-releases-json
|
||||||
|
filename: compose-lab-releases.json
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
|
open-pr:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
|
needs:
|
||||||
|
- generate
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
-
|
||||||
|
name: Download
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: compose-lab-releases-json
|
||||||
|
path: .github
|
||||||
|
-
|
||||||
|
name: Commit changes
|
||||||
|
run: |
|
||||||
|
git add -A .
|
||||||
|
-
|
||||||
|
name: Create PR
|
||||||
|
uses: peter-evans/create-pull-request@5e914681df9dc83aa4e4905692ca88beb2f9e91f # v7.0.5
|
||||||
|
with:
|
||||||
|
base: main
|
||||||
|
branch: bot/compose-lab-releases-json
|
||||||
|
commit-message: "github: update .github/compose-lab-releases.json"
|
||||||
|
signoff: true
|
||||||
|
delete-branch: true
|
||||||
|
title: "Update `.github/compose-lab-releases.json`"
|
||||||
|
body: |
|
||||||
|
Update `.github/compose-lab-releases.json` to keep in sync with [https://github.com/docker/compose-desktop](https://github.com/docker/compose-desktop).
|
||||||
|
draft: false
|
||||||
17
.github/workflows/pr-assign-author.yml
vendored
Normal file
17
.github/workflows/pr-assign-author.yml
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
name: pr-assign-author
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types:
|
||||||
|
- opened
|
||||||
|
- reopened
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
run:
|
||||||
|
uses: crazy-max/.github/.github/workflows/pr-assign-author.yml@1b673f36fad86812f538c1df9794904038a23cbf
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
58
.github/workflows/regclient-releases-json.yml
vendored
Normal file
58
.github/workflows/regclient-releases-json.yml
vendored
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
name: regclient-releases-json
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 */12 * * *'
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'main'
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- '.github/workflows/regclient-releases-json.yml'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
generate:
|
||||||
|
uses: crazy-max/.github/.github/workflows/releases-json.yml@7f83a5a887650a38e4d0e05d5262309cfaa31459
|
||||||
|
with:
|
||||||
|
repository: regclient/regclient
|
||||||
|
artifact_name: regclient-releases-json
|
||||||
|
filename: regclient-releases.json
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
|
open-pr:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
|
needs:
|
||||||
|
- generate
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
-
|
||||||
|
name: Download
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: regclient-releases-json
|
||||||
|
path: .github
|
||||||
|
-
|
||||||
|
name: Commit changes
|
||||||
|
run: |
|
||||||
|
git add -A .
|
||||||
|
-
|
||||||
|
name: Create PR
|
||||||
|
uses: peter-evans/create-pull-request@5e914681df9dc83aa4e4905692ca88beb2f9e91f # v7.0.5
|
||||||
|
with:
|
||||||
|
base: main
|
||||||
|
branch: bot/regclient-releases-json
|
||||||
|
commit-message: "github: update .github/regclient-releases.json"
|
||||||
|
signoff: true
|
||||||
|
delete-branch: true
|
||||||
|
title: "Update `.github/regclient-releases.json`"
|
||||||
|
body: |
|
||||||
|
Update `.github/regclient-releases.json` to keep in sync with [https://github.com/regclient/regclient](https://github.com/regclient/regclient).
|
||||||
|
draft: false
|
||||||
6
.github/workflows/test.yml
vendored
6
.github/workflows/test.yml
vendored
@@ -16,7 +16,7 @@ on:
|
|||||||
env:
|
env:
|
||||||
NODE_VERSION: "20"
|
NODE_VERSION: "20"
|
||||||
BUILDX_VERSION: "edge"
|
BUILDX_VERSION: "edge"
|
||||||
BUILDKIT_IMAGE: "moby/buildkit:v0.18.2"
|
BUILDKIT_IMAGE: "moby/buildkit:v0.21.0"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
@@ -31,10 +31,14 @@ jobs:
|
|||||||
- 20
|
- 20
|
||||||
- 18
|
- 18
|
||||||
steps:
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
-
|
-
|
||||||
name: Test
|
name: Test
|
||||||
uses: docker/bake-action@v6
|
uses: docker/bake-action@v6
|
||||||
with:
|
with:
|
||||||
|
source: .
|
||||||
targets: test-coverage
|
targets: test-coverage
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|||||||
2
.github/workflows/validate.yml
vendored
2
.github/workflows/validate.yml
vendored
@@ -15,7 +15,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
prepare:
|
prepare:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-latest
|
||||||
outputs:
|
outputs:
|
||||||
targets: ${{ steps.generate.outputs.targets }}
|
targets: ${{ steps.generate.outputs.targets }}
|
||||||
steps:
|
steps:
|
||||||
|
|||||||
1
.github/workflows/virtual-env.yml
vendored
1
.github/workflows/virtual-env.yml
vendored
@@ -23,7 +23,6 @@ jobs:
|
|||||||
- ubuntu-latest
|
- ubuntu-latest
|
||||||
- ubuntu-24.04
|
- ubuntu-24.04
|
||||||
- ubuntu-22.04
|
- ubuntu-22.04
|
||||||
- ubuntu-20.04
|
|
||||||
- ubuntu-24.04-arm
|
- ubuntu-24.04-arm
|
||||||
- ubuntu-22.04-arm
|
- ubuntu-22.04-arm
|
||||||
steps:
|
steps:
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ a library by most of our GitHub Actions:
|
|||||||
* [docker/login-action](https://github.com/docker/login-action)
|
* [docker/login-action](https://github.com/docker/login-action)
|
||||||
* [docker/metadata-action](https://github.com/docker/metadata-action)
|
* [docker/metadata-action](https://github.com/docker/metadata-action)
|
||||||
* [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action)
|
* [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action)
|
||||||
|
* [docker/setup-compose-action](https://github.com/docker/setup-compose-action)
|
||||||
* [docker/setup-docker-action](https://github.com/docker/setup-docker-action)
|
* [docker/setup-docker-action](https://github.com/docker/setup-docker-action)
|
||||||
* [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action)
|
* [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action)
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,11 @@
|
|||||||
{
|
{
|
||||||
|
"group": {
|
||||||
|
"default": {
|
||||||
|
"targets": [
|
||||||
|
"default"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
"target": {
|
"target": {
|
||||||
"default": {
|
"default": {
|
||||||
"context": ".",
|
"context": ".",
|
||||||
@@ -9,7 +16,7 @@
|
|||||||
"type": "provenance"
|
"type": "provenance"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"disabled": "true",
|
"disabled": true,
|
||||||
"type": "sbom"
|
"type": "sbom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -37,3 +37,15 @@ GC Policy rule#2:
|
|||||||
GC Policy rule#3:
|
GC Policy rule#3:
|
||||||
All: true
|
All: true
|
||||||
Keep Bytes: 94.06GiB
|
Keep Bytes: 94.06GiB
|
||||||
|
File#buildkitd.toml:
|
||||||
|
> debug = true
|
||||||
|
> insecure-entitlements = ["network.host", "security.insecure"]
|
||||||
|
> trace = true
|
||||||
|
>
|
||||||
|
> [log]
|
||||||
|
> format = "text"
|
||||||
|
>
|
||||||
|
File#foo.txt:
|
||||||
|
> foo = bar
|
||||||
|
> baz = qux
|
||||||
|
>
|
||||||
|
|||||||
55
__tests__/.fixtures/inspect12.txt
Normal file
55
__tests__/.fixtures/inspect12.txt
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
Name: nvidia
|
||||||
|
Driver: docker-container
|
||||||
|
Last Activity: 2025-02-14 15:57:45 +0000 UTC
|
||||||
|
|
||||||
|
Nodes:
|
||||||
|
Name: nvidia0
|
||||||
|
Endpoint: unix:///var/run/docker.sock
|
||||||
|
Driver Options: image="moby/buildkit:local"
|
||||||
|
Status: running
|
||||||
|
BuildKit daemon flags: --allow-insecure-entitlement=network.host
|
||||||
|
BuildKit version: v0.20.0-rc2-4-gd30d8e22c.m
|
||||||
|
Platforms: linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
|
||||||
|
Features:
|
||||||
|
Cache export: true
|
||||||
|
Docker exporter: true
|
||||||
|
Multi-platform build: true
|
||||||
|
OCI exporter: true
|
||||||
|
Labels:
|
||||||
|
org.mobyproject.buildkit.worker.executor: oci
|
||||||
|
org.mobyproject.buildkit.worker.hostname: 76ac9a510d96
|
||||||
|
org.mobyproject.buildkit.worker.network: host
|
||||||
|
org.mobyproject.buildkit.worker.oci.process-mode: sandbox
|
||||||
|
org.mobyproject.buildkit.worker.selinux.enabled: false
|
||||||
|
org.mobyproject.buildkit.worker.snapshotter: overlayfs
|
||||||
|
Devices:
|
||||||
|
Name: nvidia.com/gpu=all
|
||||||
|
Automatically allowed: true
|
||||||
|
Annotations:
|
||||||
|
foo: bar
|
||||||
|
org.mobyproject.buildkit.device.autoallow: true
|
||||||
|
Name: docker.com/gpu=venus
|
||||||
|
Automatically allowed: false
|
||||||
|
Annotations:
|
||||||
|
bar: baz
|
||||||
|
GC Policy rule#0:
|
||||||
|
All: false
|
||||||
|
Filters: type==source.local,type==exec.cachemount,type==source.git.checkout
|
||||||
|
Keep Duration: 48h0m0s
|
||||||
|
Max Used Space: 488.3MiB
|
||||||
|
GC Policy rule#1:
|
||||||
|
All: false
|
||||||
|
Keep Duration: 1440h0m0s
|
||||||
|
Reserved Space: 9.313GiB
|
||||||
|
Max Used Space: 93.13GiB
|
||||||
|
Min Free Space: 188.1GiB
|
||||||
|
GC Policy rule#2:
|
||||||
|
All: false
|
||||||
|
Reserved Space: 9.313GiB
|
||||||
|
Max Used Space: 93.13GiB
|
||||||
|
Min Free Space: 188.1GiB
|
||||||
|
GC Policy rule#3:
|
||||||
|
All: true
|
||||||
|
Reserved Space: 9.313GiB
|
||||||
|
Max Used Space: 93.13GiB
|
||||||
|
Min Free Space: 188.1GiB
|
||||||
@@ -449,6 +449,101 @@ describe('parseInspect', () => {
|
|||||||
"all": true,
|
"all": true,
|
||||||
"keepBytes": "94.06GiB",
|
"keepBytes": "94.06GiB",
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"files": {
|
||||||
|
"buildkitd.toml": `debug = true
|
||||||
|
insecure-entitlements = ["network.host", "security.insecure"]
|
||||||
|
trace = true
|
||||||
|
|
||||||
|
[log]
|
||||||
|
format = "text"
|
||||||
|
`,
|
||||||
|
"foo.txt": `foo = bar
|
||||||
|
baz = qux
|
||||||
|
`,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'inspect12.txt',
|
||||||
|
{
|
||||||
|
"name": "nvidia",
|
||||||
|
"driver": "docker-container",
|
||||||
|
"lastActivity": new Date("2025-02-14T15:57:45.000Z"),
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"buildkit": "v0.20.0-rc2-4-gd30d8e22c.m",
|
||||||
|
"buildkitd-flags": "--allow-insecure-entitlement=network.host",
|
||||||
|
"driver-opts": [
|
||||||
|
"image=moby/buildkit:local",
|
||||||
|
],
|
||||||
|
"endpoint": "unix:///var/run/docker.sock",
|
||||||
|
"name": "nvidia0",
|
||||||
|
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/arm/v7,linux/arm/v6",
|
||||||
|
"status": "running",
|
||||||
|
"features": {
|
||||||
|
"Cache export": true,
|
||||||
|
"Docker exporter": true,
|
||||||
|
"Multi-platform build": true,
|
||||||
|
"OCI exporter": true,
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"org.mobyproject.buildkit.worker.executor": "oci",
|
||||||
|
"org.mobyproject.buildkit.worker.hostname": "76ac9a510d96",
|
||||||
|
"org.mobyproject.buildkit.worker.network": "host",
|
||||||
|
"org.mobyproject.buildkit.worker.oci.process-mode": "sandbox",
|
||||||
|
"org.mobyproject.buildkit.worker.selinux.enabled": "false",
|
||||||
|
"org.mobyproject.buildkit.worker.snapshotter": "overlayfs",
|
||||||
|
},
|
||||||
|
"devices": [
|
||||||
|
{
|
||||||
|
"annotations": {
|
||||||
|
"foo": "bar",
|
||||||
|
"org.mobyproject.buildkit.device.autoallow": "true"
|
||||||
|
},
|
||||||
|
"autoAllow": true,
|
||||||
|
"name": "nvidia.com/gpu=all"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"annotations": {
|
||||||
|
"bar": "baz"
|
||||||
|
},
|
||||||
|
"autoAllow": false,
|
||||||
|
"name": "docker.com/gpu=venus"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"gcPolicy": [
|
||||||
|
{
|
||||||
|
"all": false,
|
||||||
|
"filter": [
|
||||||
|
"type==source.local",
|
||||||
|
"type==exec.cachemount",
|
||||||
|
"type==source.git.checkout"
|
||||||
|
],
|
||||||
|
"keepDuration": "48h0m0s",
|
||||||
|
"maxUsedSpace": "488.3MiB",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"all": false,
|
||||||
|
"keepDuration": "1440h0m0s",
|
||||||
|
"maxUsedSpace": "93.13GiB",
|
||||||
|
"minFreeSpace": "188.1GiB",
|
||||||
|
"reservedSpace": "9.313GiB",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"all": false,
|
||||||
|
"maxUsedSpace": "93.13GiB",
|
||||||
|
"minFreeSpace": "188.1GiB",
|
||||||
|
"reservedSpace": "9.313GiB",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"all": true,
|
||||||
|
"maxUsedSpace": "93.13GiB",
|
||||||
|
"minFreeSpace": "188.1GiB",
|
||||||
|
"reservedSpace": "9.313GiB",
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {afterEach, beforeEach, describe, expect, it, jest, test} from '@jest/globals';
|
import {describe, expect, it, test} from '@jest/globals';
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import os from 'os';
|
import os from 'os';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
@@ -30,7 +30,49 @@ const tmpDir = fs.mkdtempSync(path.join(process.env.TEMP || os.tmpdir(), 'buildx
|
|||||||
|
|
||||||
const maybe = !process.env.GITHUB_ACTIONS || (process.env.GITHUB_ACTIONS === 'true' && process.env.ImageOS && process.env.ImageOS.startsWith('ubuntu')) ? describe : describe.skip;
|
const maybe = !process.env.GITHUB_ACTIONS || (process.env.GITHUB_ACTIONS === 'true' && process.env.ImageOS && process.env.ImageOS.startsWith('ubuntu')) ? describe : describe.skip;
|
||||||
|
|
||||||
maybe('exportBuild', () => {
|
maybe('inspect', () => {
|
||||||
|
it('build', 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);
|
||||||
|
if (!buildRef) {
|
||||||
|
throw new Error('buildRef is undefined');
|
||||||
|
}
|
||||||
|
const [builderName, nodeName, ref] = buildRef.split('/');
|
||||||
|
expect(builderName).toBeDefined();
|
||||||
|
expect(nodeName).toBeDefined();
|
||||||
|
expect(ref).toBeDefined();
|
||||||
|
|
||||||
|
const history = new History({buildx: buildx});
|
||||||
|
const res = await history.inspect({
|
||||||
|
ref: ref,
|
||||||
|
builder: builderName
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(res).toBeDefined();
|
||||||
|
expect(res?.Name).toBeDefined();
|
||||||
|
expect(res?.Ref).toBeDefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
maybe('export', () => {
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
test.each([
|
test.each([
|
||||||
[
|
[
|
||||||
@@ -50,7 +92,7 @@ maybe('exportBuild', () => {
|
|||||||
fixturesDir
|
fixturesDir
|
||||||
],
|
],
|
||||||
]
|
]
|
||||||
])('export build %p', async (_, bargs) => {
|
])('export with build %p', async (_, bargs) => {
|
||||||
const buildx = new Buildx();
|
const buildx = new Buildx();
|
||||||
const build = new Build({buildx: buildx});
|
const build = new Build({buildx: buildx});
|
||||||
|
|
||||||
@@ -110,7 +152,7 @@ maybe('exportBuild', () => {
|
|||||||
'hello-matrix'
|
'hello-matrix'
|
||||||
],
|
],
|
||||||
]
|
]
|
||||||
])('export bake build %p', async (_, bargs) => {
|
])('export with bake %p', async (_, bargs) => {
|
||||||
const buildx = new Buildx();
|
const buildx = new Buildx();
|
||||||
const bake = new Bake({buildx: buildx});
|
const bake = new Bake({buildx: buildx});
|
||||||
|
|
||||||
@@ -145,22 +187,8 @@ maybe('exportBuild', () => {
|
|||||||
expect(fs.existsSync(exportRes?.dockerbuildFilename)).toBe(true);
|
expect(fs.existsSync(exportRes?.dockerbuildFilename)).toBe(true);
|
||||||
expect(exportRes?.summaries).toBeDefined();
|
expect(exportRes?.summaries).toBeDefined();
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
maybe('exportBuild custom image', () => {
|
it('export using container', async () => {
|
||||||
const originalEnv = process.env;
|
|
||||||
beforeEach(() => {
|
|
||||||
jest.resetModules();
|
|
||||||
process.env = {
|
|
||||||
...originalEnv,
|
|
||||||
DOCKER_BUILD_EXPORT_BUILD_IMAGE: 'docker.io/dockereng/export-build:0.2.2'
|
|
||||||
};
|
|
||||||
});
|
|
||||||
afterEach(() => {
|
|
||||||
process.env = originalEnv;
|
|
||||||
});
|
|
||||||
|
|
||||||
it('with custom image', async () => {
|
|
||||||
const buildx = new Buildx();
|
const buildx = new Buildx();
|
||||||
const build = new Build({buildx: buildx});
|
const build = new Build({buildx: buildx});
|
||||||
|
|
||||||
@@ -185,7 +213,8 @@ maybe('exportBuild custom image', () => {
|
|||||||
|
|
||||||
const history = new History({buildx: buildx});
|
const history = new History({buildx: buildx});
|
||||||
const exportRes = await history.export({
|
const exportRes = await history.export({
|
||||||
refs: [buildRef ?? '']
|
refs: [buildRef ?? ''],
|
||||||
|
useContainer: true
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(exportRes).toBeDefined();
|
expect(exportRes).toBeDefined();
|
||||||
|
|||||||
@@ -37,19 +37,17 @@ describe('download', () => {
|
|||||||
['latest', true]
|
['latest', true]
|
||||||
])(
|
])(
|
||||||
'acquires %p of buildx (standalone: %p)', async (version, standalone) => {
|
'acquires %p of buildx (standalone: %p)', 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);
|
||||||
let buildxBin: string;
|
let buildxBin: string;
|
||||||
if (standalone) {
|
if (standalone) {
|
||||||
buildxBin = await install.installStandalone(toolPath, tmpDir);
|
buildxBin = await install.installStandalone(toolPath, tmpDir);
|
||||||
} else {
|
} else {
|
||||||
buildxBin = await install.installPlugin(toolPath, tmpDir);
|
buildxBin = await install.installPlugin(toolPath, tmpDir);
|
||||||
}
|
}
|
||||||
expect(fs.existsSync(buildxBin)).toBe(true);
|
expect(fs.existsSync(buildxBin)).toBe(true);
|
||||||
},
|
}, 100000);
|
||||||
100000
|
|
||||||
);
|
|
||||||
|
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
test.each([
|
test.each([
|
||||||
@@ -61,7 +59,7 @@ describe('download', () => {
|
|||||||
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);
|
||||||
});
|
}, 100000);
|
||||||
|
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
test.each([
|
test.each([
|
||||||
@@ -72,7 +70,7 @@ describe('download', () => {
|
|||||||
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);
|
||||||
});
|
}, 100000);
|
||||||
|
|
||||||
// TODO: add tests for arm
|
// TODO: add tests for arm
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
@@ -87,14 +85,12 @@ describe('download', () => {
|
|||||||
['linux', 's390x'],
|
['linux', 's390x'],
|
||||||
])(
|
])(
|
||||||
'acquires buildx for %s/%s', async (os, arch) => {
|
'acquires buildx for %s/%s', async (os, arch) => {
|
||||||
jest.spyOn(osm, 'platform').mockImplementation(() => os as NodeJS.Platform);
|
jest.spyOn(osm, 'platform').mockImplementation(() => os as NodeJS.Platform);
|
||||||
jest.spyOn(osm, 'arch').mockImplementation(() => arch);
|
jest.spyOn(osm, 'arch').mockImplementation(() => arch);
|
||||||
const install = new Install();
|
const install = new Install();
|
||||||
const buildxBin = await install.download('latest');
|
const buildxBin = await install.download('latest');
|
||||||
expect(fs.existsSync(buildxBin)).toBe(true);
|
expect(fs.existsSync(buildxBin)).toBe(true);
|
||||||
},
|
}, 100000);
|
||||||
100000
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('build', () => {
|
describe('build', () => {
|
||||||
|
|||||||
@@ -20,13 +20,27 @@ import os from 'os';
|
|||||||
import path from 'path';
|
import path from 'path';
|
||||||
|
|
||||||
import {Cache} from '../src/cache';
|
import {Cache} from '../src/cache';
|
||||||
|
import {Util} from '../src/util';
|
||||||
|
|
||||||
const fixturesDir = path.join(__dirname, '.fixtures');
|
const fixturesDir = path.join(__dirname, '.fixtures');
|
||||||
const tmpDir = fs.mkdtempSync(path.join(process.env.TEMP || os.tmpdir(), 'cache-itg-'));
|
const tmpDir = fs.mkdtempSync(path.join(process.env.TEMP || os.tmpdir(), 'cache-itg-'));
|
||||||
|
|
||||||
describe('cache', () => {
|
describe('cache', () => {
|
||||||
it('github-repo', async () => {
|
it('caches github-repo', async () => {
|
||||||
const r = (Math.random() + 1).toString(36).substring(7);
|
const r = Util.generateRandomString();
|
||||||
|
const htcName = `cache-test-github-repo-${r}`;
|
||||||
|
const c = new Cache({
|
||||||
|
htcName: htcName,
|
||||||
|
htcVersion: `v1.0.0+${r}`,
|
||||||
|
baseCacheDir: path.join(tmpDir, '.cache-test'),
|
||||||
|
cacheFile: 'github-repo.json'
|
||||||
|
});
|
||||||
|
expect(await c.save(path.join(fixturesDir, 'github-repo.json'), true)).not.toEqual('');
|
||||||
|
expect(await c.find()).not.toEqual('');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('caches github-repo with post state', async () => {
|
||||||
|
const r = Util.generateRandomString();
|
||||||
const htcName = `cache-test-github-repo-${r}`;
|
const htcName = `cache-test-github-repo-${r}`;
|
||||||
const c = new Cache({
|
const c = new Cache({
|
||||||
htcName: htcName,
|
htcName: htcName,
|
||||||
@@ -35,6 +49,7 @@ describe('cache', () => {
|
|||||||
cacheFile: 'github-repo.json'
|
cacheFile: 'github-repo.json'
|
||||||
});
|
});
|
||||||
expect(await c.save(path.join(fixturesDir, 'github-repo.json'))).not.toEqual('');
|
expect(await c.save(path.join(fixturesDir, 'github-repo.json'))).not.toEqual('');
|
||||||
|
expect(await Cache.post()).not.toBeNull();
|
||||||
expect(await c.find()).not.toEqual('');
|
expect(await c.find()).not.toEqual('');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -37,19 +37,17 @@ describe('download', () => {
|
|||||||
['latest', true]
|
['latest', true]
|
||||||
])(
|
])(
|
||||||
'acquires %p of compose (standalone: %p)', async (version, standalone) => {
|
'acquires %p of compose (standalone: %p)', 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);
|
||||||
let composeBin: string;
|
let composeBin: string;
|
||||||
if (standalone) {
|
if (standalone) {
|
||||||
composeBin = await install.installStandalone(toolPath, tmpDir);
|
composeBin = await install.installStandalone(toolPath, tmpDir);
|
||||||
} else {
|
} else {
|
||||||
composeBin = await install.installPlugin(toolPath, tmpDir);
|
composeBin = await install.installPlugin(toolPath, tmpDir);
|
||||||
}
|
}
|
||||||
expect(fs.existsSync(composeBin)).toBe(true);
|
expect(fs.existsSync(composeBin)).toBe(true);
|
||||||
},
|
}, 100000);
|
||||||
100000
|
|
||||||
);
|
|
||||||
|
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
test.each([
|
test.each([
|
||||||
@@ -61,7 +59,7 @@ describe('download', () => {
|
|||||||
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);
|
||||||
});
|
}, 100000);
|
||||||
|
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
test.each([
|
test.each([
|
||||||
@@ -72,7 +70,7 @@ describe('download', () => {
|
|||||||
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);
|
||||||
});
|
}, 100000);
|
||||||
|
|
||||||
// TODO: add tests for arm
|
// TODO: add tests for arm
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
@@ -87,39 +85,56 @@ describe('download', () => {
|
|||||||
['linux', 's390x'],
|
['linux', 's390x'],
|
||||||
])(
|
])(
|
||||||
'acquires compose for %s/%s', async (os, arch) => {
|
'acquires compose for %s/%s', async (os, arch) => {
|
||||||
jest.spyOn(osm, 'platform').mockImplementation(() => os as NodeJS.Platform);
|
jest.spyOn(osm, 'platform').mockImplementation(() => os as NodeJS.Platform);
|
||||||
jest.spyOn(osm, 'arch').mockImplementation(() => arch);
|
jest.spyOn(osm, 'arch').mockImplementation(() => arch);
|
||||||
const install = new Install();
|
const install = new Install();
|
||||||
const composeBin = await install.download('latest');
|
const composeBin = await install.download('latest');
|
||||||
expect(fs.existsSync(composeBin)).toBe(true);
|
expect(fs.existsSync(composeBin)).toBe(true);
|
||||||
},
|
}, 100000);
|
||||||
100000
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('getDownloadVersion', () => {
|
describe('getDownloadVersion', () => {
|
||||||
it('returns latest download version', async () => {
|
it('returns official latest download version', async () => {
|
||||||
const version = await Install.getDownloadVersion('latest');
|
const version = await Install.getDownloadVersion('latest');
|
||||||
|
expect(version.key).toEqual('official');
|
||||||
expect(version.version).toEqual('latest');
|
expect(version.version).toEqual('latest');
|
||||||
expect(version.downloadURL).toEqual('https://github.com/docker/compose/releases/download/v%s/%s');
|
expect(version.downloadURL).toEqual('https://github.com/docker/compose/releases/download/v%s/%s');
|
||||||
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-releases.json');
|
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-releases.json');
|
||||||
});
|
});
|
||||||
it('returns v2.24.3 download version', async () => {
|
it('returns official v2.24.3 download version', async () => {
|
||||||
const version = await Install.getDownloadVersion('v2.24.3');
|
const version = await Install.getDownloadVersion('v2.24.3');
|
||||||
|
expect(version.key).toEqual('official');
|
||||||
expect(version.version).toEqual('v2.24.3');
|
expect(version.version).toEqual('v2.24.3');
|
||||||
expect(version.downloadURL).toEqual('https://github.com/docker/compose/releases/download/v%s/%s');
|
expect(version.downloadURL).toEqual('https://github.com/docker/compose/releases/download/v%s/%s');
|
||||||
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-releases.json');
|
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-releases.json');
|
||||||
});
|
});
|
||||||
|
it('returns cloud latest download version', async () => {
|
||||||
|
const version = await Install.getDownloadVersion('cloud:latest');
|
||||||
|
expect(version.key).toEqual('cloud');
|
||||||
|
expect(version.version).toEqual('latest');
|
||||||
|
expect(version.downloadURL).toEqual('https://github.com/docker/compose-desktop/releases/download/v%s/%s');
|
||||||
|
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-lab-releases.json');
|
||||||
|
});
|
||||||
|
it('returns cloud v2.27.1-desktop.1 download version', async () => {
|
||||||
|
const version = await Install.getDownloadVersion('cloud:v2.27.1-desktop.1');
|
||||||
|
expect(version.key).toEqual('cloud');
|
||||||
|
expect(version.version).toEqual('v2.27.1-desktop.1');
|
||||||
|
expect(version.downloadURL).toEqual('https://github.com/docker/compose-desktop/releases/download/v%s/%s');
|
||||||
|
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-lab-releases.json');
|
||||||
|
});
|
||||||
|
it('unknown repo', async () => {
|
||||||
|
await expect(Install.getDownloadVersion('foo:bar')).rejects.toThrow(new Error('Cannot find compose version for foo:bar'));
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('getRelease', () => {
|
describe('getRelease', () => {
|
||||||
it('returns latest GitHub release', async () => {
|
it('returns latest official GitHub release', async () => {
|
||||||
const version = await Install.getDownloadVersion('latest');
|
const version = await Install.getDownloadVersion('latest');
|
||||||
const release = await Install.getRelease(version);
|
const release = await Install.getRelease(version);
|
||||||
expect(release).not.toBeNull();
|
expect(release).not.toBeNull();
|
||||||
expect(release?.tag_name).not.toEqual('');
|
expect(release?.tag_name).not.toEqual('');
|
||||||
});
|
});
|
||||||
it('returns v2.24.3 GitHub release', async () => {
|
it('returns v2.24.3 official GitHub release', async () => {
|
||||||
const version = await Install.getDownloadVersion('v2.24.3');
|
const version = await Install.getDownloadVersion('v2.24.3');
|
||||||
const release = await Install.getRelease(version);
|
const release = await Install.getRelease(version);
|
||||||
expect(release).not.toBeNull();
|
expect(release).not.toBeNull();
|
||||||
@@ -127,6 +142,14 @@ describe('getRelease', () => {
|
|||||||
expect(release?.tag_name).toEqual('v2.24.3');
|
expect(release?.tag_name).toEqual('v2.24.3');
|
||||||
expect(release?.html_url).toEqual('https://github.com/docker/compose/releases/tag/v2.24.3');
|
expect(release?.html_url).toEqual('https://github.com/docker/compose/releases/tag/v2.24.3');
|
||||||
});
|
});
|
||||||
|
it('returns v2.27.1-desktop.1 cloud GitHub release', async () => {
|
||||||
|
const version = await Install.getDownloadVersion('cloud:v2.27.1-desktop.1');
|
||||||
|
const release = await Install.getRelease(version);
|
||||||
|
expect(release).not.toBeNull();
|
||||||
|
expect(release?.id).toEqual(157591108);
|
||||||
|
expect(release?.tag_name).toEqual('v2.27.1-desktop.1');
|
||||||
|
expect(release?.html_url).toEqual('https://github.com/docker/compose-desktop/releases/tag/v2.27.1-desktop.1');
|
||||||
|
});
|
||||||
it('unknown release', async () => {
|
it('unknown release', async () => {
|
||||||
const version = await Install.getDownloadVersion('foo');
|
const version = await Install.getDownloadVersion('foo');
|
||||||
await expect(Install.getRelease(version)).rejects.toThrow(new Error('Cannot find Compose release foo in https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-releases.json'));
|
await expect(Install.getRelease(version)).rejects.toThrow(new Error('Cannot find Compose release foo in https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-releases.json'));
|
||||||
|
|||||||
@@ -14,17 +14,31 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {describe, test, expect} from '@jest/globals';
|
import {beforeAll, describe, test, expect} from '@jest/globals';
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import os from 'os';
|
import os from 'os';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
|
|
||||||
import {Install, InstallSource, InstallSourceArchive, InstallSourceImage} from '../../src/docker/install';
|
import {Install, InstallSource, InstallSourceArchive, InstallSourceImage} from '../../src/docker/install';
|
||||||
import {Docker} from '../../src/docker/docker';
|
import {Docker} from '../../src/docker/docker';
|
||||||
|
import {Regctl} from '../../src/regclient/regctl';
|
||||||
|
import {Install as RegclientInstall} from '../../src/regclient/install';
|
||||||
|
import {Undock} from '../../src/undock/undock';
|
||||||
|
import {Install as UndockInstall} from '../../src/undock/install';
|
||||||
import {Exec} from '../../src/exec';
|
import {Exec} from '../../src/exec';
|
||||||
|
|
||||||
const tmpDir = () => fs.mkdtempSync(path.join(process.env.TEMP || os.tmpdir(), 'docker-install-itg-'));
|
const tmpDir = () => fs.mkdtempSync(path.join(process.env.TEMP || os.tmpdir(), 'docker-install-itg-'));
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
const undockInstall = new UndockInstall();
|
||||||
|
const undockBinPath = await undockInstall.download('v0.10.0', true);
|
||||||
|
await undockInstall.install(undockBinPath);
|
||||||
|
|
||||||
|
const regclientInstall = new RegclientInstall();
|
||||||
|
const regclientBinPath = await regclientInstall.download('v0.8.2', true);
|
||||||
|
await regclientInstall.install(regclientBinPath);
|
||||||
|
}, 100000);
|
||||||
|
|
||||||
describe('root', () => {
|
describe('root', () => {
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
test.each(getSources(true))(
|
test.each(getSources(true))(
|
||||||
@@ -34,7 +48,9 @@ describe('root', () => {
|
|||||||
source: source,
|
source: source,
|
||||||
runDir: tmpDir(),
|
runDir: tmpDir(),
|
||||||
contextName: 'foo',
|
contextName: 'foo',
|
||||||
daemonConfig: `{"debug":true,"features":{"containerd-snapshotter":true}}`
|
daemonConfig: `{"debug":true,"features":{"containerd-snapshotter":true}}`,
|
||||||
|
regctl: new Regctl(),
|
||||||
|
undock: new Undock()
|
||||||
});
|
});
|
||||||
await expect(tryInstall(install)).resolves.not.toThrow();
|
await expect(tryInstall(install)).resolves.not.toThrow();
|
||||||
}, 30 * 60 * 1000);
|
}, 30 * 60 * 1000);
|
||||||
@@ -54,7 +70,9 @@ describe('rootless', () => {
|
|||||||
runDir: tmpDir(),
|
runDir: tmpDir(),
|
||||||
contextName: 'foo',
|
contextName: 'foo',
|
||||||
daemonConfig: `{"debug":true}`,
|
daemonConfig: `{"debug":true}`,
|
||||||
rootless: true
|
rootless: true,
|
||||||
|
regctl: new Regctl(),
|
||||||
|
undock: new Undock()
|
||||||
});
|
});
|
||||||
await expect(
|
await expect(
|
||||||
tryInstall(install, async () => {
|
tryInstall(install, async () => {
|
||||||
@@ -79,7 +97,9 @@ describe('tcp', () => {
|
|||||||
runDir: tmpDir(),
|
runDir: tmpDir(),
|
||||||
contextName: 'foo',
|
contextName: 'foo',
|
||||||
daemonConfig: `{"debug":true}`,
|
daemonConfig: `{"debug":true}`,
|
||||||
localTCPPort: 2378
|
localTCPPort: 2378,
|
||||||
|
regctl: new Regctl(),
|
||||||
|
undock: new Undock()
|
||||||
});
|
});
|
||||||
await expect(
|
await expect(
|
||||||
tryInstall(install, async () => {
|
tryInstall(install, async () => {
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ import * as rimraf from 'rimraf';
|
|||||||
import osm = require('os');
|
import osm = require('os');
|
||||||
|
|
||||||
import {Install, InstallSourceArchive, InstallSourceImage} from '../../src/docker/install';
|
import {Install, InstallSourceArchive, InstallSourceImage} from '../../src/docker/install';
|
||||||
|
import {Regctl} from '../../src/regclient/regctl';
|
||||||
|
import {Undock} from '../../src/undock/undock';
|
||||||
|
|
||||||
const tmpDir = fs.mkdtempSync(path.join(process.env.TEMP || os.tmpdir(), 'docker-install-'));
|
const tmpDir = fs.mkdtempSync(path.join(process.env.TEMP || os.tmpdir(), 'docker-install-'));
|
||||||
|
|
||||||
@@ -64,6 +66,8 @@ describe('download', () => {
|
|||||||
const install = new Install({
|
const install = new Install({
|
||||||
source: source,
|
source: source,
|
||||||
runDir: tmpDir,
|
runDir: tmpDir,
|
||||||
|
regctl: new Regctl(),
|
||||||
|
undock: new Undock()
|
||||||
});
|
});
|
||||||
const toolPath = await install.download();
|
const toolPath = await install.download();
|
||||||
expect(fs.existsSync(toolPath)).toBe(true);
|
expect(fs.existsSync(toolPath)).toBe(true);
|
||||||
|
|||||||
38
__tests__/regclient/install.test.itg.ts
Normal file
38
__tests__/regclient/install.test.itg.ts
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2025 actions-toolkit authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {describe, expect, test} from '@jest/globals';
|
||||||
|
import * as fs from 'fs';
|
||||||
|
|
||||||
|
import {Install} from '../../src/regclient/install';
|
||||||
|
|
||||||
|
describe('download', () => {
|
||||||
|
// prettier-ignore
|
||||||
|
test.each(['latest'])(
|
||||||
|
'install regclient %s', async (version) => {
|
||||||
|
await expect((async () => {
|
||||||
|
const install = new Install();
|
||||||
|
const toolPath = await install.download(version);
|
||||||
|
if (!fs.existsSync(toolPath)) {
|
||||||
|
throw new Error('toolPath does not exist');
|
||||||
|
}
|
||||||
|
const binPath = await install.install(toolPath);
|
||||||
|
if (!fs.existsSync(binPath)) {
|
||||||
|
throw new Error('binPath does not exist');
|
||||||
|
}
|
||||||
|
})()).resolves.not.toThrow();
|
||||||
|
}, 60000);
|
||||||
|
});
|
||||||
120
__tests__/regclient/install.test.ts
Normal file
120
__tests__/regclient/install.test.ts
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2025 actions-toolkit authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {describe, expect, it, jest, test, afterEach} from '@jest/globals';
|
||||||
|
import fs from 'fs';
|
||||||
|
import os from 'os';
|
||||||
|
import path from 'path';
|
||||||
|
import * as rimraf from 'rimraf';
|
||||||
|
import osm = require('os');
|
||||||
|
|
||||||
|
import {Install} from '../../src/regclient/install';
|
||||||
|
|
||||||
|
const tmpDir = fs.mkdtempSync(path.join(process.env.TEMP || os.tmpdir(), 'regclient-install-'));
|
||||||
|
|
||||||
|
afterEach(function () {
|
||||||
|
rimraf.sync(tmpDir);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('download', () => {
|
||||||
|
// prettier-ignore
|
||||||
|
test.each([
|
||||||
|
['v0.8.2'],
|
||||||
|
['latest']
|
||||||
|
])(
|
||||||
|
'acquires %p of regclient', async (version) => {
|
||||||
|
const install = new Install();
|
||||||
|
const toolPath = await install.download(version);
|
||||||
|
expect(fs.existsSync(toolPath)).toBe(true);
|
||||||
|
const regclientBin = await install.install(toolPath, tmpDir);
|
||||||
|
expect(fs.existsSync(regclientBin)).toBe(true);
|
||||||
|
}, 100000);
|
||||||
|
|
||||||
|
// prettier-ignore
|
||||||
|
test.each([
|
||||||
|
// following versions are already cached to htc from previous test cases
|
||||||
|
['v0.8.2'],
|
||||||
|
])(
|
||||||
|
'acquires %p of regclient with cache', async (version) => {
|
||||||
|
const install = new Install();
|
||||||
|
const toolPath = await install.download(version);
|
||||||
|
expect(fs.existsSync(toolPath)).toBe(true);
|
||||||
|
}, 100000);
|
||||||
|
|
||||||
|
// prettier-ignore
|
||||||
|
test.each([
|
||||||
|
['v0.8.1'],
|
||||||
|
])(
|
||||||
|
'acquires %p of regclient without cache', async (version) => {
|
||||||
|
const install = new Install();
|
||||||
|
const toolPath = await install.download(version, true);
|
||||||
|
expect(fs.existsSync(toolPath)).toBe(true);
|
||||||
|
}, 100000);
|
||||||
|
|
||||||
|
// prettier-ignore
|
||||||
|
test.each([
|
||||||
|
['win32', 'x64'],
|
||||||
|
['darwin', 'x64'],
|
||||||
|
['darwin', 'arm64'],
|
||||||
|
['linux', 'x64'],
|
||||||
|
['linux', 'arm64'],
|
||||||
|
['linux', 'ppc64'],
|
||||||
|
['linux', 's390x'],
|
||||||
|
])(
|
||||||
|
'acquires regclient for %s/%s', async (os, arch) => {
|
||||||
|
jest.spyOn(osm, 'platform').mockImplementation(() => os as NodeJS.Platform);
|
||||||
|
jest.spyOn(osm, 'arch').mockImplementation(() => arch);
|
||||||
|
const install = new Install();
|
||||||
|
const regclientBin = await install.download('latest');
|
||||||
|
expect(fs.existsSync(regclientBin)).toBe(true);
|
||||||
|
}, 100000);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('getDownloadVersion', () => {
|
||||||
|
it('returns latest download version', async () => {
|
||||||
|
const version = await Install.getDownloadVersion('latest');
|
||||||
|
expect(version.version).toEqual('latest');
|
||||||
|
expect(version.downloadURL).toEqual('https://github.com/regclient/regclient/releases/download/v%s/%s');
|
||||||
|
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/regclient-releases.json');
|
||||||
|
});
|
||||||
|
it('returns v0.8.1 download version', async () => {
|
||||||
|
const version = await Install.getDownloadVersion('v0.8.1');
|
||||||
|
expect(version.version).toEqual('v0.8.1');
|
||||||
|
expect(version.downloadURL).toEqual('https://github.com/regclient/regclient/releases/download/v%s/%s');
|
||||||
|
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/regclient-releases.json');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('getRelease', () => {
|
||||||
|
it('returns latest GitHub release', async () => {
|
||||||
|
const version = await Install.getDownloadVersion('latest');
|
||||||
|
const release = await Install.getRelease(version);
|
||||||
|
expect(release).not.toBeNull();
|
||||||
|
expect(release?.tag_name).not.toEqual('');
|
||||||
|
});
|
||||||
|
it('returns v0.8.1 GitHub release', async () => {
|
||||||
|
const version = await Install.getDownloadVersion('v0.8.1');
|
||||||
|
const release = await Install.getRelease(version);
|
||||||
|
expect(release).not.toBeNull();
|
||||||
|
expect(release?.id).toEqual(199719231);
|
||||||
|
expect(release?.tag_name).toEqual('v0.8.1');
|
||||||
|
expect(release?.html_url).toEqual('https://github.com/regclient/regclient/releases/tag/v0.8.1');
|
||||||
|
});
|
||||||
|
it('unknown release', async () => {
|
||||||
|
const version = await Install.getDownloadVersion('foo');
|
||||||
|
await expect(Install.getRelease(version)).rejects.toThrow(new Error('Cannot find regclient release foo in https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/regclient-releases.json'));
|
||||||
|
});
|
||||||
|
});
|
||||||
126
__tests__/regclient/regctl.test.ts
Normal file
126
__tests__/regclient/regctl.test.ts
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2025 actions-toolkit authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {describe, expect, it, jest, test} from '@jest/globals';
|
||||||
|
import * as semver from 'semver';
|
||||||
|
|
||||||
|
import {Exec} from '../../src/exec';
|
||||||
|
import {Regctl} from '../../src/regclient/regctl';
|
||||||
|
|
||||||
|
import {Image} from '../../src/types/oci/config';
|
||||||
|
|
||||||
|
describe('manifestGet', () => {
|
||||||
|
// prettier-ignore
|
||||||
|
test.each([
|
||||||
|
['moby/moby-bin:28.1.0-rc.2'],
|
||||||
|
['crazymax/diun:4.17.0'],
|
||||||
|
])('given %p', async image => {
|
||||||
|
const regctl = new Regctl();
|
||||||
|
const manifest = await regctl.manifestGet({
|
||||||
|
image: image,
|
||||||
|
});
|
||||||
|
console.log(`${image} manifest: ${JSON.stringify(manifest, null, 2)}`);
|
||||||
|
expect(manifest).not.toBeNull();
|
||||||
|
expect(manifest?.config).toBeDefined();
|
||||||
|
expect(manifest?.config.digest).not.toEqual('');
|
||||||
|
expect(manifest?.layers).toBeDefined();
|
||||||
|
expect(manifest?.layers.length).toBeGreaterThan(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('blobGet', () => {
|
||||||
|
// prettier-ignore
|
||||||
|
test.each([
|
||||||
|
['moby/moby-bin', 'sha256:234fccbd13fde0ba978a19f728cbdc67e29bc76247ac560822bb6ae5236c0bf0'],
|
||||||
|
['crazymax/diun', 'sha256:1e4881f66e0ec0f1710b837002107050bbbc0a231d8a42d7f422b56a139900bb'],
|
||||||
|
])('given %p', async (repo, digest) => {
|
||||||
|
const regctl = new Regctl();
|
||||||
|
const blob = await regctl.blobGet({
|
||||||
|
repository: repo,
|
||||||
|
digest: digest
|
||||||
|
});
|
||||||
|
expect(blob).toBeDefined();
|
||||||
|
console.log(`${repo}:@${digest} blob: ${JSON.stringify(JSON.parse(blob), null, 2)}`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('image config', () => {
|
||||||
|
// prettier-ignore
|
||||||
|
test.each([
|
||||||
|
['moby/moby-bin:28.1.0-rc.2'],
|
||||||
|
['crazymax/diun:4.17.0'],
|
||||||
|
])('given %p', async image => {
|
||||||
|
const regctl = new Regctl();
|
||||||
|
const manifest = await regctl.manifestGet({
|
||||||
|
image: image,
|
||||||
|
});
|
||||||
|
expect(manifest).not.toBeNull();
|
||||||
|
expect(manifest?.config).toBeDefined();
|
||||||
|
expect(manifest?.config.digest).not.toEqual('');
|
||||||
|
const blob = await regctl.blobGet({
|
||||||
|
repository: image, // image works as well
|
||||||
|
digest: manifest?.config.digest
|
||||||
|
});
|
||||||
|
const imageConfig = <Image>JSON.parse(blob);
|
||||||
|
console.log(`${image} config: ${JSON.stringify(imageConfig, null, 2)}`);
|
||||||
|
expect(imageConfig).not.toBeNull();
|
||||||
|
expect(imageConfig.config).toBeDefined();
|
||||||
|
expect(imageConfig?.config?.Labels).toBeDefined();
|
||||||
|
expect(Object.keys(imageConfig?.config?.Labels || {}).length).toBeGreaterThan(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('isAvailable', () => {
|
||||||
|
it('checks regctl is available', async () => {
|
||||||
|
const execSpy = jest.spyOn(Exec, 'getExecOutput');
|
||||||
|
const regctl = new Regctl();
|
||||||
|
await regctl.isAvailable();
|
||||||
|
// eslint-disable-next-line jest/no-standalone-expect
|
||||||
|
expect(execSpy).toHaveBeenCalledWith(`regctl`, [], {
|
||||||
|
silent: true,
|
||||||
|
ignoreReturnCode: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('printVersion', () => {
|
||||||
|
it('prints regctl version', async () => {
|
||||||
|
const execSpy = jest.spyOn(Exec, 'exec');
|
||||||
|
const regctl = new Regctl();
|
||||||
|
await regctl.printVersion();
|
||||||
|
expect(execSpy).toHaveBeenCalledWith(`regctl`, ['version'], {
|
||||||
|
failOnStdErr: false
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('version', () => {
|
||||||
|
it('valid', async () => {
|
||||||
|
const regctl = new Regctl();
|
||||||
|
expect(semver.valid(await regctl.version())).not.toBeUndefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('versionSatisfies', () => {
|
||||||
|
test.each([
|
||||||
|
['v0.8.2', '>=0.6.0', true],
|
||||||
|
['v0.8.0', '>0.6.0', true],
|
||||||
|
['v0.8.0', '<0.3.0', false]
|
||||||
|
])('given %p', async (version, range, expected) => {
|
||||||
|
const regctl = new Regctl();
|
||||||
|
expect(await regctl.versionSatisfies(range, version)).toBe(expected);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -36,15 +36,13 @@ describe('download', () => {
|
|||||||
['v0.7.0'],
|
['v0.7.0'],
|
||||||
['latest']
|
['latest']
|
||||||
])(
|
])(
|
||||||
'acquires %p of undock (standalone: %p)', async (version) => {
|
'acquires %p 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);
|
||||||
const undockBin = await install.install(toolPath, tmpDir);
|
const undockBin = await install.install(toolPath, tmpDir);
|
||||||
expect(fs.existsSync(undockBin)).toBe(true);
|
expect(fs.existsSync(undockBin)).toBe(true);
|
||||||
},
|
}, 100000);
|
||||||
100000
|
|
||||||
);
|
|
||||||
|
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
test.each([
|
test.each([
|
||||||
@@ -56,7 +54,7 @@ describe('download', () => {
|
|||||||
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);
|
||||||
});
|
}, 100000);
|
||||||
|
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
test.each([
|
test.each([
|
||||||
@@ -67,7 +65,7 @@ describe('download', () => {
|
|||||||
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);
|
||||||
});
|
}, 100000);
|
||||||
|
|
||||||
// TODO: add tests for arm
|
// TODO: add tests for arm
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
@@ -82,14 +80,12 @@ describe('download', () => {
|
|||||||
['linux', 's390x'],
|
['linux', 's390x'],
|
||||||
])(
|
])(
|
||||||
'acquires undock for %s/%s', async (os, arch) => {
|
'acquires undock for %s/%s', async (os, arch) => {
|
||||||
jest.spyOn(osm, 'platform').mockImplementation(() => os as NodeJS.Platform);
|
jest.spyOn(osm, 'platform').mockImplementation(() => os as NodeJS.Platform);
|
||||||
jest.spyOn(osm, 'arch').mockImplementation(() => arch);
|
jest.spyOn(osm, 'arch').mockImplementation(() => arch);
|
||||||
const install = new Install();
|
const install = new Install();
|
||||||
const undockBin = await install.download('latest');
|
const undockBin = await install.download('latest');
|
||||||
expect(fs.existsSync(undockBin)).toBe(true);
|
expect(fs.existsSync(undockBin)).toBe(true);
|
||||||
},
|
}, 100000);
|
||||||
100000
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('getDownloadVersion', () => {
|
describe('getDownloadVersion', () => {
|
||||||
|
|||||||
47
__tests__/undock/undock.test.itg.ts
Normal file
47
__tests__/undock/undock.test.itg.ts
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2025 actions-toolkit authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {describe, expect, it} from '@jest/globals';
|
||||||
|
import fs from 'fs';
|
||||||
|
import os from 'os';
|
||||||
|
|
||||||
|
import {Undock} from '../../src/undock/undock';
|
||||||
|
import {Install as UndockInstall} from '../../src/undock/install';
|
||||||
|
|
||||||
|
describe('run', () => {
|
||||||
|
it('extracts moby/moby-bin:26.1.5', async () => {
|
||||||
|
const install = new UndockInstall();
|
||||||
|
const toolPath = await install.download('latest');
|
||||||
|
if (!fs.existsSync(toolPath)) {
|
||||||
|
throw new Error('toolPath does not exist');
|
||||||
|
}
|
||||||
|
const binPath = await install.install(toolPath);
|
||||||
|
if (!fs.existsSync(binPath)) {
|
||||||
|
throw new Error('binPath does not exist');
|
||||||
|
}
|
||||||
|
|
||||||
|
const undock = new Undock();
|
||||||
|
await expect(
|
||||||
|
(async () => {
|
||||||
|
// prettier-ignore
|
||||||
|
await undock.run({
|
||||||
|
source: 'docker/buildx-bin:0.23.0',
|
||||||
|
dist: os.tmpdir()
|
||||||
|
});
|
||||||
|
})()
|
||||||
|
).resolves.not.toThrow();
|
||||||
|
}, 100000);
|
||||||
|
});
|
||||||
@@ -469,6 +469,36 @@ describe('isPathRelativeTo', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('formatDuration', () => {
|
||||||
|
it('formats 0 nanoseconds as "0s"', () => {
|
||||||
|
expect(Util.formatDuration(0)).toBe('0s');
|
||||||
|
});
|
||||||
|
it('formats only seconds', () => {
|
||||||
|
expect(Util.formatDuration(5e9)).toBe('5s');
|
||||||
|
expect(Util.formatDuration(59e9)).toBe('59s');
|
||||||
|
});
|
||||||
|
it('formats minutes and seconds', () => {
|
||||||
|
expect(Util.formatDuration(65e9)).toBe('1m5s');
|
||||||
|
expect(Util.formatDuration(600e9)).toBe('10m');
|
||||||
|
});
|
||||||
|
it('formats hours, minutes, and seconds', () => {
|
||||||
|
expect(Util.formatDuration(3661e9)).toBe('1h1m1s');
|
||||||
|
expect(Util.formatDuration(7322e9)).toBe('2h2m2s');
|
||||||
|
});
|
||||||
|
it('formats hours only', () => {
|
||||||
|
expect(Util.formatDuration(3 * 3600e9)).toBe('3h');
|
||||||
|
});
|
||||||
|
it('formats hours and minutes', () => {
|
||||||
|
expect(Util.formatDuration(3900e9)).toBe('1h5m');
|
||||||
|
});
|
||||||
|
it('formats minutes only', () => {
|
||||||
|
expect(Util.formatDuration(120e9)).toBe('2m');
|
||||||
|
});
|
||||||
|
it('rounds down partial seconds', () => {
|
||||||
|
expect(Util.formatDuration(1799999999)).toBe('1s');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
// See: https://github.com/actions/toolkit/blob/a1b068ec31a042ff1e10a522d8fdf0b8869d53ca/packages/core/src/core.ts#L89
|
// See: https://github.com/actions/toolkit/blob/a1b068ec31a042ff1e10a522d8fdf0b8869d53ca/packages/core/src/core.ts#L89
|
||||||
function getInputName(name: string): string {
|
function getInputName(name: string): string {
|
||||||
return `INPUT_${name.replace(/ /g, '_').toUpperCase()}`;
|
return `INPUT_${name.replace(/ /g, '_').toUpperCase()}`;
|
||||||
|
|||||||
@@ -16,9 +16,10 @@
|
|||||||
|
|
||||||
ARG NODE_VERSION=20
|
ARG NODE_VERSION=20
|
||||||
ARG DOCKER_VERSION=27.2.1
|
ARG DOCKER_VERSION=27.2.1
|
||||||
ARG BUILDX_VERSION=0.19.3
|
ARG BUILDX_VERSION=0.23.0
|
||||||
ARG COMPOSE_VERSION=2.32.4
|
ARG COMPOSE_VERSION=2.32.4
|
||||||
ARG UNDOCK_VERSION=0.8.0
|
ARG UNDOCK_VERSION=0.10.0
|
||||||
|
ARG REGCTL_VERSION=v0.8.2
|
||||||
|
|
||||||
FROM node:${NODE_VERSION}-alpine AS base
|
FROM node:${NODE_VERSION}-alpine AS base
|
||||||
RUN apk add --no-cache cpio findutils git
|
RUN apk add --no-cache cpio findutils git
|
||||||
@@ -79,6 +80,7 @@ FROM docker:${DOCKER_VERSION} AS docker
|
|||||||
FROM docker/buildx-bin:${BUILDX_VERSION} AS buildx
|
FROM docker/buildx-bin:${BUILDX_VERSION} AS buildx
|
||||||
FROM docker/compose-bin:v${COMPOSE_VERSION} AS compose
|
FROM docker/compose-bin:v${COMPOSE_VERSION} AS compose
|
||||||
FROM crazymax/undock:${UNDOCK_VERSION} AS undock
|
FROM crazymax/undock:${UNDOCK_VERSION} AS undock
|
||||||
|
FROM ghcr.io/regclient/regctl:${REGCTL_VERSION} AS regctl
|
||||||
|
|
||||||
FROM deps AS test
|
FROM deps AS test
|
||||||
RUN --mount=type=bind,target=.,rw \
|
RUN --mount=type=bind,target=.,rw \
|
||||||
@@ -90,6 +92,7 @@ RUN --mount=type=bind,target=.,rw \
|
|||||||
--mount=type=bind,from=compose,source=/docker-compose,target=/usr/libexec/docker/cli-plugins/docker-compose \
|
--mount=type=bind,from=compose,source=/docker-compose,target=/usr/libexec/docker/cli-plugins/docker-compose \
|
||||||
--mount=type=bind,from=compose,source=/docker-compose,target=/usr/bin/compose \
|
--mount=type=bind,from=compose,source=/docker-compose,target=/usr/bin/compose \
|
||||||
--mount=type=bind,from=undock,source=/usr/local/bin/undock,target=/usr/bin/undock \
|
--mount=type=bind,from=undock,source=/usr/local/bin/undock,target=/usr/bin/undock \
|
||||||
|
--mount=type=bind,from=regctl,source=/regctl,target=/usr/bin/regctl \
|
||||||
--mount=type=secret,id=GITHUB_TOKEN \
|
--mount=type=secret,id=GITHUB_TOKEN \
|
||||||
GITHUB_TOKEN=$(cat /run/secrets/GITHUB_TOKEN) yarn run test:coverage --coverageDirectory=/tmp/coverage
|
GITHUB_TOKEN=$(cat /run/secrets/GITHUB_TOKEN) yarn run test:coverage --coverageDirectory=/tmp/coverage
|
||||||
|
|
||||||
|
|||||||
@@ -14,20 +14,6 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import fs from 'fs';
|
|
||||||
import os from 'os';
|
|
||||||
import path from 'path';
|
|
||||||
|
|
||||||
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'docker-actions-toolkit-'));
|
|
||||||
|
|
||||||
process.env = Object.assign({}, process.env, {
|
|
||||||
TEMP: tmpDir,
|
|
||||||
RUNNER_TEMP: path.join(tmpDir, 'runner-temp'),
|
|
||||||
RUNNER_TOOL_CACHE: path.join(tmpDir, 'runner-tool-cache')
|
|
||||||
}) as {
|
|
||||||
[key: string]: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
testEnvironment: 'node',
|
testEnvironment: 'node',
|
||||||
moduleFileExtensions: ['js', 'ts'],
|
moduleFileExtensions: ['js', 'ts'],
|
||||||
|
|||||||
@@ -45,8 +45,8 @@
|
|||||||
"registry": "https://registry.npmjs.org/"
|
"registry": "https://registry.npmjs.org/"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/artifact": "^2.2.1",
|
"@actions/artifact": "^2.3.2",
|
||||||
"@actions/cache": "^4.0.0",
|
"@actions/cache": "^4.0.3",
|
||||||
"@actions/core": "^1.11.1",
|
"@actions/core": "^1.11.1",
|
||||||
"@actions/exec": "^1.1.1",
|
"@actions/exec": "^1.1.1",
|
||||||
"@actions/github": "^6.0.0",
|
"@actions/github": "^6.0.0",
|
||||||
@@ -63,7 +63,7 @@
|
|||||||
"he": "^1.2.0",
|
"he": "^1.2.0",
|
||||||
"js-yaml": "^4.1.0",
|
"js-yaml": "^4.1.0",
|
||||||
"jwt-decode": "^4.0.0",
|
"jwt-decode": "^4.0.0",
|
||||||
"semver": "^7.6.3",
|
"semver": "^7.7.1",
|
||||||
"tar-stream": "^3.1.7",
|
"tar-stream": "^3.1.7",
|
||||||
"tmp": "^0.2.3"
|
"tmp": "^0.2.3"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -238,6 +238,9 @@ export class Bake {
|
|||||||
case 'type':
|
case 'type':
|
||||||
attestEntry.type = value;
|
attestEntry.type = value;
|
||||||
break;
|
break;
|
||||||
|
case 'disabled':
|
||||||
|
attestEntry.disabled = Util.parseBool(value);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
attestEntry[key] = value;
|
attestEntry[key] = value;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,11 @@ export interface BuildOpts {
|
|||||||
buildx?: Buildx;
|
buildx?: Buildx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ResolveSecretsOpts {
|
||||||
|
asFile?: boolean;
|
||||||
|
redact?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
export class Build {
|
export class Build {
|
||||||
private readonly buildx: Buildx;
|
private readonly buildx: Buildx;
|
||||||
private readonly iidFilename: string;
|
private readonly iidFilename: string;
|
||||||
@@ -124,12 +129,16 @@ export class Build {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static resolveSecretString(kvp: string): string {
|
public static resolveSecretString(kvp: string): string {
|
||||||
const [key, file] = Build.resolveSecret(kvp, false);
|
const [key, file] = Build.resolveSecret(kvp, {
|
||||||
|
redact: true
|
||||||
|
});
|
||||||
return `id=${key},src=${file}`;
|
return `id=${key},src=${file}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static resolveSecretFile(kvp: string): string {
|
public static resolveSecretFile(kvp: string): string {
|
||||||
const [key, file] = Build.resolveSecret(kvp, true);
|
const [key, file] = Build.resolveSecret(kvp, {
|
||||||
|
asFile: true
|
||||||
|
});
|
||||||
return `id=${key},src=${file}`;
|
return `id=${key},src=${file}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,17 +147,17 @@ export class Build {
|
|||||||
return `id=${key},env=${value}`;
|
return `id=${key},env=${value}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static resolveSecret(kvp: string, file: boolean): [string, string] {
|
public static resolveSecret(kvp: string, opts?: ResolveSecretsOpts): [string, string] {
|
||||||
const [key, _value] = Build.parseSecretKvp(kvp);
|
const [key, value] = Build.parseSecretKvp(kvp, opts?.redact);
|
||||||
let value = _value;
|
const secretFile = Context.tmpName({tmpdir: Context.tmpDir()});
|
||||||
if (file) {
|
if (opts?.asFile) {
|
||||||
if (!fs.existsSync(value)) {
|
if (!fs.existsSync(value)) {
|
||||||
throw new Error(`secret file ${value} not found`);
|
throw new Error(`secret file ${value} not found`);
|
||||||
}
|
}
|
||||||
value = fs.readFileSync(value, {encoding: 'utf-8'});
|
fs.copyFileSync(value, secretFile);
|
||||||
|
} else {
|
||||||
|
fs.writeFileSync(secretFile, value);
|
||||||
}
|
}
|
||||||
const secretFile = Context.tmpName({tmpdir: Context.tmpDir()});
|
|
||||||
fs.writeFileSync(secretFile, value);
|
|
||||||
return [key, secretFile];
|
return [key, secretFile];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -310,13 +319,16 @@ export class Build {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static parseSecretKvp(kvp: string): [string, string] {
|
public static parseSecretKvp(kvp: string, redact?: boolean): [string, string] {
|
||||||
const delimiterIndex = kvp.indexOf('=');
|
const delimiterIndex = kvp.indexOf('=');
|
||||||
const key = kvp.substring(0, delimiterIndex);
|
const key = kvp.substring(0, delimiterIndex);
|
||||||
const value = kvp.substring(delimiterIndex + 1);
|
const value = kvp.substring(delimiterIndex + 1);
|
||||||
if (key.length == 0 || value.length == 0) {
|
if (key.length == 0 || value.length == 0) {
|
||||||
throw new Error(`${kvp} is not a valid secret`);
|
throw new Error(`${kvp} is not a valid secret`);
|
||||||
}
|
}
|
||||||
|
if (redact) {
|
||||||
|
core.setSecret(value);
|
||||||
|
}
|
||||||
return [key, value];
|
return [key, value];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import * as core from '@actions/core';
|
|||||||
import {Buildx} from './buildx';
|
import {Buildx} from './buildx';
|
||||||
import {Exec} from '../exec';
|
import {Exec} from '../exec';
|
||||||
|
|
||||||
import {BuilderInfo, GCPolicy, NodeInfo} from '../types/buildx/builder';
|
import {BuilderInfo, Device, GCPolicy, NodeInfo} from '../types/buildx/builder';
|
||||||
|
|
||||||
export interface BuilderOpts {
|
export interface BuilderOpts {
|
||||||
buildx?: Buildx;
|
buildx?: Buildx;
|
||||||
@@ -89,6 +89,8 @@ export class Builder {
|
|||||||
let parsingType: string | undefined;
|
let parsingType: string | undefined;
|
||||||
let currentNode: NodeInfo = {};
|
let currentNode: NodeInfo = {};
|
||||||
let currentGCPolicy: GCPolicy | undefined;
|
let currentGCPolicy: GCPolicy | undefined;
|
||||||
|
let currentDevice: Device | undefined;
|
||||||
|
let currentFile: string | undefined;
|
||||||
for (const line of data.trim().split(`\n`)) {
|
for (const line of data.trim().split(`\n`)) {
|
||||||
const [key, ...rest] = line.split(':');
|
const [key, ...rest] = line.split(':');
|
||||||
const lkey = key.toLowerCase();
|
const lkey = key.toLowerCase();
|
||||||
@@ -171,6 +173,10 @@ export class Builder {
|
|||||||
parsingType = 'label';
|
parsingType = 'label';
|
||||||
currentNode.labels = {};
|
currentNode.labels = {};
|
||||||
break;
|
break;
|
||||||
|
case lkey == 'devices':
|
||||||
|
parsingType = 'devices';
|
||||||
|
currentNode.devices = currentNode.devices || [];
|
||||||
|
break;
|
||||||
case lkey.startsWith('gc policy rule#'):
|
case lkey.startsWith('gc policy rule#'):
|
||||||
parsingType = 'gcpolicy';
|
parsingType = 'gcpolicy';
|
||||||
if (currentNode.gcPolicy && currentGCPolicy) {
|
if (currentNode.gcPolicy && currentGCPolicy) {
|
||||||
@@ -178,7 +184,17 @@ export class Builder {
|
|||||||
currentGCPolicy = undefined;
|
currentGCPolicy = undefined;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case lkey.startsWith('file#'):
|
||||||
|
parsingType = 'file';
|
||||||
|
currentFile = key.split('#')[1];
|
||||||
|
currentNode.files = currentNode.files || {};
|
||||||
|
currentNode.files[currentFile] = '';
|
||||||
|
break;
|
||||||
default: {
|
default: {
|
||||||
|
if (parsingType && parsingType !== 'devices' && currentNode.devices && currentDevice) {
|
||||||
|
currentNode.devices.push(currentDevice);
|
||||||
|
currentDevice = undefined;
|
||||||
|
}
|
||||||
switch (parsingType || '') {
|
switch (parsingType || '') {
|
||||||
case 'features': {
|
case 'features': {
|
||||||
currentNode.features = currentNode.features || {};
|
currentNode.features = currentNode.features || {};
|
||||||
@@ -190,6 +206,42 @@ export class Builder {
|
|||||||
currentNode.labels[key.trim()] = value;
|
currentNode.labels[key.trim()] = value;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 'devices': {
|
||||||
|
switch (lkey.trim()) {
|
||||||
|
case 'name': {
|
||||||
|
if (currentNode.devices && currentDevice) {
|
||||||
|
currentNode.devices.push(currentDevice);
|
||||||
|
}
|
||||||
|
currentDevice = {};
|
||||||
|
currentDevice.name = value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'on-demand': {
|
||||||
|
if (currentDevice && value) {
|
||||||
|
currentDevice.onDemand = value == 'true';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'automatically allowed': {
|
||||||
|
if (currentDevice && value) {
|
||||||
|
currentDevice.autoAllow = value == 'true';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'annotations': {
|
||||||
|
if (currentDevice) {
|
||||||
|
currentDevice.annotations = currentDevice.annotations || {};
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
if (currentDevice && currentDevice.annotations) {
|
||||||
|
currentDevice.annotations[key.trim()] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 'gcpolicy': {
|
case 'gcpolicy': {
|
||||||
currentNode.gcPolicy = currentNode.gcPolicy || [];
|
currentNode.gcPolicy = currentNode.gcPolicy || [];
|
||||||
currentGCPolicy = currentGCPolicy || {};
|
currentGCPolicy = currentGCPolicy || {};
|
||||||
@@ -212,6 +264,27 @@ export class Builder {
|
|||||||
currentGCPolicy.keepBytes = value;
|
currentGCPolicy.keepBytes = value;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 'reserved space': {
|
||||||
|
currentGCPolicy.reservedSpace = value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'max used space': {
|
||||||
|
currentGCPolicy.maxUsedSpace = value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'min free space': {
|
||||||
|
currentGCPolicy.minFreeSpace = value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'file': {
|
||||||
|
if (currentFile && currentNode.files) {
|
||||||
|
if (currentNode.files[currentFile].length > 0) {
|
||||||
|
currentNode.files[currentFile] += '\n';
|
||||||
|
}
|
||||||
|
currentNode.files[currentFile] += line.replace(/^\s>\s?/, '');
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -219,6 +292,9 @@ export class Builder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (currentDevice && currentNode.devices) {
|
||||||
|
currentNode.devices.push(currentDevice);
|
||||||
|
}
|
||||||
if (currentGCPolicy && currentNode.gcPolicy) {
|
if (currentGCPolicy && currentNode.gcPolicy) {
|
||||||
currentNode.gcPolicy.push(currentGCPolicy);
|
currentNode.gcPolicy.push(currentGCPolicy);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ import {Exec} from '../exec';
|
|||||||
import {GitHub} from '../github';
|
import {GitHub} from '../github';
|
||||||
import {Util} from '../util';
|
import {Util} from '../util';
|
||||||
|
|
||||||
import {ExportRecordOpts, ExportRecordResponse, Summaries} from '../types/buildx/history';
|
import {ExportOpts, ExportResponse, InspectOpts, InspectResponse, Summaries} from '../types/buildx/history';
|
||||||
|
|
||||||
export interface HistoryOpts {
|
export interface HistoryOpts {
|
||||||
buildx?: Buildx;
|
buildx?: Buildx;
|
||||||
@@ -37,27 +37,43 @@ export interface HistoryOpts {
|
|||||||
export class History {
|
export class History {
|
||||||
private readonly buildx: Buildx;
|
private readonly buildx: Buildx;
|
||||||
|
|
||||||
private static readonly EXPORT_BUILD_IMAGE_DEFAULT: string = 'docker.io/dockereng/export-build:latest';
|
|
||||||
private static readonly EXPORT_BUILD_IMAGE_ENV: string = 'DOCKER_BUILD_EXPORT_BUILD_IMAGE';
|
|
||||||
|
|
||||||
constructor(opts?: HistoryOpts) {
|
constructor(opts?: HistoryOpts) {
|
||||||
this.buildx = opts?.buildx || new Buildx();
|
this.buildx = opts?.buildx || new Buildx();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async export(opts: ExportRecordOpts): Promise<ExportRecordResponse> {
|
public async getCommand(args: Array<string>) {
|
||||||
if (os.platform() === 'win32') {
|
return await this.buildx.getCommand(['history', ...args]);
|
||||||
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');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
public async getInspectCommand(args: Array<string>) {
|
||||||
|
return await this.getCommand(['inspect', ...args]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async getExportCommand(args: Array<string>) {
|
||||||
|
return await this.getCommand(['export', ...args]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async inspect(opts: InspectOpts): Promise<InspectResponse> {
|
||||||
|
const args: Array<string> = ['--format', 'json'];
|
||||||
|
if (opts.builder) {
|
||||||
|
args.push('--builder', opts.builder);
|
||||||
|
}
|
||||||
|
if (opts.ref) {
|
||||||
|
args.push(opts.ref);
|
||||||
|
}
|
||||||
|
const cmd = await this.getInspectCommand(args);
|
||||||
|
return await Exec.getExecOutput(cmd.command, cmd.args, {
|
||||||
|
ignoreReturnCode: true,
|
||||||
|
silent: true
|
||||||
|
}).then(res => {
|
||||||
|
if (res.stderr.length > 0 && res.exitCode != 0) {
|
||||||
|
throw new Error(res.stderr.trim());
|
||||||
|
}
|
||||||
|
return <InspectResponse>JSON.parse(res.stdout);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public async export(opts: ExportOpts): Promise<ExportResponse> {
|
||||||
let builderName: string = '';
|
let builderName: string = '';
|
||||||
let nodeName: string = '';
|
let nodeName: string = '';
|
||||||
const refs: Array<string> = [];
|
const refs: Array<string> = [];
|
||||||
@@ -85,6 +101,72 @@ 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
// wait 3 seconds to ensure build records are finalized: https://github.com/moby/buildkit/pull/5109
|
||||||
|
await Util.sleep(3);
|
||||||
|
|
||||||
|
const summaries: Summaries = {};
|
||||||
|
if (!opts.noSummaries) {
|
||||||
|
for (const ref of refs) {
|
||||||
|
await this.inspect({
|
||||||
|
ref: ref,
|
||||||
|
builder: builderName
|
||||||
|
}).then(res => {
|
||||||
|
let errorLogs = '';
|
||||||
|
if (res.Error && res.Status !== 'canceled') {
|
||||||
|
if (res.Error.Message) {
|
||||||
|
errorLogs = res.Error.Message;
|
||||||
|
} else if (res.Error.Name && res.Error.Logs) {
|
||||||
|
errorLogs = `=> ${res.Error.Name}\n${res.Error.Logs}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
summaries[ref] = {
|
||||||
|
name: res.Name,
|
||||||
|
status: res.Status,
|
||||||
|
duration: Util.formatDuration(res.Duration),
|
||||||
|
numCachedSteps: res.NumCachedSteps,
|
||||||
|
numTotalSteps: res.NumTotalSteps,
|
||||||
|
numCompletedSteps: res.NumCompletedSteps,
|
||||||
|
error: errorLogs
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const dockerbuildPath = path.join(outDir, `${History.exportFilename(refs)}.dockerbuild`);
|
||||||
|
|
||||||
|
const cmd = await this.getExportCommand(['--builder', builderName, '--output', dockerbuildPath, ...refs]);
|
||||||
|
await Exec.getExecOutput(cmd.command, cmd.args);
|
||||||
|
|
||||||
|
const dockerbuildStats = fs.statSync(dockerbuildPath);
|
||||||
|
|
||||||
|
return {
|
||||||
|
dockerbuildFilename: dockerbuildPath,
|
||||||
|
dockerbuildSize: dockerbuildStats.size,
|
||||||
|
builderName: builderName,
|
||||||
|
nodeName: nodeName,
|
||||||
|
refs: refs,
|
||||||
|
summaries: summaries
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
// wait 3 seconds to ensure build records are finalized: https://github.com/moby/buildkit/pull/5109
|
||||||
await Util.sleep(3);
|
await Util.sleep(3);
|
||||||
|
|
||||||
@@ -139,7 +221,7 @@ export class History {
|
|||||||
'run', '--rm', '-i',
|
'run', '--rm', '-i',
|
||||||
'-v', `${Buildx.refsDir}:/buildx-refs`,
|
'-v', `${Buildx.refsDir}:/buildx-refs`,
|
||||||
'-v', `${outDir}:/out`,
|
'-v', `${outDir}:/out`,
|
||||||
opts.image || process.env[History.EXPORT_BUILD_IMAGE_ENV] || History.EXPORT_BUILD_IMAGE_DEFAULT,
|
image || process.env['DOCKER_BUILD_EXPORT_BUILD_IMAGE'] || 'docker.io/dockereng/export-build:latest',
|
||||||
...ebargs
|
...ebargs
|
||||||
]
|
]
|
||||||
core.info(`[command]docker ${dockerRunArgs.join(' ')}`);
|
core.info(`[command]docker ${dockerRunArgs.join(' ')}`);
|
||||||
@@ -190,12 +272,7 @@ export class History {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let dockerbuildFilename = `${GitHub.context.repo.owner}~${GitHub.context.repo.repo}~${refs[0].substring(0, 6).toUpperCase()}`;
|
const dockerbuildPath = path.join(outDir, `${History.exportFilename(refs)}.dockerbuild`);
|
||||||
if (refs.length > 1) {
|
|
||||||
dockerbuildFilename += `+${refs.length - 1}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
const dockerbuildPath = path.join(outDir, `${dockerbuildFilename}.dockerbuild`);
|
|
||||||
fs.renameSync(tmpDockerbuildFilename, dockerbuildPath);
|
fs.renameSync(tmpDockerbuildFilename, dockerbuildPath);
|
||||||
const dockerbuildStats = fs.statSync(dockerbuildPath);
|
const dockerbuildStats = fs.statSync(dockerbuildPath);
|
||||||
|
|
||||||
@@ -212,4 +289,12 @@ export class History {
|
|||||||
refs: refs
|
refs: refs
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static exportFilename(refs: Array<string>): string {
|
||||||
|
let name = `${GitHub.context.repo.owner}~${GitHub.context.repo.repo}~${refs[0].substring(0, 6).toUpperCase()}`;
|
||||||
|
if (refs.length > 1) {
|
||||||
|
name += `+${refs.length - 1}`;
|
||||||
|
}
|
||||||
|
return name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
23
src/cache.ts
23
src/cache.ts
@@ -55,7 +55,7 @@ export class Cache {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async save(file: string): Promise<string> {
|
public async save(file: string, skipState?: boolean): Promise<string> {
|
||||||
core.debug(`Cache.save ${file}`);
|
core.debug(`Cache.save ${file}`);
|
||||||
const cachePath = this.copyToCache(file);
|
const cachePath = this.copyToCache(file);
|
||||||
|
|
||||||
@@ -63,14 +63,19 @@ export class Cache {
|
|||||||
core.debug(`Cache.save cached to hosted tool cache ${htcPath}`);
|
core.debug(`Cache.save cached to hosted tool cache ${htcPath}`);
|
||||||
|
|
||||||
if (!this.ghaNoCache && cache.isFeatureAvailable()) {
|
if (!this.ghaNoCache && cache.isFeatureAvailable()) {
|
||||||
core.debug(`Cache.save sending ${this.ghaCacheKey} to post state`);
|
if (skipState) {
|
||||||
core.saveState(
|
core.debug(`Cache.save caching ${this.ghaCacheKey} to GitHub Actions cache`);
|
||||||
Cache.POST_CACHE_KEY,
|
await cache.saveCache([this.cacheDir], this.ghaCacheKey);
|
||||||
JSON.stringify({
|
} else {
|
||||||
dir: this.cacheDir,
|
core.debug(`Cache.save sending ${this.ghaCacheKey} to post state`);
|
||||||
key: this.ghaCacheKey
|
core.saveState(
|
||||||
} as CachePostState)
|
Cache.POST_CACHE_KEY,
|
||||||
);
|
JSON.stringify({
|
||||||
|
dir: this.cacheDir,
|
||||||
|
key: this.ghaCacheKey
|
||||||
|
} as CachePostState)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return cachePath;
|
return cachePath;
|
||||||
|
|||||||
@@ -63,9 +63,9 @@ export class Install {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const installCache = new Cache({
|
const installCache = new Cache({
|
||||||
htcName: 'compose-dl-bin',
|
htcName: version.key != 'official' ? `compose-dl-bin-${version.key}` : 'compose-dl-bin',
|
||||||
htcVersion: vspec,
|
htcVersion: vspec,
|
||||||
baseCacheDir: path.join(os.homedir(), '.bin'),
|
baseCacheDir: path.join(os.homedir(), '.bin', 'docker-compose'),
|
||||||
cacheFile: os.platform() == 'win32' ? 'docker-compose.exe' : 'docker-compose',
|
cacheFile: os.platform() == 'win32' ? 'docker-compose.exe' : 'docker-compose',
|
||||||
ghaNoCache: ghaNoCache
|
ghaNoCache: ghaNoCache
|
||||||
});
|
});
|
||||||
@@ -172,11 +172,32 @@ export class Install {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static async getDownloadVersion(v: string): Promise<DownloadVersion> {
|
public static async getDownloadVersion(v: string): Promise<DownloadVersion> {
|
||||||
return {
|
let [repoKey, version] = v.split(':');
|
||||||
version: v,
|
if (!version) {
|
||||||
downloadURL: 'https://github.com/docker/compose/releases/download/v%s/%s',
|
version = repoKey;
|
||||||
releasesURL: 'https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-releases.json'
|
repoKey = 'official';
|
||||||
};
|
}
|
||||||
|
switch (repoKey) {
|
||||||
|
case 'official': {
|
||||||
|
return {
|
||||||
|
key: repoKey,
|
||||||
|
version: version,
|
||||||
|
downloadURL: 'https://github.com/docker/compose/releases/download/v%s/%s',
|
||||||
|
releasesURL: 'https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-releases.json'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
case 'cloud': {
|
||||||
|
return {
|
||||||
|
key: repoKey,
|
||||||
|
version: version,
|
||||||
|
downloadURL: 'https://github.com/docker/compose-desktop/releases/download/v%s/%s',
|
||||||
|
releasesURL: 'https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-lab-releases.json'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
throw new Error(`Cannot find compose version for ${v}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async getRelease(version: DownloadVersion): Promise<GitHubRelease> {
|
public static async getRelease(version: DownloadVersion): Promise<GitHubRelease> {
|
||||||
|
|||||||
@@ -162,12 +162,19 @@ images:
|
|||||||
arch: "{{arch}}"
|
arch: "{{arch}}"
|
||||||
digest: "{{digest}}"
|
digest: "{{digest}}"
|
||||||
{{/each}}
|
{{/each}}
|
||||||
- location: "https://cloud-images.ubuntu.com/releases/24.04/release-20241004/ubuntu-24.04-server-cloudimg-amd64.img"
|
- location: "https://cloud-images.ubuntu.com/releases/24.04/release-20250228/ubuntu-24.04-server-cloudimg-amd64.img"
|
||||||
arch: "x86_64"
|
arch: "x86_64"
|
||||||
digest: "sha256:fad101d50b06b26590cf30542349f9e9d3041ad7929e3bc3531c81ec27f2c788"
|
digest: "sha256:a3aea891c930ee0c762077b963834f5e083eb8102574f1e4dfc9e6e4c1c73ac0"
|
||||||
- location: "https://cloud-images.ubuntu.com/releases/24.04/release-20241004/ubuntu-24.04-server-cloudimg-arm64.img"
|
kernel:
|
||||||
|
location: "https://cloud-images.ubuntu.com/releases/24.04/release-20250228/unpacked/ubuntu-24.04-server-cloudimg-amd64-vmlinuz-generic"
|
||||||
|
digest: "sha256:2d9f30959f01675fd28aa1c2fe8934728e46766d04ecfad2d206823696a3f830"
|
||||||
|
cmdline: "root=LABEL=cloudimg-rootfs ro console=tty1 console=ttyAMA0 no_timer_check"
|
||||||
|
initrd:
|
||||||
|
location: "https://cloud-images.ubuntu.com/releases/24.04/release-20250228/unpacked/ubuntu-24.04-server-cloudimg-amd64-initrd-generic"
|
||||||
|
digest: "sha256:231352d027aeebf0bb7dca281dfebae894c86e789c7377788d3c2c149471caa3"
|
||||||
|
- location: "https://cloud-images.ubuntu.com/releases/24.04/release-20250228/ubuntu-24.04-server-cloudimg-arm64.img"
|
||||||
arch: "aarch64"
|
arch: "aarch64"
|
||||||
digest: "sha256:e380b683b0c497d2a87af8a5dbe94c42eb54548fa976167f307ed8cf3944ec57"
|
digest: "sha256:278a0e8475008673d9d3da10ae66a7b1a3dda059746b83d749eca386a5670bd4"
|
||||||
# Fallback to the latest release image.
|
# Fallback to the latest release image.
|
||||||
# Hint: run \`limactl prune\` to invalidate the cache
|
# Hint: run \`limactl prune\` to invalidate the cache
|
||||||
- location: "https://cloud-images.ubuntu.com/releases/24.04/release/ubuntu-24.04-server-cloudimg-amd64.img"
|
- location: "https://cloud-images.ubuntu.com/releases/24.04/release/ubuntu-24.04-server-cloudimg-amd64.img"
|
||||||
@@ -250,7 +257,7 @@ provision:
|
|||||||
x86_64) arch=amd64;;
|
x86_64) arch=amd64;;
|
||||||
aarch64) arch=arm64;;
|
aarch64) arch=arm64;;
|
||||||
esac
|
esac
|
||||||
url="https://github.com/crazy-max/undock/releases/download/v0.8.0/undock_0.8.0_linux_$arch.tar.gz"
|
url="https://github.com/crazy-max/undock/releases/download/v0.10.0/undock_0.10.0_linux_$arch.tar.gz"
|
||||||
|
|
||||||
wget "$url" -O /tmp/undock.tar.gz
|
wget "$url" -O /tmp/undock.tar.gz
|
||||||
tar -C /usr/local/bin -xvf /tmp/undock.tar.gz
|
tar -C /usr/local/bin -xvf /tmp/undock.tar.gz
|
||||||
|
|||||||
@@ -28,11 +28,13 @@ import * as tc from '@actions/tool-cache';
|
|||||||
|
|
||||||
import {Context} from '../context';
|
import {Context} from '../context';
|
||||||
import {Docker} from './docker';
|
import {Docker} from './docker';
|
||||||
|
import {Regctl} from '../regclient/regctl';
|
||||||
|
import {Undock} from '../undock/undock';
|
||||||
import {Exec} from '../exec';
|
import {Exec} from '../exec';
|
||||||
import {Util} from '../util';
|
import {Util} from '../util';
|
||||||
import {limaYamlData, dockerServiceLogsPs1, setupDockerWinPs1} from './assets';
|
import {limaYamlData, dockerServiceLogsPs1, setupDockerWinPs1} from './assets';
|
||||||
|
|
||||||
import {GitHubRelease} from '../types/github';
|
import {GitHubRelease} from '../types/github';
|
||||||
import {HubRepository} from '../hubRepository';
|
|
||||||
import {Image} from '../types/oci/config';
|
import {Image} from '../types/oci/config';
|
||||||
|
|
||||||
export interface InstallSourceImage {
|
export interface InstallSourceImage {
|
||||||
@@ -57,6 +59,9 @@ export interface InstallOpts {
|
|||||||
daemonConfig?: string;
|
daemonConfig?: string;
|
||||||
rootless?: boolean;
|
rootless?: boolean;
|
||||||
localTCPPort?: number;
|
localTCPPort?: number;
|
||||||
|
|
||||||
|
regctl: Regctl;
|
||||||
|
undock: Undock;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface LimaImage {
|
interface LimaImage {
|
||||||
@@ -72,6 +77,8 @@ export class Install {
|
|||||||
private readonly daemonConfig?: string;
|
private readonly daemonConfig?: string;
|
||||||
private readonly rootless: boolean;
|
private readonly rootless: boolean;
|
||||||
private readonly localTCPPort?: number;
|
private readonly localTCPPort?: number;
|
||||||
|
private readonly regctl: Regctl;
|
||||||
|
private readonly undock: Undock;
|
||||||
|
|
||||||
private _version: string | undefined;
|
private _version: string | undefined;
|
||||||
private _toolDir: string | undefined;
|
private _toolDir: string | undefined;
|
||||||
@@ -91,36 +98,14 @@ export class Install {
|
|||||||
this.daemonConfig = opts.daemonConfig;
|
this.daemonConfig = opts.daemonConfig;
|
||||||
this.rootless = opts.rootless || false;
|
this.rootless = opts.rootless || false;
|
||||||
this.localTCPPort = opts.localTCPPort;
|
this.localTCPPort = opts.localTCPPort;
|
||||||
|
this.regctl = opts.regctl;
|
||||||
|
this.undock = opts.undock;
|
||||||
}
|
}
|
||||||
|
|
||||||
get toolDir(): string {
|
get toolDir(): string {
|
||||||
return this._toolDir || Context.tmpDir();
|
return this._toolDir || Context.tmpDir();
|
||||||
}
|
}
|
||||||
|
|
||||||
async downloadStaticArchive(component: 'docker' | 'docker-rootless-extras', src: InstallSourceArchive): Promise<string> {
|
|
||||||
const release: GitHubRelease = await Install.getRelease(src.version);
|
|
||||||
this._version = release.tag_name.replace(/^v+|v+$/g, '');
|
|
||||||
core.debug(`docker.Install.download version: ${this._version}`);
|
|
||||||
|
|
||||||
const downloadURL = this.downloadURL(component, this._version, src.channel);
|
|
||||||
core.info(`Downloading ${downloadURL}`);
|
|
||||||
|
|
||||||
const downloadPath = await tc.downloadTool(downloadURL);
|
|
||||||
core.debug(`docker.Install.download downloadPath: ${downloadPath}`);
|
|
||||||
|
|
||||||
let extractFolder;
|
|
||||||
if (os.platform() == 'win32') {
|
|
||||||
extractFolder = await tc.extractZip(downloadPath, extractFolder);
|
|
||||||
} else {
|
|
||||||
extractFolder = await tc.extractTar(downloadPath, extractFolder);
|
|
||||||
}
|
|
||||||
if (Util.isDirectory(path.join(extractFolder, component))) {
|
|
||||||
extractFolder = path.join(extractFolder, component);
|
|
||||||
}
|
|
||||||
core.debug(`docker.Install.download extractFolder: ${extractFolder}`);
|
|
||||||
return extractFolder;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async download(): Promise<string> {
|
public async download(): Promise<string> {
|
||||||
let extractFolder: string;
|
let extractFolder: string;
|
||||||
let cacheKey: string;
|
let cacheKey: string;
|
||||||
@@ -128,39 +113,9 @@ export class Install {
|
|||||||
|
|
||||||
switch (this.source.type) {
|
switch (this.source.type) {
|
||||||
case 'image': {
|
case 'image': {
|
||||||
const tag = this.source.tag;
|
this._version = this.source.tag;
|
||||||
this._version = tag;
|
|
||||||
cacheKey = `docker-image`;
|
cacheKey = `docker-image`;
|
||||||
|
extractFolder = await this.downloadSourceImage(platform);
|
||||||
core.info(`Downloading docker cli from dockereng/cli-bin:${tag}`);
|
|
||||||
const cli = await HubRepository.build('dockereng/cli-bin');
|
|
||||||
extractFolder = await cli.extractImage(tag);
|
|
||||||
|
|
||||||
const moby = await HubRepository.build('moby/moby-bin');
|
|
||||||
if (['win32', 'linux'].includes(platform)) {
|
|
||||||
core.info(`Downloading dockerd from moby/moby-bin:${tag}`);
|
|
||||||
await moby.extractImage(tag, extractFolder);
|
|
||||||
} else if (platform == 'darwin') {
|
|
||||||
// On macOS, the docker daemon binary will be downloaded inside the lima VM.
|
|
||||||
// However, we will get the exact git revision from the image config
|
|
||||||
// to get the matching systemd unit files.
|
|
||||||
core.info(`Getting git revision from moby/moby-bin:${tag}`);
|
|
||||||
|
|
||||||
// There's no macOS image for moby/moby-bin - a linux daemon is run inside lima.
|
|
||||||
const manifest = await moby.getPlatformManifest(tag, 'linux');
|
|
||||||
|
|
||||||
const config = await moby.getJSONBlob<Image>(manifest.config.digest);
|
|
||||||
core.debug(`Config ${JSON.stringify(config.config)}`);
|
|
||||||
|
|
||||||
this.gitCommit = config.config?.Labels?.['org.opencontainers.image.revision'];
|
|
||||||
if (!this.gitCommit) {
|
|
||||||
core.warning(`No git revision can be determined from the image. Will use master.`);
|
|
||||||
this.gitCommit = 'master';
|
|
||||||
}
|
|
||||||
core.info(`Git revision is ${this.gitCommit}`);
|
|
||||||
} else {
|
|
||||||
core.warning(`dockerd not supported on ${platform}, only the Docker cli will be available`);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'archive': {
|
case 'archive': {
|
||||||
@@ -170,10 +125,10 @@ export class Install {
|
|||||||
this._version = version;
|
this._version = version;
|
||||||
|
|
||||||
core.info(`Downloading Docker ${version} from ${this.source.channel} at download.docker.com`);
|
core.info(`Downloading Docker ${version} from ${this.source.channel} at download.docker.com`);
|
||||||
extractFolder = await this.downloadStaticArchive('docker', this.source);
|
extractFolder = await this.downloadSourceArchive('docker', this.source);
|
||||||
if (this.rootless) {
|
if (this.rootless) {
|
||||||
core.info(`Downloading Docker rootless extras ${version} from ${this.source.channel} at download.docker.com`);
|
core.info(`Downloading Docker rootless extras ${version} from ${this.source.channel} at download.docker.com`);
|
||||||
const extrasFolder = await this.downloadStaticArchive('docker-rootless-extras', this.source);
|
const extrasFolder = await this.downloadSourceArchive('docker-rootless-extras', this.source);
|
||||||
fs.readdirSync(extrasFolder).forEach(file => {
|
fs.readdirSync(extrasFolder).forEach(file => {
|
||||||
const src = path.join(extrasFolder, file);
|
const src = path.join(extrasFolder, file);
|
||||||
const dest = path.join(extractFolder, file);
|
const dest = path.join(extractFolder, file);
|
||||||
@@ -191,7 +146,9 @@ export class Install {
|
|||||||
}
|
}
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
files.forEach(function (file, index) {
|
files.forEach(function (file, index) {
|
||||||
fs.chmodSync(path.join(extractFolder, file), '0755');
|
if (!Util.isDirectory(path.join(extractFolder, file))) {
|
||||||
|
fs.chmodSync(path.join(extractFolder, file), '0755');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -203,6 +160,72 @@ export class Install {
|
|||||||
return tooldir;
|
return tooldir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async downloadSourceImage(platform: string): Promise<string> {
|
||||||
|
const dest = path.join(Context.tmpDir(), 'docker-install-image');
|
||||||
|
const cliImage = `dockereng/cli-bin:${this._version}`;
|
||||||
|
const engineImage = `moby/moby-bin:${this._version}`;
|
||||||
|
|
||||||
|
core.info(`Downloading Docker CLI from ${cliImage}`);
|
||||||
|
await this.undock.run({
|
||||||
|
source: cliImage,
|
||||||
|
dist: dest
|
||||||
|
});
|
||||||
|
|
||||||
|
if (['win32', 'linux'].includes(platform)) {
|
||||||
|
core.info(`Downloading Docker engine from ${engineImage}`);
|
||||||
|
await this.undock.run({
|
||||||
|
source: engineImage,
|
||||||
|
dist: dest
|
||||||
|
});
|
||||||
|
} else if (platform == 'darwin') {
|
||||||
|
// On macOS, the docker daemon binary will be downloaded inside the lima VM.
|
||||||
|
// However, we will get the exact git revision from the image config
|
||||||
|
// to get the matching systemd unit files. There's no macOS image for
|
||||||
|
// moby/moby-bin - a linux daemon is run inside lima.
|
||||||
|
try {
|
||||||
|
const engineImageConfig = await this.imageConfig(engineImage, 'linux/arm64');
|
||||||
|
core.debug(`docker.Install.downloadSourceImage engineImageConfig: ${JSON.stringify(engineImageConfig)}`);
|
||||||
|
this.gitCommit = engineImageConfig.config?.Labels?.['org.opencontainers.image.revision'];
|
||||||
|
if (!this.gitCommit) {
|
||||||
|
throw new Error(`No git revision can be determined from the image`);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
core.warning(e);
|
||||||
|
this.gitCommit = 'master';
|
||||||
|
}
|
||||||
|
|
||||||
|
core.debug(`docker.Install.downloadSourceImage gitCommit: ${this.gitCommit}`);
|
||||||
|
} else {
|
||||||
|
core.warning(`Docker engine not supported on ${platform}, only the Docker cli will be available`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async downloadSourceArchive(component: 'docker' | 'docker-rootless-extras', src: InstallSourceArchive): Promise<string> {
|
||||||
|
const release: GitHubRelease = await Install.getRelease(src.version);
|
||||||
|
this._version = release.tag_name.replace(/^v+|v+$/g, '');
|
||||||
|
core.debug(`docker.Install.downloadSourceArchive version: ${this._version}`);
|
||||||
|
|
||||||
|
const downloadURL = this.downloadURL(component, this._version, src.channel);
|
||||||
|
core.info(`Downloading ${downloadURL}`);
|
||||||
|
|
||||||
|
const downloadPath = await tc.downloadTool(downloadURL);
|
||||||
|
core.debug(`docker.Install.downloadSourceArchive downloadPath: ${downloadPath}`);
|
||||||
|
|
||||||
|
let extractFolder;
|
||||||
|
if (os.platform() == 'win32') {
|
||||||
|
extractFolder = await tc.extractZip(downloadPath, extractFolder);
|
||||||
|
} else {
|
||||||
|
extractFolder = await tc.extractTar(downloadPath, extractFolder);
|
||||||
|
}
|
||||||
|
if (Util.isDirectory(path.join(extractFolder, component))) {
|
||||||
|
extractFolder = path.join(extractFolder, component);
|
||||||
|
}
|
||||||
|
core.debug(`docker.Install.downloadSourceArchive extractFolder: ${extractFolder}`);
|
||||||
|
return extractFolder;
|
||||||
|
}
|
||||||
|
|
||||||
public async install(): Promise<string> {
|
public async install(): Promise<string> {
|
||||||
if (!this.toolDir) {
|
if (!this.toolDir) {
|
||||||
throw new Error('toolDir must be set. Run download first.');
|
throw new Error('toolDir must be set. Run download first.');
|
||||||
@@ -709,4 +732,20 @@ EOF`,
|
|||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async imageConfig(image: string, platform?: string): Promise<Image> {
|
||||||
|
const manifest = await this.regctl.manifestGet({
|
||||||
|
image: image,
|
||||||
|
platform: platform
|
||||||
|
});
|
||||||
|
const configDigest = manifest?.config?.digest;
|
||||||
|
if (!configDigest) {
|
||||||
|
throw new Error(`No config digest found for image ${image}`);
|
||||||
|
}
|
||||||
|
const blob = await this.regctl.blobGet({
|
||||||
|
repository: image,
|
||||||
|
digest: configDigest
|
||||||
|
});
|
||||||
|
return <Image>JSON.parse(blob);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -269,56 +269,58 @@ export class GitHub {
|
|||||||
// Feedback survey
|
// Feedback survey
|
||||||
sum.addRaw(`<p>`).addRaw(`Find this useful? `).addRaw(addLink('Let us know', 'https://docs.docker.com/feedback/gha-build-summary')).addRaw('</p>');
|
sum.addRaw(`<p>`).addRaw(`Find this useful? `).addRaw(addLink('Let us know', 'https://docs.docker.com/feedback/gha-build-summary')).addRaw('</p>');
|
||||||
|
|
||||||
// Preview
|
if (opts.exportRes.summaries) {
|
||||||
sum.addRaw('<p>');
|
// Preview
|
||||||
const summaryTableData: Array<Array<SummaryTableCell>> = [
|
sum.addRaw('<p>');
|
||||||
[
|
const summaryTableData: Array<Array<SummaryTableCell>> = [
|
||||||
{header: true, data: 'ID'},
|
[
|
||||||
{header: true, data: 'Name'},
|
{header: true, data: 'ID'},
|
||||||
{header: true, data: 'Status'},
|
{header: true, data: 'Name'},
|
||||||
{header: true, data: 'Cached'},
|
{header: true, data: 'Status'},
|
||||||
{header: true, data: 'Duration'}
|
{header: true, data: 'Cached'},
|
||||||
]
|
{header: true, data: 'Duration'}
|
||||||
];
|
]
|
||||||
let buildError: string | undefined;
|
];
|
||||||
for (const ref in opts.exportRes.summaries) {
|
let buildError: string | undefined;
|
||||||
if (Object.prototype.hasOwnProperty.call(opts.exportRes.summaries, ref)) {
|
for (const ref in opts.exportRes.summaries) {
|
||||||
const summary = opts.exportRes.summaries[ref];
|
if (Object.prototype.hasOwnProperty.call(opts.exportRes.summaries, ref)) {
|
||||||
// prettier-ignore
|
const summary = opts.exportRes.summaries[ref];
|
||||||
summaryTableData.push([
|
// prettier-ignore
|
||||||
|
summaryTableData.push([
|
||||||
{data: `<code>${ref.substring(0, 6).toUpperCase()}</code>`},
|
{data: `<code>${ref.substring(0, 6).toUpperCase()}</code>`},
|
||||||
{data: `<strong>${Util.stringToUnicodeEntities(summary.name)}</strong>`},
|
{data: `<strong>${Util.stringToUnicodeEntities(summary.name)}</strong>`},
|
||||||
{data: `${summary.status === 'completed' ? ':white_check_mark:' : summary.status === 'canceled' ? ':no_entry_sign:' : ':x:'} ${summary.status}`},
|
{data: `${summary.status === 'completed' ? ':white_check_mark:' : summary.status === 'canceled' ? ':no_entry_sign:' : ':x:'} ${summary.status}`},
|
||||||
{data: `${summary.numCachedSteps > 0 ? Math.round((summary.numCachedSteps / summary.numTotalSteps) * 100) : 0}%`},
|
{data: `${summary.numCachedSteps > 0 ? Math.round((summary.numCachedSteps / summary.numTotalSteps) * 100) : 0}%`},
|
||||||
{data: summary.duration}
|
{data: summary.duration}
|
||||||
]);
|
]);
|
||||||
if (summary.error) {
|
if (summary.error) {
|
||||||
buildError = summary.error;
|
buildError = summary.error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
sum.addTable([...summaryTableData]);
|
||||||
sum.addTable([...summaryTableData]);
|
sum.addRaw(`</p>`);
|
||||||
sum.addRaw(`</p>`);
|
|
||||||
|
|
||||||
// Build error
|
// Build error
|
||||||
if (buildError) {
|
if (buildError) {
|
||||||
sum.addRaw(`<blockquote>`);
|
sum.addRaw(`<blockquote>`);
|
||||||
if (Util.countLines(buildError) > 10) {
|
if (Util.countLines(buildError) > 10) {
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
sum
|
sum
|
||||||
.addRaw(`<details><summary><strong>Error</strong></summary>`)
|
.addRaw(`<details><summary><strong>Error</strong></summary>`)
|
||||||
.addCodeBlock(he.encode(buildError), 'text')
|
.addCodeBlock(he.encode(buildError), 'text')
|
||||||
.addRaw(`</details>`);
|
.addRaw(`</details>`);
|
||||||
} else {
|
} else {
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
sum
|
sum
|
||||||
.addRaw(`<strong>Error</strong>`)
|
.addRaw(`<strong>Error</strong>`)
|
||||||
.addBreak()
|
.addBreak()
|
||||||
.addRaw(`<p>`)
|
.addRaw(`<p>`)
|
||||||
.addCodeBlock(he.encode(buildError), 'text')
|
.addCodeBlock(he.encode(buildError), 'text')
|
||||||
.addRaw(`</p>`);
|
.addRaw(`</p>`);
|
||||||
|
}
|
||||||
|
sum.addRaw(`</blockquote>`);
|
||||||
}
|
}
|
||||||
sum.addRaw(`</blockquote>`);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build inputs
|
// Build inputs
|
||||||
|
|||||||
@@ -1,174 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright 2023 actions-toolkit authors
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import * as httpm from '@actions/http-client';
|
|
||||||
import {Index} from './types/oci';
|
|
||||||
import os from 'os';
|
|
||||||
import * as core from '@actions/core';
|
|
||||||
import {Manifest} from './types/oci/manifest';
|
|
||||||
import * as tc from '@actions/tool-cache';
|
|
||||||
import fs from 'fs';
|
|
||||||
import {MEDIATYPE_IMAGE_CONFIG_V1, MEDIATYPE_IMAGE_INDEX_V1, MEDIATYPE_IMAGE_MANIFEST_V1} from './types/oci/mediatype';
|
|
||||||
import {MEDIATYPE_IMAGE_CONFIG_V1 as DOCKER_MEDIATYPE_IMAGE_CONFIG_V1, MEDIATYPE_IMAGE_MANIFEST_LIST_V2, MEDIATYPE_IMAGE_MANIFEST_V2} from './types/docker/mediatype';
|
|
||||||
import {DockerHub} from './dockerhub';
|
|
||||||
|
|
||||||
export class HubRepository {
|
|
||||||
private repo: string;
|
|
||||||
private token: string;
|
|
||||||
private static readonly http: httpm.HttpClient = new httpm.HttpClient('setup-docker-action');
|
|
||||||
|
|
||||||
private constructor(repository: string, token: string) {
|
|
||||||
this.repo = repository;
|
|
||||||
this.token = token;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async build(repository: string): Promise<HubRepository> {
|
|
||||||
const token = await this.getToken(repository);
|
|
||||||
return new HubRepository(repository, token);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async getPlatformManifest(tagOrDigest: string, os?: string): Promise<Manifest> {
|
|
||||||
const index = await this.getManifest<Index>(tagOrDigest);
|
|
||||||
if (index.mediaType != MEDIATYPE_IMAGE_INDEX_V1 && index.mediaType != MEDIATYPE_IMAGE_MANIFEST_LIST_V2) {
|
|
||||||
core.error(`Unsupported image media type: ${index.mediaType}`);
|
|
||||||
throw new Error(`Unsupported image media type: ${index.mediaType}`);
|
|
||||||
}
|
|
||||||
const digest = HubRepository.getPlatformManifestDigest(index, os);
|
|
||||||
return await this.getManifest<Manifest>(digest);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unpacks the image layers and returns the path to the extracted image.
|
|
||||||
// Only OCI indexes/manifest list are supported for now.
|
|
||||||
public async extractImage(tag: string, destDir?: string): Promise<string> {
|
|
||||||
const manifest = await this.getPlatformManifest(tag);
|
|
||||||
|
|
||||||
const paths = manifest.layers.map(async layer => {
|
|
||||||
const url = this.blobUrl(layer.digest);
|
|
||||||
|
|
||||||
return await tc.downloadTool(url, undefined, undefined, {
|
|
||||||
authorization: `Bearer ${this.token}`
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
let files = await Promise.all(paths);
|
|
||||||
let extractFolder: string;
|
|
||||||
if (!destDir) {
|
|
||||||
extractFolder = await tc.extractTar(files[0]);
|
|
||||||
files = files.slice(1);
|
|
||||||
} else {
|
|
||||||
extractFolder = destDir;
|
|
||||||
}
|
|
||||||
|
|
||||||
await Promise.all(
|
|
||||||
files.map(async file => {
|
|
||||||
return await tc.extractTar(file, extractFolder);
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
fs.readdirSync(extractFolder).forEach(file => {
|
|
||||||
core.info(`extractImage(${this.repo}:${tag}) file: ${file}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
return extractFolder;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static async getToken(repo: string): Promise<string> {
|
|
||||||
const url = `https://auth.docker.io/token?service=registry.docker.io&scope=repository:${repo}:pull`;
|
|
||||||
|
|
||||||
const resp = await this.http.get(url);
|
|
||||||
const body = await resp.readBody();
|
|
||||||
const statusCode = resp.message.statusCode || 500;
|
|
||||||
if (statusCode != 200) {
|
|
||||||
throw DockerHub.parseError(resp, body);
|
|
||||||
}
|
|
||||||
|
|
||||||
const json = JSON.parse(body);
|
|
||||||
return json.token;
|
|
||||||
}
|
|
||||||
|
|
||||||
private blobUrl(digest: string): string {
|
|
||||||
return `https://registry-1.docker.io/v2/${this.repo}/blobs/${digest}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async getManifest<T>(tagOrDigest: string): Promise<T> {
|
|
||||||
return await this.registryGet<T>(tagOrDigest, 'manifests', [MEDIATYPE_IMAGE_INDEX_V1, MEDIATYPE_IMAGE_MANIFEST_LIST_V2, MEDIATYPE_IMAGE_MANIFEST_V1, MEDIATYPE_IMAGE_MANIFEST_V2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async getJSONBlob<T>(tagOrDigest: string): Promise<T> {
|
|
||||||
return await this.registryGet<T>(tagOrDigest, 'blobs', [MEDIATYPE_IMAGE_CONFIG_V1, DOCKER_MEDIATYPE_IMAGE_CONFIG_V1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async registryGet<T>(tagOrDigest: string, endpoint: 'manifests' | 'blobs', accept: Array<string>): Promise<T> {
|
|
||||||
const url = `https://registry-1.docker.io/v2/${this.repo}/${endpoint}/${tagOrDigest}`;
|
|
||||||
|
|
||||||
const headers = {
|
|
||||||
Authorization: `Bearer ${this.token}`,
|
|
||||||
Accept: accept.join(', ')
|
|
||||||
};
|
|
||||||
|
|
||||||
const resp = await HubRepository.http.get(url, headers);
|
|
||||||
const body = await resp.readBody();
|
|
||||||
const statusCode = resp.message.statusCode || 500;
|
|
||||||
if (statusCode != 200) {
|
|
||||||
core.error(`registryGet(${this.repo}:${tagOrDigest}) failed: ${statusCode} ${body}`);
|
|
||||||
throw DockerHub.parseError(resp, body);
|
|
||||||
}
|
|
||||||
|
|
||||||
return <T>JSON.parse(body);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static getPlatformManifestDigest(index: Index, osOverride?: string): string {
|
|
||||||
// This doesn't handle all possible platforms normalizations, but it's good enough for now.
|
|
||||||
let pos: string = osOverride || os.platform();
|
|
||||||
if (pos == 'win32') {
|
|
||||||
pos = 'windows';
|
|
||||||
}
|
|
||||||
let arch = os.arch();
|
|
||||||
if (arch == 'x64') {
|
|
||||||
arch = 'amd64';
|
|
||||||
}
|
|
||||||
let variant = '';
|
|
||||||
if (arch == 'arm') {
|
|
||||||
variant = 'v7';
|
|
||||||
}
|
|
||||||
|
|
||||||
const manifest = index.manifests.find(m => {
|
|
||||||
if (!m.platform) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (m.platform.os != pos) {
|
|
||||||
core.debug(`Skipping manifest ${m.digest} because of os: ${m.platform.os} != ${pos}`);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (m.platform.architecture != arch) {
|
|
||||||
core.debug(`Skipping manifest ${m.digest} because of arch: ${m.platform.architecture} != ${arch}`);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if ((m.platform.variant || '') != variant) {
|
|
||||||
core.debug(`Skipping manifest ${m.digest} because of variant: ${m.platform.variant} != ${variant}`);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
if (!manifest) {
|
|
||||||
core.error(`Cannot find manifest for ${pos}/${arch}/${variant}`);
|
|
||||||
throw new Error(`Cannot find manifest for ${pos}/${arch}/${variant}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
return manifest.digest;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
155
src/regclient/install.ts
Normal file
155
src/regclient/install.ts
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2025 actions-toolkit authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import fs from 'fs';
|
||||||
|
import os from 'os';
|
||||||
|
import path from 'path';
|
||||||
|
import * as core from '@actions/core';
|
||||||
|
import * as httpm from '@actions/http-client';
|
||||||
|
import * as tc from '@actions/tool-cache';
|
||||||
|
import * as semver from 'semver';
|
||||||
|
import * as util from 'util';
|
||||||
|
|
||||||
|
import {Cache} from '../cache';
|
||||||
|
import {Context} from '../context';
|
||||||
|
|
||||||
|
import {GitHubRelease} from '../types/github';
|
||||||
|
import {DownloadVersion} from '../types/regclient/regclient';
|
||||||
|
|
||||||
|
export class Install {
|
||||||
|
/*
|
||||||
|
* Download regclient binary from GitHub release
|
||||||
|
* @param v: version semver version or latest
|
||||||
|
* @param ghaNoCache: disable binary caching in GitHub Actions cache backend
|
||||||
|
* @returns path to the regclient binary
|
||||||
|
*/
|
||||||
|
public async download(v: string, ghaNoCache?: boolean): Promise<string> {
|
||||||
|
const version: DownloadVersion = await Install.getDownloadVersion(v);
|
||||||
|
core.debug(`Install.download version: ${version.version}`);
|
||||||
|
|
||||||
|
const release: GitHubRelease = await Install.getRelease(version);
|
||||||
|
core.debug(`Install.download release tag name: ${release.tag_name}`);
|
||||||
|
|
||||||
|
const vspec = await this.vspec(release.tag_name);
|
||||||
|
core.debug(`Install.download vspec: ${vspec}`);
|
||||||
|
|
||||||
|
const c = semver.clean(vspec) || '';
|
||||||
|
if (!semver.valid(c)) {
|
||||||
|
throw new Error(`Invalid regclient version "${vspec}".`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const installCache = new Cache({
|
||||||
|
htcName: 'regctl-dl-bin',
|
||||||
|
htcVersion: vspec,
|
||||||
|
baseCacheDir: path.join(os.homedir(), '.bin'),
|
||||||
|
cacheFile: os.platform() == 'win32' ? 'regctl.exe' : 'regctl',
|
||||||
|
ghaNoCache: ghaNoCache
|
||||||
|
});
|
||||||
|
|
||||||
|
const cacheFoundPath = await installCache.find();
|
||||||
|
if (cacheFoundPath) {
|
||||||
|
core.info(`regctl binary found in ${cacheFoundPath}`);
|
||||||
|
return cacheFoundPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
const downloadURL = util.format(version.downloadURL, vspec, this.filename());
|
||||||
|
core.info(`Downloading ${downloadURL}`);
|
||||||
|
|
||||||
|
const htcDownloadPath = await tc.downloadTool(downloadURL);
|
||||||
|
core.debug(`Install.download htcDownloadPath: ${htcDownloadPath}`);
|
||||||
|
|
||||||
|
const cacheSavePath = await installCache.save(htcDownloadPath);
|
||||||
|
core.info(`Cached to ${cacheSavePath}`);
|
||||||
|
return cacheSavePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async install(binPath: string, dest?: string): Promise<string> {
|
||||||
|
dest = dest || Context.tmpDir();
|
||||||
|
|
||||||
|
const binDir = path.join(dest, 'regctl-bin');
|
||||||
|
if (!fs.existsSync(binDir)) {
|
||||||
|
fs.mkdirSync(binDir, {recursive: true});
|
||||||
|
}
|
||||||
|
const binName: string = os.platform() == 'win32' ? 'regctl.exe' : 'regctl';
|
||||||
|
const regctlPath: string = path.join(binDir, binName);
|
||||||
|
fs.copyFileSync(binPath, regctlPath);
|
||||||
|
|
||||||
|
core.info('Fixing perms');
|
||||||
|
fs.chmodSync(regctlPath, '0755');
|
||||||
|
|
||||||
|
core.addPath(binDir);
|
||||||
|
core.info('Added regctl to PATH');
|
||||||
|
|
||||||
|
core.info(`Binary path: ${regctlPath}`);
|
||||||
|
return regctlPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
private filename(): string {
|
||||||
|
let arch: string;
|
||||||
|
switch (os.arch()) {
|
||||||
|
case 'x64': {
|
||||||
|
arch = 'amd64';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'ppc64': {
|
||||||
|
arch = 'ppc64le';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'arm': {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
const arm_version = (process.config.variables as any).arm_version;
|
||||||
|
arch = arm_version ? 'armv' + arm_version : 'arm';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
arch = os.arch();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const platform: string = os.platform() == 'win32' ? 'windows' : os.platform();
|
||||||
|
const ext: string = os.platform() == 'win32' ? '.exe' : '';
|
||||||
|
return util.format('regctl-%s-%s%s', platform, arch, ext);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async vspec(version: string): Promise<string> {
|
||||||
|
const v = version.replace(/^v+|v+$/g, '');
|
||||||
|
core.info(`Use ${v} version spec cache key for ${version}`);
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async getDownloadVersion(v: string): Promise<DownloadVersion> {
|
||||||
|
return {
|
||||||
|
version: v,
|
||||||
|
downloadURL: 'https://github.com/regclient/regclient/releases/download/v%s/%s',
|
||||||
|
releasesURL: 'https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/regclient-releases.json'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async getRelease(version: DownloadVersion): Promise<GitHubRelease> {
|
||||||
|
const http: httpm.HttpClient = new httpm.HttpClient('docker-actions-toolkit');
|
||||||
|
const resp: httpm.HttpClientResponse = await http.get(version.releasesURL);
|
||||||
|
const body = await resp.readBody();
|
||||||
|
const statusCode = resp.message.statusCode || 500;
|
||||||
|
if (statusCode >= 400) {
|
||||||
|
throw new Error(`Failed to get regclient releases from ${version.releasesURL} with status code ${statusCode}: ${body}`);
|
||||||
|
}
|
||||||
|
const releases = <Record<string, GitHubRelease>>JSON.parse(body);
|
||||||
|
if (!releases[version.version]) {
|
||||||
|
throw new Error(`Cannot find regclient release ${version.version} in ${version.releasesURL}`);
|
||||||
|
}
|
||||||
|
return releases[version.version];
|
||||||
|
}
|
||||||
|
}
|
||||||
128
src/regclient/regctl.ts
Normal file
128
src/regclient/regctl.ts
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2025 actions-toolkit authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import * as core from '@actions/core';
|
||||||
|
import * as semver from 'semver';
|
||||||
|
|
||||||
|
import {Exec} from '../exec';
|
||||||
|
|
||||||
|
import {Manifest} from '../types/oci/manifest';
|
||||||
|
|
||||||
|
export interface RegctlOpts {
|
||||||
|
binPath?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface RegctlBlobGetOpts {
|
||||||
|
repository: string;
|
||||||
|
digest: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface RegctlManifestGetOpts {
|
||||||
|
image: string;
|
||||||
|
platform?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Regctl {
|
||||||
|
private readonly binPath: string;
|
||||||
|
private _version: string;
|
||||||
|
private _versionOnce: boolean;
|
||||||
|
|
||||||
|
constructor(opts?: RegctlOpts) {
|
||||||
|
this.binPath = opts?.binPath || 'regctl';
|
||||||
|
this._version = '';
|
||||||
|
this._versionOnce = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
public async blobGet(opts: RegctlBlobGetOpts): Promise<any> {
|
||||||
|
return await Exec.getExecOutput(this.binPath, ['blob', 'get', opts.repository, opts.digest], {
|
||||||
|
ignoreReturnCode: true,
|
||||||
|
silent: true
|
||||||
|
}).then(res => {
|
||||||
|
if (res.stderr.length > 0 && res.exitCode != 0) {
|
||||||
|
throw new Error(res.stderr.trim());
|
||||||
|
}
|
||||||
|
return res.stdout;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public async manifestGet(opts: RegctlManifestGetOpts): Promise<Manifest> {
|
||||||
|
return await Exec.getExecOutput(this.binPath, ['manifest', 'get', opts.image, `--platform=${opts.platform ?? 'local'}`, `--format={{json .}}`], {
|
||||||
|
ignoreReturnCode: true,
|
||||||
|
silent: true
|
||||||
|
}).then(res => {
|
||||||
|
if (res.stderr.length > 0 && res.exitCode != 0) {
|
||||||
|
throw new Error(res.stderr.trim());
|
||||||
|
}
|
||||||
|
return <Manifest>JSON.parse(res.stdout.trim());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public async isAvailable(): Promise<boolean> {
|
||||||
|
const ok: boolean = await Exec.getExecOutput(this.binPath, [], {
|
||||||
|
ignoreReturnCode: true,
|
||||||
|
silent: true
|
||||||
|
})
|
||||||
|
.then(res => {
|
||||||
|
if (res.stderr.length > 0 && res.exitCode != 0) {
|
||||||
|
core.debug(`Regctl.isAvailable cmd err: ${res.stderr.trim()}`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return res.exitCode == 0;
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
core.debug(`Regctl.isAvailable error: ${error}`);
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
core.debug(`Regctl.isAvailable: ${ok}`);
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async version(): Promise<string> {
|
||||||
|
if (this._versionOnce) {
|
||||||
|
return this._version;
|
||||||
|
}
|
||||||
|
this._versionOnce = true;
|
||||||
|
this._version = await Exec.getExecOutput(this.binPath, ['version', '--format', '{{.VCSTag}}'], {
|
||||||
|
ignoreReturnCode: true,
|
||||||
|
silent: true
|
||||||
|
}).then(res => {
|
||||||
|
if (res.stderr.length > 0 && res.exitCode != 0) {
|
||||||
|
throw new Error(res.stderr.trim());
|
||||||
|
}
|
||||||
|
return res.stdout.trim();
|
||||||
|
});
|
||||||
|
return this._version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async printVersion() {
|
||||||
|
await Exec.exec(this.binPath, ['version'], {
|
||||||
|
failOnStdErr: false
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public async versionSatisfies(range: string, version?: string): Promise<boolean> {
|
||||||
|
const ver = version ?? (await this.version());
|
||||||
|
if (!ver) {
|
||||||
|
core.debug(`Regctl.versionSatisfies false: undefined version`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const res = semver.satisfies(ver, range) || /^[0-9a-f]{7}$/.exec(ver) !== null;
|
||||||
|
core.debug(`Regctl.versionSatisfies ${ver} statisfies ${range}: ${res}`);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -52,7 +52,8 @@ export interface Target {
|
|||||||
|
|
||||||
export interface AttestEntry {
|
export interface AttestEntry {
|
||||||
type: string;
|
type: string;
|
||||||
[key: string]: string;
|
disabled?: string | boolean;
|
||||||
|
[key: string]: string | boolean | undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface CacheEntry {
|
export interface CacheEntry {
|
||||||
|
|||||||
@@ -34,12 +34,24 @@ export interface NodeInfo extends Node {
|
|||||||
buildkit?: string;
|
buildkit?: string;
|
||||||
features?: Record<string, boolean>;
|
features?: Record<string, boolean>;
|
||||||
labels?: Record<string, string>;
|
labels?: Record<string, string>;
|
||||||
|
devices?: Array<Device>;
|
||||||
gcPolicy?: Array<GCPolicy>;
|
gcPolicy?: Array<GCPolicy>;
|
||||||
|
files?: Record<string, string>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Device {
|
||||||
|
name?: string;
|
||||||
|
annotations?: Record<string, string>;
|
||||||
|
autoAllow?: boolean;
|
||||||
|
onDemand?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface GCPolicy {
|
export interface GCPolicy {
|
||||||
all?: boolean;
|
all?: boolean;
|
||||||
filter?: string[];
|
filter?: string[];
|
||||||
keepDuration?: string;
|
keepDuration?: string;
|
||||||
keepBytes?: string;
|
keepBytes?: string; // deprecated, use reservedSpace instead
|
||||||
|
reservedSpace?: string;
|
||||||
|
maxUsedSpace?: string;
|
||||||
|
minFreeSpace?: string;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,31 +14,122 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export interface ExportRecordOpts {
|
export interface InspectOpts {
|
||||||
refs: Array<string>;
|
ref?: string;
|
||||||
image?: string;
|
builder?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ExportRecordResponse {
|
export type BuildStatus = 'completed' | 'running' | 'failed' | 'canceled';
|
||||||
|
|
||||||
|
export interface InspectResponse {
|
||||||
|
Name: string;
|
||||||
|
Ref: string;
|
||||||
|
|
||||||
|
Context?: string;
|
||||||
|
Dockerfile?: string;
|
||||||
|
VCSRepository?: string;
|
||||||
|
VCSRevision?: string;
|
||||||
|
Target?: string;
|
||||||
|
Platform?: Array<string>;
|
||||||
|
KeepGitDir?: boolean;
|
||||||
|
|
||||||
|
NamedContexts?: Array<InspectKeyValueOutput>;
|
||||||
|
|
||||||
|
StartedAt?: Date;
|
||||||
|
CompletedAt?: Date;
|
||||||
|
Duration: number;
|
||||||
|
Status: BuildStatus;
|
||||||
|
Error?: InspectErrorOutput;
|
||||||
|
|
||||||
|
NumCompletedSteps: number;
|
||||||
|
NumTotalSteps: number;
|
||||||
|
NumCachedSteps: number;
|
||||||
|
|
||||||
|
BuildArgs?: Array<InspectKeyValueOutput>;
|
||||||
|
Labels?: Array<InspectKeyValueOutput>;
|
||||||
|
|
||||||
|
Config?: InspectConfigOutput;
|
||||||
|
|
||||||
|
Materials?: InspectMaterialOutput[];
|
||||||
|
Attachments?: InspectAttachmentOutput[];
|
||||||
|
|
||||||
|
Errors?: Array<string>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface InspectConfigOutput {
|
||||||
|
Network?: string;
|
||||||
|
ExtraHosts?: Array<string>;
|
||||||
|
Hostname?: string;
|
||||||
|
CgroupParent?: string;
|
||||||
|
ImageResolveMode?: string;
|
||||||
|
MultiPlatform?: boolean;
|
||||||
|
NoCache?: boolean;
|
||||||
|
NoCacheFilter?: Array<string>;
|
||||||
|
|
||||||
|
ShmSize?: string;
|
||||||
|
Ulimit?: string;
|
||||||
|
CacheMountNS?: string;
|
||||||
|
DockerfileCheckConfig?: string;
|
||||||
|
SourceDateEpoch?: string;
|
||||||
|
SandboxHostname?: string;
|
||||||
|
|
||||||
|
RestRaw?: Array<InspectKeyValueOutput>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface InspectMaterialOutput {
|
||||||
|
URI?: string;
|
||||||
|
Digests?: Array<string>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface InspectAttachmentOutput {
|
||||||
|
Digest?: string;
|
||||||
|
Platform?: string;
|
||||||
|
Type?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface InspectErrorOutput {
|
||||||
|
Code?: number;
|
||||||
|
Message?: string;
|
||||||
|
Name?: string;
|
||||||
|
Logs?: Array<string>;
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
Sources?: any;
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
Stack?: any;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface InspectKeyValueOutput {
|
||||||
|
Name?: string;
|
||||||
|
Value?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ExportOpts {
|
||||||
|
refs: Array<string>;
|
||||||
|
noSummaries?: boolean;
|
||||||
|
image?: string;
|
||||||
|
useContainer?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ExportResponse {
|
||||||
dockerbuildFilename: string;
|
dockerbuildFilename: string;
|
||||||
dockerbuildSize: number;
|
dockerbuildSize: number;
|
||||||
summaries: Summaries;
|
|
||||||
builderName: string;
|
builderName: string;
|
||||||
nodeName: string;
|
nodeName: string;
|
||||||
refs: Array<string>;
|
refs: Array<string>;
|
||||||
|
summaries?: Summaries;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Summaries {
|
export interface Summaries {
|
||||||
[ref: string]: RecordSummary;
|
[ref: string]: Summary;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface RecordSummary {
|
export interface Summary {
|
||||||
name: string;
|
name: string;
|
||||||
status: string;
|
status: string;
|
||||||
duration: string;
|
duration: string;
|
||||||
numCachedSteps: number;
|
numCachedSteps: number;
|
||||||
numTotalSteps: number;
|
numTotalSteps: number;
|
||||||
numCompletedSteps: number;
|
numCompletedSteps: number;
|
||||||
frontendAttrs: Record<string, string>;
|
frontendAttrs?: Record<string, string>;
|
||||||
error?: string;
|
error?: string;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
export interface DownloadVersion {
|
export interface DownloadVersion {
|
||||||
|
key: string;
|
||||||
version: string;
|
version: string;
|
||||||
downloadURL: string;
|
downloadURL: string;
|
||||||
releasesURL: string;
|
releasesURL: string;
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import {components as OctoOpenApiTypes} from '@octokit/openapi-types';
|
|||||||
import {JwtPayload} from 'jwt-decode';
|
import {JwtPayload} from 'jwt-decode';
|
||||||
|
|
||||||
import {BakeDefinition} from './buildx/bake';
|
import {BakeDefinition} from './buildx/bake';
|
||||||
import {ExportRecordResponse} from './buildx/history';
|
import {ExportResponse} from './buildx/history';
|
||||||
|
|
||||||
export interface GitHubRelease {
|
export interface GitHubRelease {
|
||||||
id: number;
|
id: number;
|
||||||
@@ -57,7 +57,7 @@ export interface UploadArtifactResponse {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface BuildSummaryOpts {
|
export interface BuildSummaryOpts {
|
||||||
exportRes: ExportRecordResponse;
|
exportRes: ExportResponse;
|
||||||
uploadRes?: UploadArtifactResponse;
|
uploadRes?: UploadArtifactResponse;
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
inputs?: any;
|
inputs?: any;
|
||||||
|
|||||||
21
src/types/regclient/regclient.ts
Normal file
21
src/types/regclient/regclient.ts
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2025 actions-toolkit authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export interface DownloadVersion {
|
||||||
|
version: string;
|
||||||
|
downloadURL: string;
|
||||||
|
releasesURL: string;
|
||||||
|
}
|
||||||
16
src/util.ts
16
src/util.ts
@@ -204,4 +204,20 @@ export class Util {
|
|||||||
const rcp = path.resolve(childPath);
|
const rcp = path.resolve(childPath);
|
||||||
return rcp.startsWith(rpp.endsWith(path.sep) ? rpp : `${rpp}${path.sep}`);
|
return rcp.startsWith(rpp.endsWith(path.sep) ? rpp : `${rpp}${path.sep}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static formatDuration(ns: number): string {
|
||||||
|
if (ns === 0) return '0s';
|
||||||
|
|
||||||
|
const totalSeconds = Math.floor(ns / 1e9);
|
||||||
|
const hours = Math.floor(totalSeconds / 3600);
|
||||||
|
const minutes = Math.floor((totalSeconds % 3600) / 60);
|
||||||
|
const seconds = totalSeconds % 60;
|
||||||
|
|
||||||
|
const parts: string[] = [];
|
||||||
|
if (hours) parts.push(`${hours}h`);
|
||||||
|
if (minutes) parts.push(`${minutes}m`);
|
||||||
|
if (seconds || parts.length === 0) parts.push(`${seconds}s`);
|
||||||
|
|
||||||
|
return parts.join('');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
179
yarn.lock
179
yarn.lock
@@ -12,9 +12,9 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@actions/artifact@npm:^2.2.1":
|
"@actions/artifact@npm:^2.3.2":
|
||||||
version: 2.2.1
|
version: 2.3.2
|
||||||
resolution: "@actions/artifact@npm:2.2.1"
|
resolution: "@actions/artifact@npm:2.3.2"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@actions/core": ^1.10.0
|
"@actions/core": ^1.10.0
|
||||||
"@actions/github": ^5.1.1
|
"@actions/github": ^5.1.1
|
||||||
@@ -27,15 +27,14 @@ __metadata:
|
|||||||
"@protobuf-ts/plugin": ^2.2.3-alpha.1
|
"@protobuf-ts/plugin": ^2.2.3-alpha.1
|
||||||
archiver: ^7.0.1
|
archiver: ^7.0.1
|
||||||
jwt-decode: ^3.1.2
|
jwt-decode: ^3.1.2
|
||||||
twirp-ts: ^2.5.0
|
|
||||||
unzip-stream: ^0.3.1
|
unzip-stream: ^0.3.1
|
||||||
checksum: 6ce4e62d941f17743c845637cdd832ca34c77efe0c31cf7f6ab3ad0531e54e62d4379198e8af5e84463b5f5ae0bc0ea11d41cc77c5fae7e511c7ef01742892ea
|
checksum: 78ee41b43800accb2f3527e1733217c43d53693e7f96ce2470b16890fb84f5c2ebaaa6048ccdb6cfe188b54c02779ec99623c6932558e757f6829cfde203cf2c
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@actions/cache@npm:^4.0.0":
|
"@actions/cache@npm:^4.0.3":
|
||||||
version: 4.0.0
|
version: 4.0.3
|
||||||
resolution: "@actions/cache@npm:4.0.0"
|
resolution: "@actions/cache@npm:4.0.3"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@actions/core": ^1.11.1
|
"@actions/core": ^1.11.1
|
||||||
"@actions/exec": ^1.0.1
|
"@actions/exec": ^1.0.1
|
||||||
@@ -47,8 +46,7 @@ __metadata:
|
|||||||
"@azure/storage-blob": ^12.13.0
|
"@azure/storage-blob": ^12.13.0
|
||||||
"@protobuf-ts/plugin": ^2.9.4
|
"@protobuf-ts/plugin": ^2.9.4
|
||||||
semver: ^6.3.1
|
semver: ^6.3.1
|
||||||
twirp-ts: ^2.5.0
|
checksum: ee9c2a21a70bd3f35c63f302af478e23f135c26deb77ea2e4eed29c62766a4b201fc7435651c0d56fa504c02d203107e3bdfda1dba18a3ee09338e1dfc3f2fe8
|
||||||
checksum: 8ab819a67b578a5ce6de984f4ef8420066f8270e1f9db053700f4a8f084d0bbe4f911114f7088a95a987372ea63078550355d99849412152dd0efdf688bf9144
|
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@@ -1108,8 +1106,8 @@ __metadata:
|
|||||||
version: 0.0.0-use.local
|
version: 0.0.0-use.local
|
||||||
resolution: "@docker/actions-toolkit@workspace:."
|
resolution: "@docker/actions-toolkit@workspace:."
|
||||||
dependencies:
|
dependencies:
|
||||||
"@actions/artifact": ^2.2.1
|
"@actions/artifact": ^2.3.2
|
||||||
"@actions/cache": ^4.0.0
|
"@actions/cache": ^4.0.3
|
||||||
"@actions/core": ^1.11.1
|
"@actions/core": ^1.11.1
|
||||||
"@actions/exec": ^1.1.1
|
"@actions/exec": ^1.1.1
|
||||||
"@actions/github": ^6.0.0
|
"@actions/github": ^6.0.0
|
||||||
@@ -1145,7 +1143,7 @@ __metadata:
|
|||||||
jwt-decode: ^4.0.0
|
jwt-decode: ^4.0.0
|
||||||
prettier: ^3.2.5
|
prettier: ^3.2.5
|
||||||
rimraf: ^5.0.5
|
rimraf: ^5.0.5
|
||||||
semver: ^7.6.3
|
semver: ^7.7.1
|
||||||
tar-stream: ^3.1.7
|
tar-stream: ^3.1.7
|
||||||
tmp: ^0.2.3
|
tmp: ^0.2.3
|
||||||
ts-jest: ^29.1.2
|
ts-jest: ^29.1.2
|
||||||
@@ -2000,7 +1998,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@protobuf-ts/plugin-framework@npm:^2.0.7, @protobuf-ts/plugin-framework@npm:^2.9.4":
|
"@protobuf-ts/plugin-framework@npm:^2.9.4":
|
||||||
version: 2.9.4
|
version: 2.9.4
|
||||||
resolution: "@protobuf-ts/plugin-framework@npm:2.9.4"
|
resolution: "@protobuf-ts/plugin-framework@npm:2.9.4"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -3125,16 +3123,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"camel-case@npm:^4.1.2":
|
|
||||||
version: 4.1.2
|
|
||||||
resolution: "camel-case@npm:4.1.2"
|
|
||||||
dependencies:
|
|
||||||
pascal-case: ^3.1.2
|
|
||||||
tslib: ^2.0.3
|
|
||||||
checksum: bcbd25cd253b3cbc69be3f535750137dbf2beb70f093bdc575f73f800acc8443d34fd52ab8f0a2413c34f1e8203139ffc88428d8863e4dfe530cfb257a379ad6
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"camelcase@npm:^5.3.1":
|
"camelcase@npm:^5.3.1":
|
||||||
version: 5.3.1
|
version: 5.3.1
|
||||||
resolution: "camelcase@npm:5.3.1"
|
resolution: "camelcase@npm:5.3.1"
|
||||||
@@ -3303,13 +3291,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"commander@npm:^4.0.0":
|
|
||||||
version: 4.1.1
|
|
||||||
resolution: "commander@npm:4.1.1"
|
|
||||||
checksum: d7b9913ff92cae20cb577a4ac6fcc121bd6223319e54a40f51a14740a681ad5c574fd29a57da478a5f234a6fa6c52cbf0b7c641353e03c648b1ae85ba670b977
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"compress-commons@npm:^6.0.2":
|
"compress-commons@npm:^6.0.2":
|
||||||
version: 6.0.2
|
version: 6.0.2
|
||||||
resolution: "compress-commons@npm:6.0.2"
|
resolution: "compress-commons@npm:6.0.2"
|
||||||
@@ -3650,18 +3631,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"dot-object@npm:^2.1.4":
|
|
||||||
version: 2.1.4
|
|
||||||
resolution: "dot-object@npm:2.1.4"
|
|
||||||
dependencies:
|
|
||||||
commander: ^4.0.0
|
|
||||||
glob: ^7.1.5
|
|
||||||
bin:
|
|
||||||
dot-object: bin/dot-object
|
|
||||||
checksum: d56842129dead664e75089f7f610518dfe4d9548cec1b5f9b5df35ae916efe21e05a3b999f926ee73906a270c60f9a255d53968aa0becc8cf45ad7678b3dc626
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"dotenv@npm:^16.4.5":
|
"dotenv@npm:^16.4.5":
|
||||||
version: 16.4.5
|
version: 16.4.5
|
||||||
resolution: "dotenv@npm:16.4.5"
|
resolution: "dotenv@npm:16.4.5"
|
||||||
@@ -4694,20 +4663,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"glob@npm:^7.1.5":
|
|
||||||
version: 7.2.3
|
|
||||||
resolution: "glob@npm:7.2.3"
|
|
||||||
dependencies:
|
|
||||||
fs.realpath: ^1.0.0
|
|
||||||
inflight: ^1.0.4
|
|
||||||
inherits: 2
|
|
||||||
minimatch: ^3.1.1
|
|
||||||
once: ^1.3.0
|
|
||||||
path-is-absolute: ^1.0.0
|
|
||||||
checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"glob@npm:^8.0.1":
|
"glob@npm:^8.0.1":
|
||||||
version: 8.1.0
|
version: 8.1.0
|
||||||
resolution: "glob@npm:8.1.0"
|
resolution: "glob@npm:8.1.0"
|
||||||
@@ -6175,15 +6130,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"lower-case@npm:^2.0.2":
|
|
||||||
version: 2.0.2
|
|
||||||
resolution: "lower-case@npm:2.0.2"
|
|
||||||
dependencies:
|
|
||||||
tslib: ^2.0.3
|
|
||||||
checksum: 83a0a5f159ad7614bee8bf976b96275f3954335a84fad2696927f609ddae902802c4f3312d86668722e668bef41400254807e1d3a7f2e8c3eede79691aa1f010
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"lru-cache@npm:^10.2.0":
|
"lru-cache@npm:^10.2.0":
|
||||||
version: 10.2.0
|
version: 10.2.0
|
||||||
resolution: "lru-cache@npm:10.2.0"
|
resolution: "lru-cache@npm:10.2.0"
|
||||||
@@ -6312,7 +6258,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2":
|
"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.2":
|
||||||
version: 3.1.2
|
version: 3.1.2
|
||||||
resolution: "minimatch@npm:3.1.2"
|
resolution: "minimatch@npm:3.1.2"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -6510,16 +6456,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"no-case@npm:^3.0.4":
|
|
||||||
version: 3.0.4
|
|
||||||
resolution: "no-case@npm:3.0.4"
|
|
||||||
dependencies:
|
|
||||||
lower-case: ^2.0.2
|
|
||||||
tslib: ^2.0.3
|
|
||||||
checksum: 0b2ebc113dfcf737d48dde49cfebf3ad2d82a8c3188e7100c6f375e30eafbef9e9124aadc3becef237b042fd5eb0aad2fd78669c20972d045bbe7fea8ba0be5c
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"node-fetch@npm:^2.6.7":
|
"node-fetch@npm:^2.6.7":
|
||||||
version: 2.6.7
|
version: 2.6.7
|
||||||
resolution: "node-fetch@npm:2.6.7"
|
resolution: "node-fetch@npm:2.6.7"
|
||||||
@@ -6805,16 +6741,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"pascal-case@npm:^3.1.2":
|
|
||||||
version: 3.1.2
|
|
||||||
resolution: "pascal-case@npm:3.1.2"
|
|
||||||
dependencies:
|
|
||||||
no-case: ^3.0.4
|
|
||||||
tslib: ^2.0.3
|
|
||||||
checksum: ba98bfd595fc91ef3d30f4243b1aee2f6ec41c53b4546bfa3039487c367abaa182471dcfc830a1f9e1a0df00c14a370514fa2b3a1aacc68b15a460c31116873e
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"path-exists@npm:^4.0.0":
|
"path-exists@npm:^4.0.0":
|
||||||
version: 4.0.0
|
version: 4.0.0
|
||||||
resolution: "path-exists@npm:4.0.0"
|
resolution: "path-exists@npm:4.0.0"
|
||||||
@@ -6853,13 +6779,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"path-to-regexp@npm:^6.2.0":
|
|
||||||
version: 6.3.0
|
|
||||||
resolution: "path-to-regexp@npm:6.3.0"
|
|
||||||
checksum: eca78602e6434a1b6799d511d375ec044e8d7e28f5a48aa5c28d57d8152fb52f3fc62fb1cfc5dfa2198e1f041c2a82ed14043d75740a2fe60e91b5089a153250
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"path-type@npm:^4.0.0":
|
"path-type@npm:^4.0.0":
|
||||||
version: 4.0.0
|
version: 4.0.0
|
||||||
resolution: "path-type@npm:4.0.0"
|
resolution: "path-type@npm:4.0.0"
|
||||||
@@ -6931,15 +6850,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"prettier@npm:^2.5.1":
|
|
||||||
version: 2.8.8
|
|
||||||
resolution: "prettier@npm:2.8.8"
|
|
||||||
bin:
|
|
||||||
prettier: bin-prettier.js
|
|
||||||
checksum: b49e409431bf129dd89238d64299ba80717b57ff5a6d1c1a8b1a28b590d998a34e083fa13573bc732bb8d2305becb4c9a4407f8486c81fa7d55100eb08263cf8
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"prettier@npm:^3.2.5":
|
"prettier@npm:^3.2.5":
|
||||||
version: 3.2.5
|
version: 3.2.5
|
||||||
resolution: "prettier@npm:3.2.5"
|
resolution: "prettier@npm:3.2.5"
|
||||||
@@ -7408,12 +7318,12 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"semver@npm:^7.6.3":
|
"semver@npm:^7.7.1":
|
||||||
version: 7.6.3
|
version: 7.7.1
|
||||||
resolution: "semver@npm:7.6.3"
|
resolution: "semver@npm:7.7.1"
|
||||||
bin:
|
bin:
|
||||||
semver: bin/semver.js
|
semver: bin/semver.js
|
||||||
checksum: 4110ec5d015c9438f322257b1c51fe30276e5f766a3f64c09edd1d7ea7118ecbc3f379f3b69032bacf13116dc7abc4ad8ce0d7e2bd642e26b0d271b56b61a7d8
|
checksum: 586b825d36874007c9382d9e1ad8f93888d8670040add24a28e06a910aeebd673a2eb9e3bf169c6679d9245e66efb9057e0852e70d9daa6c27372aab1dda7104
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@@ -8018,16 +7928,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"ts-poet@npm:^4.5.0":
|
|
||||||
version: 4.15.0
|
|
||||||
resolution: "ts-poet@npm:4.15.0"
|
|
||||||
dependencies:
|
|
||||||
lodash: ^4.17.15
|
|
||||||
prettier: ^2.5.1
|
|
||||||
checksum: 93490e8b5921e23ac65afdecc00b4dd53f3560d7d9c19778a3f0bd9a300ba7ca71585a989d564508313bc73e8c431413714d513ebca2d5c428f909ec36bcf6e9
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"tsconfig-paths@npm:^3.15.0":
|
"tsconfig-paths@npm:^3.15.0":
|
||||||
version: 3.15.0
|
version: 3.15.0
|
||||||
resolution: "tsconfig-paths@npm:3.15.0"
|
resolution: "tsconfig-paths@npm:3.15.0"
|
||||||
@@ -8047,13 +7947,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"tslib@npm:^2.0.3, tslib@npm:^2.6.2":
|
|
||||||
version: 2.6.2
|
|
||||||
resolution: "tslib@npm:2.6.2"
|
|
||||||
checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"tslib@npm:^2.2.0":
|
"tslib@npm:^2.2.0":
|
||||||
version: 2.6.0
|
version: 2.6.0
|
||||||
resolution: "tslib@npm:2.6.0"
|
resolution: "tslib@npm:2.6.0"
|
||||||
@@ -8061,6 +7954,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"tslib@npm:^2.6.2":
|
||||||
|
version: 2.6.2
|
||||||
|
resolution: "tslib@npm:2.6.2"
|
||||||
|
checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"tunnel@npm:0.0.6, tunnel@npm:^0.0.6":
|
"tunnel@npm:0.0.6, tunnel@npm:^0.0.6":
|
||||||
version: 0.0.6
|
version: 0.0.6
|
||||||
resolution: "tunnel@npm:0.0.6"
|
resolution: "tunnel@npm:0.0.6"
|
||||||
@@ -8068,30 +7968,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"twirp-ts@npm:^2.5.0":
|
|
||||||
version: 2.5.0
|
|
||||||
resolution: "twirp-ts@npm:2.5.0"
|
|
||||||
dependencies:
|
|
||||||
"@protobuf-ts/plugin-framework": ^2.0.7
|
|
||||||
camel-case: ^4.1.2
|
|
||||||
dot-object: ^2.1.4
|
|
||||||
path-to-regexp: ^6.2.0
|
|
||||||
ts-poet: ^4.5.0
|
|
||||||
yaml: ^1.10.2
|
|
||||||
peerDependencies:
|
|
||||||
"@protobuf-ts/plugin": ^2.5.0
|
|
||||||
ts-proto: ^1.81.3
|
|
||||||
peerDependenciesMeta:
|
|
||||||
"@protobuf-ts/plugin":
|
|
||||||
optional: true
|
|
||||||
ts-proto:
|
|
||||||
optional: true
|
|
||||||
bin:
|
|
||||||
protoc-gen-twirp_ts: protoc-gen-twirp_ts
|
|
||||||
checksum: e7cf87d77ab4d2cd327c9d8307e82ff61afc5af56883aed5fb6ac7d57999b646945e11158be87c10f0340aeef2efde6eb896f2efd60599498f17b4f310d66e4f
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"type-check@npm:^0.4.0, type-check@npm:~0.4.0":
|
"type-check@npm:^0.4.0, type-check@npm:~0.4.0":
|
||||||
version: 0.4.0
|
version: 0.4.0
|
||||||
resolution: "type-check@npm:0.4.0"
|
resolution: "type-check@npm:0.4.0"
|
||||||
@@ -8580,13 +8456,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"yaml@npm:^1.10.2":
|
|
||||||
version: 1.10.2
|
|
||||||
resolution: "yaml@npm:1.10.2"
|
|
||||||
checksum: ce4ada136e8a78a0b08dc10b4b900936912d15de59905b2bf415b4d33c63df1d555d23acb2a41b23cf9fb5da41c256441afca3d6509de7247daa062fd2c5ea5f
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1":
|
"yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1":
|
||||||
version: 21.1.1
|
version: 21.1.1
|
||||||
resolution: "yargs-parser@npm:21.1.1"
|
resolution: "yargs-parser@npm:21.1.1"
|
||||||
|
|||||||
Reference in New Issue
Block a user