Compare commits
33 Commits
v0.1.0-bet
...
v0.1.0-bet
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e9cfd63e16 | ||
|
|
ac61bd8949 | ||
|
|
dd1544e1be | ||
|
|
32af66cb28 | ||
|
|
2090433c0d | ||
|
|
50c11e6dce | ||
|
|
0f9cc7c29f | ||
|
|
dfc72fd31c | ||
|
|
317ef51ab5 | ||
|
|
3a30337d24 | ||
|
|
fc16ecda91 | ||
|
|
48cefc1da0 | ||
|
|
fda3be9699 | ||
|
|
53ca96fcc4 | ||
|
|
70390c899b | ||
|
|
ac9d9d9a1b | ||
|
|
3c2fe5ddb2 | ||
|
|
adad1e3786 | ||
|
|
3a0f4db686 | ||
|
|
2201fc1194 | ||
|
|
6210eb507a | ||
|
|
3b532d1b91 | ||
|
|
93fa96f54f | ||
|
|
3ec6f00f46 | ||
|
|
4d66b2fa08 | ||
|
|
964381b7e9 | ||
|
|
f78f708678 | ||
|
|
6fe7d54029 | ||
|
|
8a69d6cb01 | ||
|
|
1cc5fc87fb | ||
|
|
97e647fdd0 | ||
|
|
e08fc168a1 | ||
|
|
9128f56258 |
115
.github/buildx-releases.json
vendored
115
.github/buildx-releases.json
vendored
@@ -1,43 +1,84 @@
|
|||||||
{
|
{
|
||||||
"latest": {
|
"latest": {
|
||||||
"id": 92694870,
|
"id": 94659464,
|
||||||
"tag_name": "v0.10.3",
|
"tag_name": "v0.10.4",
|
||||||
"html_url": "https://github.com/docker/buildx/releases/tag/v0.10.3",
|
"html_url": "https://github.com/docker/buildx/releases/tag/v0.10.4",
|
||||||
"assets": [
|
"assets": [
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.darwin-amd64",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.darwin-amd64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.darwin-amd64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.darwin-amd64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.darwin-amd64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.darwin-amd64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.darwin-arm64",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.darwin-arm64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.darwin-arm64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.darwin-arm64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.darwin-arm64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.darwin-arm64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.linux-amd64",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-amd64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.linux-amd64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-amd64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.linux-amd64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-amd64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.linux-arm-v6",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-arm-v6",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.linux-arm-v6.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-arm-v6.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.linux-arm-v6.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-arm-v6.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.linux-arm-v7",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-arm-v7",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.linux-arm-v7.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-arm-v7.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.linux-arm-v7.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-arm-v7.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.linux-arm64",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-arm64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.linux-arm64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-arm64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.linux-arm64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-arm64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.linux-ppc64le",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-ppc64le",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.linux-ppc64le.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-ppc64le.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.linux-ppc64le.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-ppc64le.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.linux-riscv64",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-riscv64",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.linux-riscv64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-riscv64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.linux-riscv64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-riscv64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.linux-s390x",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-s390x",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.linux-s390x.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-s390x.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.linux-s390x.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-s390x.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.windows-amd64.exe",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.windows-amd64.exe",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.windows-amd64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.windows-amd64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.windows-amd64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.windows-amd64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.windows-arm64.exe",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.windows-arm64.exe",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.windows-arm64.provenance.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.windows-arm64.provenance.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/buildx-v0.10.3.windows-arm64.sbom.json",
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.windows-arm64.sbom.json",
|
||||||
"https://github.com/docker/buildx/releases/download/v0.10.3/checksums.txt"
|
"https://github.com/docker/buildx/releases/download/v0.10.4/checksums.txt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"v0.10.4": {
|
||||||
|
"id": 94659464,
|
||||||
|
"tag_name": "v0.10.4",
|
||||||
|
"html_url": "https://github.com/docker/buildx/releases/tag/v0.10.4",
|
||||||
|
"assets": [
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.darwin-amd64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.darwin-amd64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.darwin-amd64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.darwin-arm64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.darwin-arm64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.darwin-arm64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-amd64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-amd64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-amd64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-arm-v6",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-arm-v6.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-arm-v6.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-arm-v7",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-arm-v7.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-arm-v7.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-arm64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-arm64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-arm64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-ppc64le",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-ppc64le.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-ppc64le.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-riscv64",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-riscv64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-riscv64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-s390x",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-s390x.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.linux-s390x.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.windows-amd64.exe",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.windows-amd64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.windows-amd64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.windows-arm64.exe",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.windows-arm64.provenance.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/buildx-v0.10.4.windows-arm64.sbom.json",
|
||||||
|
"https://github.com/docker/buildx/releases/download/v0.10.4/checksums.txt"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"v0.10.3": {
|
"v0.10.3": {
|
||||||
|
|||||||
728
.github/docker-releases.json
vendored
Normal file
728
.github/docker-releases.json
vendored
Normal file
@@ -0,0 +1,728 @@
|
|||||||
|
{
|
||||||
|
"latest": {
|
||||||
|
"id": 91964526,
|
||||||
|
"tag_name": "v23.0.1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v23.0.1": {
|
||||||
|
"id": 91964526,
|
||||||
|
"tag_name": "v23.0.1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v23.0.0": {
|
||||||
|
"id": 91109643,
|
||||||
|
"tag_name": "v23.0.0",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.0",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v23.0.0-rc.4": {
|
||||||
|
"id": 91003797,
|
||||||
|
"tag_name": "v23.0.0-rc.4",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.0-rc.4",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v23.0.0-rc.3": {
|
||||||
|
"id": 89780703,
|
||||||
|
"tag_name": "v23.0.0-rc.3",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.0-rc.3",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.23": {
|
||||||
|
"id": 89647366,
|
||||||
|
"tag_name": "v20.10.23",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.23",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v23.0.0-rc.2": {
|
||||||
|
"id": 88712255,
|
||||||
|
"tag_name": "v23.0.0-rc.2",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.0-rc.2",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v23.0.0-rc.1": {
|
||||||
|
"id": 87299039,
|
||||||
|
"tag_name": "v23.0.0-rc.1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.0-rc.1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.22": {
|
||||||
|
"id": 86325342,
|
||||||
|
"tag_name": "v20.10.22",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.22",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v23.0.0-beta.1": {
|
||||||
|
"id": 85159482,
|
||||||
|
"tag_name": "v23.0.0-beta.1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v23.0.0-beta.1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.21": {
|
||||||
|
"id": 80977884,
|
||||||
|
"tag_name": "v20.10.21",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.21",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.20": {
|
||||||
|
"id": 80248420,
|
||||||
|
"tag_name": "v20.10.20",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.20",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.19": {
|
||||||
|
"id": 79847378,
|
||||||
|
"tag_name": "v20.10.19",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.19",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.18": {
|
||||||
|
"id": 76694729,
|
||||||
|
"tag_name": "v20.10.18",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.18",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.17": {
|
||||||
|
"id": 68777665,
|
||||||
|
"tag_name": "v20.10.17",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.17",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v22.06.0-beta.0": {
|
||||||
|
"id": 68600276,
|
||||||
|
"tag_name": "v22.06.0-beta.0",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v22.06.0-beta.0",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.16": {
|
||||||
|
"id": 66708640,
|
||||||
|
"tag_name": "v20.10.16",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.16",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.15": {
|
||||||
|
"id": 66170410,
|
||||||
|
"tag_name": "v20.10.15",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.15",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.14": {
|
||||||
|
"id": 62642891,
|
||||||
|
"tag_name": "v20.10.14",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.14",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.13": {
|
||||||
|
"id": 61523032,
|
||||||
|
"tag_name": "v20.10.13",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.13",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.12": {
|
||||||
|
"id": 56724849,
|
||||||
|
"tag_name": "v20.10.12",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.12",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.11": {
|
||||||
|
"id": 53604359,
|
||||||
|
"tag_name": "v20.10.11",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.11",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.10": {
|
||||||
|
"id": 51991530,
|
||||||
|
"tag_name": "v20.10.10",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.10",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.9": {
|
||||||
|
"id": 50763745,
|
||||||
|
"tag_name": "v20.10.9",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.9",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.8": {
|
||||||
|
"id": 47261111,
|
||||||
|
"tag_name": "v20.10.8",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.8",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.7": {
|
||||||
|
"id": 44002175,
|
||||||
|
"tag_name": "v20.10.7",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.7",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.6": {
|
||||||
|
"id": 41439201,
|
||||||
|
"tag_name": "v20.10.6",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.6",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.5": {
|
||||||
|
"id": 39216180,
|
||||||
|
"tag_name": "v20.10.5",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.5",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.4": {
|
||||||
|
"id": 39014860,
|
||||||
|
"tag_name": "v20.10.4",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.4",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.3": {
|
||||||
|
"id": 37231470,
|
||||||
|
"tag_name": "v20.10.3",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.3",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v19.03.15": {
|
||||||
|
"id": 37231443,
|
||||||
|
"tag_name": "v19.03.15",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v19.03.15",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.2": {
|
||||||
|
"id": 35990169,
|
||||||
|
"tag_name": "v20.10.2",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.2",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.1": {
|
||||||
|
"id": 35281927,
|
||||||
|
"tag_name": "v20.10.1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v20.10.0": {
|
||||||
|
"id": 35069369,
|
||||||
|
"tag_name": "v20.10.0",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v20.10.0",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v19.03.14": {
|
||||||
|
"id": 34677482,
|
||||||
|
"tag_name": "v19.03.14",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v19.03.14",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v19.03.13": {
|
||||||
|
"id": 31493434,
|
||||||
|
"tag_name": "v19.03.13",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v19.03.13",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v19.03.12": {
|
||||||
|
"id": 28065393,
|
||||||
|
"tag_name": "v19.03.12",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v19.03.12",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v19.03.11": {
|
||||||
|
"id": 27237950,
|
||||||
|
"tag_name": "v19.03.11",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v19.03.11",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v19.03.10": {
|
||||||
|
"id": 27043306,
|
||||||
|
"tag_name": "v19.03.10",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v19.03.10",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v19.03.9": {
|
||||||
|
"id": 27002855,
|
||||||
|
"tag_name": "v19.03.9",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v19.03.9",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v19.03.8": {
|
||||||
|
"id": 25372883,
|
||||||
|
"tag_name": "v19.03.8",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v19.03.8",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v17.03.2-ce": {
|
||||||
|
"id": 6858533,
|
||||||
|
"tag_name": "v17.03.2-ce",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v17.03.2-ce",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v17.03.2-ce-rc1": {
|
||||||
|
"id": 6547028,
|
||||||
|
"tag_name": "v17.03.2-ce-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v17.03.2-ce-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v17.05.0-ce": {
|
||||||
|
"id": 6295254,
|
||||||
|
"tag_name": "v17.05.0-ce",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v17.05.0-ce",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v17.05.0-ce-rc3": {
|
||||||
|
"id": 6259851,
|
||||||
|
"tag_name": "v17.05.0-ce-rc3",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v17.05.0-ce-rc3",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v17.05.0-ce-rc2": {
|
||||||
|
"id": 6216216,
|
||||||
|
"tag_name": "v17.05.0-ce-rc2",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v17.05.0-ce-rc2",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v17.05.0-ce-rc1": {
|
||||||
|
"id": 6066291,
|
||||||
|
"tag_name": "v17.05.0-ce-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v17.05.0-ce-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v17.04.0-ce": {
|
||||||
|
"id": 5992837,
|
||||||
|
"tag_name": "v17.04.0-ce",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v17.04.0-ce",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v17.04.0-ce-rc2": {
|
||||||
|
"id": 5930499,
|
||||||
|
"tag_name": "v17.04.0-ce-rc2",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v17.04.0-ce-rc2",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v17.03.1-ce": {
|
||||||
|
"id": 5889333,
|
||||||
|
"tag_name": "v17.03.1-ce",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v17.03.1-ce",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v17.04.0-ce-rc1": {
|
||||||
|
"id": 5821903,
|
||||||
|
"tag_name": "v17.04.0-ce-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v17.04.0-ce-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v17.03.1-ce-rc1": {
|
||||||
|
"id": 5787909,
|
||||||
|
"tag_name": "v17.03.1-ce-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v17.03.1-ce-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v17.03.0-ce": {
|
||||||
|
"id": 5616072,
|
||||||
|
"tag_name": "v17.03.0-ce",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v17.03.0-ce",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v17.03.0-ce-rc1": {
|
||||||
|
"id": 5516127,
|
||||||
|
"tag_name": "v17.03.0-ce-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v17.03.0-ce-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.13.1": {
|
||||||
|
"id": 5400129,
|
||||||
|
"tag_name": "v1.13.1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.13.1-rc2": {
|
||||||
|
"id": 5385634,
|
||||||
|
"tag_name": "v1.13.1-rc2",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.1-rc2",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.13.1-rc1": {
|
||||||
|
"id": 5307652,
|
||||||
|
"tag_name": "v1.13.1-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.1-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.13.0": {
|
||||||
|
"id": 5196571,
|
||||||
|
"tag_name": "v1.13.0",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.0",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.13.0-rc7": {
|
||||||
|
"id": 5157693,
|
||||||
|
"tag_name": "v1.13.0-rc7",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.0-rc7",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.13.0-rc6": {
|
||||||
|
"id": 5135134,
|
||||||
|
"tag_name": "v1.13.0-rc6",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.0-rc6",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.12.6": {
|
||||||
|
"id": 5123890,
|
||||||
|
"tag_name": "v1.12.6",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.6",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.13.0-rc5": {
|
||||||
|
"id": 5080578,
|
||||||
|
"tag_name": "v1.13.0-rc5",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.0-rc5",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.13.0-rc4": {
|
||||||
|
"id": 4948866,
|
||||||
|
"tag_name": "v1.13.0-rc4",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.0-rc4",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.12.5": {
|
||||||
|
"id": 4938198,
|
||||||
|
"tag_name": "v1.12.5",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.5",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.12.5-rc1": {
|
||||||
|
"id": 4926422,
|
||||||
|
"tag_name": "v1.12.5-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.5-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.12.4": {
|
||||||
|
"id": 4901878,
|
||||||
|
"tag_name": "v1.12.4",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.4",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.12.4-rc1": {
|
||||||
|
"id": 4863914,
|
||||||
|
"tag_name": "v1.12.4-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.4-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.13.0-rc3": {
|
||||||
|
"id": 4840704,
|
||||||
|
"tag_name": "v1.13.0-rc3",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.0-rc3",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.13.0-rc2": {
|
||||||
|
"id": 4744761,
|
||||||
|
"tag_name": "v1.13.0-rc2",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.0-rc2",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.13.0-rc1": {
|
||||||
|
"id": 4641203,
|
||||||
|
"tag_name": "v1.13.0-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.13.0-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.12.3": {
|
||||||
|
"id": 4495222,
|
||||||
|
"tag_name": "v1.12.3",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.3",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.12.3-rc1": {
|
||||||
|
"id": 4481016,
|
||||||
|
"tag_name": "v1.12.3-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.3-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.12.2": {
|
||||||
|
"id": 4364345,
|
||||||
|
"tag_name": "v1.12.2",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.2",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.12.2-rc3": {
|
||||||
|
"id": 4336430,
|
||||||
|
"tag_name": "v1.12.2-rc3",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.2-rc3",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.12.2-rc2": {
|
||||||
|
"id": 4304701,
|
||||||
|
"tag_name": "v1.12.2-rc2",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.2-rc2",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.12.2-rc1": {
|
||||||
|
"id": 4246481,
|
||||||
|
"tag_name": "v1.12.2-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.2-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.12.1": {
|
||||||
|
"id": 3919520,
|
||||||
|
"tag_name": "v1.12.1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.12.1-rc2": {
|
||||||
|
"id": 3909470,
|
||||||
|
"tag_name": "v1.12.1-rc2",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.1-rc2",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.12.1-rc1": {
|
||||||
|
"id": 3879305,
|
||||||
|
"tag_name": "v1.12.1-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.1-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.12.0": {
|
||||||
|
"id": 3766135,
|
||||||
|
"tag_name": "v1.12.0",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.0",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.12.0-rc5": {
|
||||||
|
"id": 3744904,
|
||||||
|
"tag_name": "v1.12.0-rc5",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.0-rc5",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.12.0-rc4": {
|
||||||
|
"id": 3644623,
|
||||||
|
"tag_name": "v1.12.0-rc4",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.0-rc4",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.12.0-rc3": {
|
||||||
|
"id": 3573896,
|
||||||
|
"tag_name": "v1.12.0-rc3",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.0-rc3",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.12.0-rc2": {
|
||||||
|
"id": 3471944,
|
||||||
|
"tag_name": "v1.12.0-rc2",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.0-rc2",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.12.0-rc1": {
|
||||||
|
"id": 3447699,
|
||||||
|
"tag_name": "v1.12.0-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.12.0-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.11.2": {
|
||||||
|
"id": 3354503,
|
||||||
|
"tag_name": "v1.11.2",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.11.2",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.11.2-rc1": {
|
||||||
|
"id": 3327300,
|
||||||
|
"tag_name": "v1.11.2-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.11.2-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.11.1": {
|
||||||
|
"id": 3105125,
|
||||||
|
"tag_name": "v1.11.1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.11.1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.11.1-rc1": {
|
||||||
|
"id": 3097597,
|
||||||
|
"tag_name": "v1.11.1-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.11.1-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.11.0": {
|
||||||
|
"id": 3014278,
|
||||||
|
"tag_name": "v1.11.0",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.11.0",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.11.0-rc5": {
|
||||||
|
"id": 2998258,
|
||||||
|
"tag_name": "v1.11.0-rc5",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.11.0-rc5",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.11.0-rc4": {
|
||||||
|
"id": 2968912,
|
||||||
|
"tag_name": "v1.11.0-rc4",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.11.0-rc4",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.11.0-rc3": {
|
||||||
|
"id": 2937939,
|
||||||
|
"tag_name": "v1.11.0-rc3",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.11.0-rc3",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.11.0-rc2": {
|
||||||
|
"id": 2890861,
|
||||||
|
"tag_name": "v1.11.0-rc2",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.11.0-rc2",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.11.0-rc1": {
|
||||||
|
"id": 2875983,
|
||||||
|
"tag_name": "v1.11.0-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.11.0-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.10.3": {
|
||||||
|
"id": 2788494,
|
||||||
|
"tag_name": "v1.10.3",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.3",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.10.3-rc2": {
|
||||||
|
"id": 2780060,
|
||||||
|
"tag_name": "v1.10.3-rc2",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.3-rc2",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.10.3-rc1": {
|
||||||
|
"id": 2777835,
|
||||||
|
"tag_name": "v1.10.3-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.3-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.10.2": {
|
||||||
|
"id": 2666504,
|
||||||
|
"tag_name": "v1.10.2",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.2",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.10.2-rc1": {
|
||||||
|
"id": 2652399,
|
||||||
|
"tag_name": "v1.10.2-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.2-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.10.1": {
|
||||||
|
"id": 2598018,
|
||||||
|
"tag_name": "v1.10.1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.10.1-rc1": {
|
||||||
|
"id": 2590708,
|
||||||
|
"tag_name": "v1.10.1-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.1-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.10.0": {
|
||||||
|
"id": 2555659,
|
||||||
|
"tag_name": "v1.10.0",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.0",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.10.0-rc4": {
|
||||||
|
"id": 2549294,
|
||||||
|
"tag_name": "v1.10.0-rc4",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.0-rc4",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.10.0-rc3": {
|
||||||
|
"id": 2541607,
|
||||||
|
"tag_name": "v1.10.0-rc3",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.0-rc3",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.10.0-rc2": {
|
||||||
|
"id": 2505382,
|
||||||
|
"tag_name": "v1.10.0-rc2",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.0-rc2",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.10.0-rc1": {
|
||||||
|
"id": 2437435,
|
||||||
|
"tag_name": "v1.10.0-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.10.0-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.9.1": {
|
||||||
|
"id": 2161885,
|
||||||
|
"tag_name": "v1.9.1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.9.1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.9.1-rc1": {
|
||||||
|
"id": 2124307,
|
||||||
|
"tag_name": "v1.9.1-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.9.1-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.9.0": {
|
||||||
|
"id": 2065556,
|
||||||
|
"tag_name": "v1.9.0",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.9.0",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.9.0-rc5": {
|
||||||
|
"id": 2063038,
|
||||||
|
"tag_name": "v1.9.0-rc5",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.9.0-rc5",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.9.0-rc4": {
|
||||||
|
"id": 2051407,
|
||||||
|
"tag_name": "v1.9.0-rc4",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.9.0-rc4",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.9.0-rc3": {
|
||||||
|
"id": 2030176,
|
||||||
|
"tag_name": "v1.9.0-rc3",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.9.0-rc3",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.9.0-rc2": {
|
||||||
|
"id": 2006252,
|
||||||
|
"tag_name": "v1.9.0-rc2",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.9.0-rc2",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.9.0-rc1": {
|
||||||
|
"id": 1960642,
|
||||||
|
"tag_name": "v1.9.0-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.9.0-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.8.3": {
|
||||||
|
"id": 1948004,
|
||||||
|
"tag_name": "v1.8.3",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.8.3",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.8.2": {
|
||||||
|
"id": 1796575,
|
||||||
|
"tag_name": "v1.8.2",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.8.2",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.8.2-rc1": {
|
||||||
|
"id": 1765231,
|
||||||
|
"tag_name": "v1.8.2-rc1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.8.2-rc1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.8.1": {
|
||||||
|
"id": 1665370,
|
||||||
|
"tag_name": "v1.8.1",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.8.1",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.8.0": {
|
||||||
|
"id": 1657439,
|
||||||
|
"tag_name": "v1.8.0",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.8.0",
|
||||||
|
"assets": []
|
||||||
|
},
|
||||||
|
"v1.8.0-rc3": {
|
||||||
|
"id": 1643499,
|
||||||
|
"tag_name": "v1.8.0-rc3",
|
||||||
|
"html_url": "https://github.com/moby/moby/releases/tag/v1.8.0-rc3",
|
||||||
|
"assets": []
|
||||||
|
}
|
||||||
|
}
|
||||||
22
.github/workflows/build.yml
vendored
Normal file
22
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
name: build
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'main'
|
||||||
|
pull_request:
|
||||||
|
paths-ignore:
|
||||||
|
- '.github/*-releases.json'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
-
|
||||||
|
name: Build
|
||||||
|
uses: docker/bake-action@v2
|
||||||
|
with:
|
||||||
|
targets: build
|
||||||
2
.github/workflows/buildx-releases-json.yml
vendored
2
.github/workflows/buildx-releases-json.yml
vendored
@@ -13,7 +13,7 @@ on:
|
|||||||
- 'main'
|
- 'main'
|
||||||
pull_request:
|
pull_request:
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- '.github/buildx-releases.json'
|
- '.github/*-releases.json'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
generate:
|
generate:
|
||||||
|
|||||||
58
.github/workflows/docker-releases-json.yml
vendored
Normal file
58
.github/workflows/docker-releases-json.yml
vendored
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
name: docker-releases-json
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 */12 * * *'
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'main'
|
||||||
|
pull_request:
|
||||||
|
paths-ignore:
|
||||||
|
- '.github/*-releases.json'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
generate:
|
||||||
|
uses: crazy-max/.github/.github/workflows/releases-json.yml@2a596c917a8ad3e6203ae99b777148525a2e00d5
|
||||||
|
with:
|
||||||
|
repository: moby/moby
|
||||||
|
artifact_name: docker-releases-json
|
||||||
|
filename: docker-releases.json
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
|
open-pr:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
|
needs:
|
||||||
|
- generate
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
-
|
||||||
|
name: Download
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: docker-releases-json
|
||||||
|
path: .github
|
||||||
|
-
|
||||||
|
name: Commit changes
|
||||||
|
run: |
|
||||||
|
git add -A .
|
||||||
|
-
|
||||||
|
name: Create PR
|
||||||
|
uses: peter-evans/create-pull-request@2b011faafdcbc9ceb11414d64d0573f37c774b04
|
||||||
|
with:
|
||||||
|
base: main
|
||||||
|
branch: bot/docker-releases-json
|
||||||
|
commit-message: "github: update .github/docker-releases.json"
|
||||||
|
signoff: true
|
||||||
|
delete-branch: true
|
||||||
|
title: "Update `.github/docker-releases.json`"
|
||||||
|
body: |
|
||||||
|
Update `.github/docker-releases.json` to keep in sync with [https://github.com/moby/moby](https://github.com/moby/moby).
|
||||||
|
draft: false
|
||||||
45
.github/workflows/e2e.yml
vendored
Normal file
45
.github/workflows/e2e.yml
vendored
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
name: e2e
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'main'
|
||||||
|
pull_request:
|
||||||
|
paths-ignore:
|
||||||
|
- '.github/*-releases.json'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
os:
|
||||||
|
- ubuntu-latest
|
||||||
|
- macos-latest
|
||||||
|
- windows-latest
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
-
|
||||||
|
name: Setup Node
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 16
|
||||||
|
cache: 'yarn'
|
||||||
|
-
|
||||||
|
name: Install
|
||||||
|
run: yarn install
|
||||||
|
-
|
||||||
|
name: Test
|
||||||
|
run: yarn test-coverage:e2e --coverageDirectory=./coverage
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
-
|
||||||
|
name: Upload coverage
|
||||||
|
uses: codecov/codecov-action@v3
|
||||||
|
with:
|
||||||
|
file: ./coverage/clover.xml
|
||||||
|
flags: e2e
|
||||||
3
.github/workflows/test.yml
vendored
3
.github/workflows/test.yml
vendored
@@ -6,7 +6,7 @@ on:
|
|||||||
- 'main'
|
- 'main'
|
||||||
pull_request:
|
pull_request:
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- '.github/buildx-releases.json'
|
- '.github/*-releases.json'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
validate:
|
validate:
|
||||||
@@ -46,3 +46,4 @@ jobs:
|
|||||||
uses: codecov/codecov-action@v3
|
uses: codecov/codecov-action@v3
|
||||||
with:
|
with:
|
||||||
file: ./coverage/clover.xml
|
file: ./coverage/clover.xml
|
||||||
|
flags: unit
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
[](https://www.npmjs.com/package/@docker/actions-toolkit)
|
[](https://www.npmjs.com/package/@docker/actions-toolkit)
|
||||||
[](https://www.npmjs.com/package/@docker/actions-toolkit)
|
[](https://www.npmjs.com/package/@docker/actions-toolkit)
|
||||||
|
[](https://github.com/docker/actions-toolkit/actions?workflow=build)
|
||||||
[](https://github.com/docker/actions-toolkit/actions?workflow=test)
|
[](https://github.com/docker/actions-toolkit/actions?workflow=test)
|
||||||
|
[](https://github.com/docker/actions-toolkit/actions?workflow=e2e)
|
||||||
[](https://codecov.io/gh/docker/actions-toolkit)
|
[](https://codecov.io/gh/docker/actions-toolkit)
|
||||||
|
|
||||||
# Actions Toolkit
|
# Actions Toolkit
|
||||||
|
|||||||
@@ -32,9 +32,9 @@ jest.spyOn(Builder.prototype, 'inspect').mockImplementation(async (): Promise<Bu
|
|||||||
lastActivity: new Date('2023-01-16 09:45:23 +0000 UTC'),
|
lastActivity: new Date('2023-01-16 09:45:23 +0000 UTC'),
|
||||||
nodes: [
|
nodes: [
|
||||||
{
|
{
|
||||||
buildkitVersion: 'v0.11.0',
|
buildkit: 'v0.11.0',
|
||||||
buildkitdFlags: '--debug --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host',
|
'buildkitd-flags': '--debug --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host',
|
||||||
driverOpts: ['BUILDKIT_STEP_LOG_MAX_SIZE=10485760', 'BUILDKIT_STEP_LOG_MAX_SPEED=10485760', 'JAEGER_TRACE=localhost:6831', 'image=moby/buildkit:latest', 'network=host'],
|
'driver-opts': ['BUILDKIT_STEP_LOG_MAX_SIZE=10485760', 'BUILDKIT_STEP_LOG_MAX_SPEED=10485760', 'JAEGER_TRACE=localhost:6831', 'image=moby/buildkit:latest', 'network=host'],
|
||||||
endpoint: 'unix:///var/run/docker.sock',
|
endpoint: 'unix:///var/run/docker.sock',
|
||||||
name: 'builder20',
|
name: 'builder20',
|
||||||
platforms: 'linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6',
|
platforms: 'linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6',
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import * as fs from 'fs';
|
|||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
|
|
||||||
import {Builder} from '../../src/buildx/builder';
|
import {Builder} from '../../src/buildx/builder';
|
||||||
|
import {Exec} from '../../src/exec';
|
||||||
|
|
||||||
import {BuilderInfo} from '../../src/types/builder';
|
import {BuilderInfo} from '../../src/types/builder';
|
||||||
|
|
||||||
@@ -35,9 +36,9 @@ jest.spyOn(Builder.prototype, 'inspect').mockImplementation(async (): Promise<Bu
|
|||||||
lastActivity: new Date('2023-01-16 09:45:23 +0000 UTC'),
|
lastActivity: new Date('2023-01-16 09:45:23 +0000 UTC'),
|
||||||
nodes: [
|
nodes: [
|
||||||
{
|
{
|
||||||
buildkitVersion: 'v0.11.0',
|
buildkit: 'v0.11.0',
|
||||||
buildkitdFlags: '--debug --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host',
|
'buildkitd-flags': '--debug --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host',
|
||||||
driverOpts: ['BUILDKIT_STEP_LOG_MAX_SIZE=10485760', 'BUILDKIT_STEP_LOG_MAX_SPEED=10485760', 'JAEGER_TRACE=localhost:6831', 'image=moby/buildkit:latest', 'network=host'],
|
'driver-opts': ['BUILDKIT_STEP_LOG_MAX_SIZE=10485760', 'BUILDKIT_STEP_LOG_MAX_SPEED=10485760', 'JAEGER_TRACE=localhost:6831', 'image=moby/buildkit:latest', 'network=host'],
|
||||||
endpoint: 'unix:///var/run/docker.sock',
|
endpoint: 'unix:///var/run/docker.sock',
|
||||||
name: 'builder20',
|
name: 'builder20',
|
||||||
platforms: 'linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6',
|
platforms: 'linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6',
|
||||||
@@ -47,6 +48,19 @@ jest.spyOn(Builder.prototype, 'inspect').mockImplementation(async (): Promise<Bu
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('exists', () => {
|
||||||
|
it('valid', async () => {
|
||||||
|
const execSpy = jest.spyOn(Exec, 'getExecOutput');
|
||||||
|
const builder = new Builder();
|
||||||
|
await builder.exists('foo');
|
||||||
|
// eslint-disable-next-line jest/no-standalone-expect
|
||||||
|
expect(execSpy).toHaveBeenCalledWith(`docker`, ['buildx', 'inspect', 'foo'], {
|
||||||
|
silent: true,
|
||||||
|
ignoreReturnCode: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('inspect', () => {
|
describe('inspect', () => {
|
||||||
it('valid', async () => {
|
it('valid', async () => {
|
||||||
const builder = new Builder();
|
const builder = new Builder();
|
||||||
@@ -71,8 +85,8 @@ describe('parseInspect', () => {
|
|||||||
"name": "builder-5cb467f7-0940-47e1-b94b-d51f54054d620",
|
"name": "builder-5cb467f7-0940-47e1-b94b-d51f54054d620",
|
||||||
"endpoint": "unix:///var/run/docker.sock",
|
"endpoint": "unix:///var/run/docker.sock",
|
||||||
"status": "running",
|
"status": "running",
|
||||||
"buildkitdFlags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
|
"buildkitd-flags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
|
||||||
"buildkitVersion": "v0.10.4",
|
"buildkit": "v0.10.4",
|
||||||
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/amd64/v4,linux/arm64,linux/riscv64,linux/386,linux/arm/v7,linux/arm/v6"
|
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/amd64/v4,linux/arm64,linux/riscv64,linux/386,linux/arm/v7,linux/arm/v6"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -87,12 +101,12 @@ describe('parseInspect', () => {
|
|||||||
{
|
{
|
||||||
"name": "builder-5f449644-ff29-48af-8344-abb0292d06730",
|
"name": "builder-5f449644-ff29-48af-8344-abb0292d06730",
|
||||||
"endpoint": "unix:///var/run/docker.sock",
|
"endpoint": "unix:///var/run/docker.sock",
|
||||||
"driverOpts": [
|
"driver-opts": [
|
||||||
"image=moby/buildkit:latest"
|
"image=moby/buildkit:latest"
|
||||||
],
|
],
|
||||||
"status": "running",
|
"status": "running",
|
||||||
"buildkitdFlags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
|
"buildkitd-flags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
|
||||||
"buildkitVersion": "v0.10.4",
|
"buildkit": "v0.10.4",
|
||||||
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/amd64/v4,linux/386"
|
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/amd64/v4,linux/386"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -107,13 +121,13 @@ describe('parseInspect', () => {
|
|||||||
{
|
{
|
||||||
"name": "builder-9929e463-7954-4dc3-89cd-514cca29ff800",
|
"name": "builder-9929e463-7954-4dc3-89cd-514cca29ff800",
|
||||||
"endpoint": "unix:///var/run/docker.sock",
|
"endpoint": "unix:///var/run/docker.sock",
|
||||||
"driverOpts": [
|
"driver-opts": [
|
||||||
"image=moby/buildkit:master",
|
"image=moby/buildkit:master",
|
||||||
"network=host"
|
"network=host"
|
||||||
],
|
],
|
||||||
"status": "running",
|
"status": "running",
|
||||||
"buildkitdFlags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
|
"buildkitd-flags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
|
||||||
"buildkitVersion": "3fab389",
|
"buildkit": "3fab389",
|
||||||
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/amd64/v4,linux/386"
|
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/amd64/v4,linux/386"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -129,7 +143,7 @@ describe('parseInspect', () => {
|
|||||||
"name": "default",
|
"name": "default",
|
||||||
"endpoint": "default",
|
"endpoint": "default",
|
||||||
"status": "running",
|
"status": "running",
|
||||||
"buildkitVersion": "20.10.17",
|
"buildkit": "20.10.17",
|
||||||
"platforms": "linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/arm/v7,linux/arm/v6"
|
"platforms": "linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/arm/v7,linux/arm/v6"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -144,7 +158,7 @@ describe('parseInspect', () => {
|
|||||||
{
|
{
|
||||||
"name": "aws_graviton2",
|
"name": "aws_graviton2",
|
||||||
"endpoint": "tcp://1.23.45.67:1234",
|
"endpoint": "tcp://1.23.45.67:1234",
|
||||||
"driverOpts": [
|
"driver-opts": [
|
||||||
"cert=/home/user/.certs/aws_graviton2/cert.pem",
|
"cert=/home/user/.certs/aws_graviton2/cert.pem",
|
||||||
"key=/home/user/.certs/aws_graviton2/key.pem",
|
"key=/home/user/.certs/aws_graviton2/key.pem",
|
||||||
"cacert=/home/user/.certs/aws_graviton2/ca.pem"
|
"cacert=/home/user/.certs/aws_graviton2/ca.pem"
|
||||||
@@ -163,7 +177,7 @@ describe('parseInspect', () => {
|
|||||||
"name": "builder-17cfff01-48d9-4c3d-9332-9992e308a5100",
|
"name": "builder-17cfff01-48d9-4c3d-9332-9992e308a5100",
|
||||||
"endpoint": "unix:///var/run/docker.sock",
|
"endpoint": "unix:///var/run/docker.sock",
|
||||||
"status": "running",
|
"status": "running",
|
||||||
"buildkitdFlags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
|
"buildkitd-flags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
|
||||||
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/386"
|
"platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/386"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -179,9 +193,9 @@ describe('parseInspect', () => {
|
|||||||
"lastActivity": new Date("2023-01-16T09:45:23.000Z"),
|
"lastActivity": new Date("2023-01-16T09:45:23.000Z"),
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"buildkitVersion": "v0.11.0",
|
"buildkit": "v0.11.0",
|
||||||
"buildkitdFlags": "--debug --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
|
"buildkitd-flags": "--debug --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host",
|
||||||
"driverOpts": [
|
"driver-opts": [
|
||||||
"BUILDKIT_STEP_LOG_MAX_SIZE=10485760",
|
"BUILDKIT_STEP_LOG_MAX_SIZE=10485760",
|
||||||
"BUILDKIT_STEP_LOG_MAX_SPEED=10485760",
|
"BUILDKIT_STEP_LOG_MAX_SPEED=10485760",
|
||||||
"JAEGER_TRACE=localhost:6831",
|
"JAEGER_TRACE=localhost:6831",
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ import path from 'path';
|
|||||||
import * as io from '@actions/io';
|
import * as io from '@actions/io';
|
||||||
import osm = require('os');
|
import osm = require('os');
|
||||||
|
|
||||||
import {Docker} from '../src/docker';
|
import {Docker} from '../../src/docker/docker';
|
||||||
import {Exec} from '../src/exec';
|
import {Exec} from '../../src/exec';
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
jest.clearAllMocks();
|
jest.clearAllMocks();
|
||||||
@@ -57,6 +57,19 @@ describe('isAvailable', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('context', () => {
|
||||||
|
it('call docker context show', async () => {
|
||||||
|
const execSpy = jest.spyOn(Exec, 'getExecOutput');
|
||||||
|
await Docker.context().catch(() => {
|
||||||
|
// noop
|
||||||
|
});
|
||||||
|
expect(execSpy).toHaveBeenCalledWith(`docker`, ['context', 'inspect', '--format', '{{.Name}}'], {
|
||||||
|
ignoreReturnCode: true,
|
||||||
|
silent: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('printVersion', () => {
|
describe('printVersion', () => {
|
||||||
it('call docker version', async () => {
|
it('call docker version', async () => {
|
||||||
const execSpy = jest.spyOn(Exec, 'exec');
|
const execSpy = jest.spyOn(Exec, 'exec');
|
||||||
43
__tests__/docker/install.test.e2e.ts
Normal file
43
__tests__/docker/install.test.e2e.ts
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2023 actions-toolkit authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import path from 'path';
|
||||||
|
import {describe, expect, test} from '@jest/globals';
|
||||||
|
|
||||||
|
import {Install} from '../../src/docker/install';
|
||||||
|
import {Docker} from '../../src/docker/docker';
|
||||||
|
|
||||||
|
// prettier-ignore
|
||||||
|
const tmpDir = path.join(process.env.TEMP || '/tmp', 'docker-install-jest');
|
||||||
|
|
||||||
|
describe('install', () => {
|
||||||
|
// prettier-ignore
|
||||||
|
test.each(['v23.0.0'])(
|
||||||
|
'install docker %s', async (version) => {
|
||||||
|
await expect((async () => {
|
||||||
|
const install = new Install({
|
||||||
|
version: version,
|
||||||
|
runDir: tmpDir,
|
||||||
|
contextName: 'foo'
|
||||||
|
});
|
||||||
|
await install.download();
|
||||||
|
await install.install();
|
||||||
|
await Docker.printVersion();
|
||||||
|
await Docker.printInfo();
|
||||||
|
await install.tearDown();
|
||||||
|
})()).resolves.not.toThrow();
|
||||||
|
});
|
||||||
|
});
|
||||||
73
__tests__/docker/install.test.ts
Normal file
73
__tests__/docker/install.test.ts
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2023 actions-toolkit authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {describe, expect, jest, test, beforeEach, afterEach, it} from '@jest/globals';
|
||||||
|
import * as fs from 'fs';
|
||||||
|
import * as path from 'path';
|
||||||
|
import * as rimraf from 'rimraf';
|
||||||
|
import osm = require('os');
|
||||||
|
|
||||||
|
import {Install} from '../../src/docker/install';
|
||||||
|
|
||||||
|
// prettier-ignore
|
||||||
|
const tmpDir = path.join(process.env.TEMP || '/tmp', 'docker-install-jest');
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
jest.clearAllMocks();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(function () {
|
||||||
|
rimraf.sync(tmpDir);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('download', () => {
|
||||||
|
// prettier-ignore
|
||||||
|
test.each([
|
||||||
|
['v19.03.14', 'linux'],
|
||||||
|
['v20.10.22', 'linux'],
|
||||||
|
['v20.10.22', 'darwin'],
|
||||||
|
['v20.10.22', 'win32'],
|
||||||
|
])(
|
||||||
|
'acquires %p of docker (%s)', async (version, platformOS) => {
|
||||||
|
jest.spyOn(osm, 'platform').mockImplementation(() => platformOS);
|
||||||
|
const install = new Install({
|
||||||
|
version: version,
|
||||||
|
runDir: tmpDir,
|
||||||
|
});
|
||||||
|
const toolPath = await install.download();
|
||||||
|
expect(fs.existsSync(toolPath)).toBe(true);
|
||||||
|
}, 100000);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('getRelease', () => {
|
||||||
|
it('returns latest docker GitHub release', async () => {
|
||||||
|
const release = await Install.getRelease('latest');
|
||||||
|
expect(release).not.toBeNull();
|
||||||
|
expect(release?.tag_name).not.toEqual('');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns v23.0.0 buildx GitHub release', async () => {
|
||||||
|
const release = await Install.getRelease('v23.0.0');
|
||||||
|
expect(release).not.toBeNull();
|
||||||
|
expect(release?.id).toEqual(91109643);
|
||||||
|
expect(release?.tag_name).toEqual('v23.0.0');
|
||||||
|
expect(release?.html_url).toEqual('https://github.com/moby/moby/releases/tag/v23.0.0');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('unknown release', async () => {
|
||||||
|
await expect(Install.getRelease('foo')).rejects.toThrowError(new Error('Cannot find Docker release foo in https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/docker-releases.json'));
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -17,18 +17,131 @@
|
|||||||
import {beforeEach, describe, expect, it, jest} from '@jest/globals';
|
import {beforeEach, describe, expect, it, jest} from '@jest/globals';
|
||||||
|
|
||||||
import {Git} from '../src/git';
|
import {Git} from '../src/git';
|
||||||
|
import {Exec} from '../src/exec';
|
||||||
|
import {ExecOutput} from '@actions/exec';
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
jest.clearAllMocks();
|
jest.clearAllMocks();
|
||||||
|
jest.restoreAllMocks();
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('git', () => {
|
describe('context', () => {
|
||||||
it('returns git remote ref', async () => {
|
it('returns mocked ref and sha', async () => {
|
||||||
try {
|
jest.spyOn(Exec, 'getExecOutput').mockImplementation((cmd, args): Promise<ExecOutput> => {
|
||||||
expect(await Git.getRemoteSha('https://github.com/docker/buildx.git', 'refs/pull/648/head')).toEqual('f11797113e5a9b86bd976329c5dbb8a8bfdfadfa');
|
const fullCmd = `${cmd} ${args?.join(' ')}`;
|
||||||
} catch (e) {
|
let result = '';
|
||||||
// eslint-disable-next-line jest/no-conditional-expect
|
switch (fullCmd) {
|
||||||
expect(e).toEqual(null);
|
case 'git show --format=%H HEAD --quiet --':
|
||||||
}
|
result = 'test-sha';
|
||||||
|
break;
|
||||||
|
case 'git symbolic-ref HEAD':
|
||||||
|
result = 'refs/heads/test';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return Promise.resolve({
|
||||||
|
stdout: result,
|
||||||
|
stderr: '',
|
||||||
|
exitCode: 0
|
||||||
|
});
|
||||||
|
});
|
||||||
|
const ctx = await Git.context();
|
||||||
|
expect(ctx.ref).toEqual('refs/heads/test');
|
||||||
|
expect(ctx.sha).toEqual('test-sha');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('isInsideWorkTree', () => {
|
||||||
|
it('have been called', async () => {
|
||||||
|
const execSpy = jest.spyOn(Exec, 'getExecOutput');
|
||||||
|
try {
|
||||||
|
await Git.isInsideWorkTree();
|
||||||
|
} catch (err) {
|
||||||
|
// noop
|
||||||
|
}
|
||||||
|
expect(execSpy).toHaveBeenCalledWith(`git`, ['rev-parse', '--is-inside-work-tree'], {
|
||||||
|
silent: true,
|
||||||
|
ignoreReturnCode: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('remoteSha', () => {
|
||||||
|
it('returns git remote sha', async () => {
|
||||||
|
expect(await Git.remoteSha('https://github.com/docker/buildx.git', 'refs/pull/648/head')).toEqual('f11797113e5a9b86bd976329c5dbb8a8bfdfadfa');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('remoteURL', () => {
|
||||||
|
it('have been called', async () => {
|
||||||
|
const execSpy = jest.spyOn(Exec, 'getExecOutput');
|
||||||
|
try {
|
||||||
|
await Git.remoteURL();
|
||||||
|
} catch (err) {
|
||||||
|
// noop
|
||||||
|
}
|
||||||
|
expect(execSpy).toHaveBeenCalledWith(`git`, ['remote', 'get-url', 'origin'], {
|
||||||
|
silent: true,
|
||||||
|
ignoreReturnCode: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('ref', () => {
|
||||||
|
it('have been called', async () => {
|
||||||
|
const execSpy = jest.spyOn(Exec, 'getExecOutput');
|
||||||
|
try {
|
||||||
|
await Git.ref();
|
||||||
|
} catch (err) {
|
||||||
|
// noop
|
||||||
|
}
|
||||||
|
expect(execSpy).toHaveBeenCalledWith(`git`, ['symbolic-ref', 'HEAD'], {
|
||||||
|
silent: true,
|
||||||
|
ignoreReturnCode: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('fullCommit', () => {
|
||||||
|
it('have been called', async () => {
|
||||||
|
const execSpy = jest.spyOn(Exec, 'getExecOutput');
|
||||||
|
try {
|
||||||
|
await Git.fullCommit();
|
||||||
|
} catch (err) {
|
||||||
|
// noop
|
||||||
|
}
|
||||||
|
expect(execSpy).toHaveBeenCalledWith(`git`, ['show', '--format=%H', 'HEAD', '--quiet', '--'], {
|
||||||
|
silent: true,
|
||||||
|
ignoreReturnCode: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('shortCommit', () => {
|
||||||
|
it('have been called', async () => {
|
||||||
|
const execSpy = jest.spyOn(Exec, 'getExecOutput');
|
||||||
|
try {
|
||||||
|
await Git.shortCommit();
|
||||||
|
} catch (err) {
|
||||||
|
// noop
|
||||||
|
}
|
||||||
|
expect(execSpy).toHaveBeenCalledWith(`git`, ['show', '--format=%h', 'HEAD', '--quiet', '--'], {
|
||||||
|
silent: true,
|
||||||
|
ignoreReturnCode: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('tag', () => {
|
||||||
|
it('have been called', async () => {
|
||||||
|
const execSpy = jest.spyOn(Exec, 'getExecOutput');
|
||||||
|
try {
|
||||||
|
await Git.tag();
|
||||||
|
} catch (err) {
|
||||||
|
// noop
|
||||||
|
}
|
||||||
|
expect(execSpy).toHaveBeenCalledWith(`git`, ['tag', '--points-at', 'HEAD', '--sort', '-version:creatordate'], {
|
||||||
|
silent: true,
|
||||||
|
ignoreReturnCode: true
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
ARG LICENSE_HOLDER="actions-toolkit authors"
|
ARG LICENSE_HOLDER="actions-toolkit authors"
|
||||||
ARG LICENSE_TYPE="apache"
|
ARG LICENSE_TYPE="apache"
|
||||||
ARG LICENSE_FILES=".*\(Dockerfile\|Makefile\|\.js\|\.ts\|\.hcl\|\.sh\)"
|
ARG LICENSE_FILES=".*\(Dockerfile\|Makefile\|\.js\|\.ts\|\.hcl\|\.sh|\.ps1\)"
|
||||||
ARG ADDLICENSE_VERSION="v1.0.0"
|
ARG ADDLICENSE_VERSION="v1.0.0"
|
||||||
|
|
||||||
FROM ghcr.io/google/addlicense:${ADDLICENSE_VERSION} AS addlicense
|
FROM ghcr.io/google/addlicense:${ADDLICENSE_VERSION} AS addlicense
|
||||||
|
|||||||
31
jest.config.e2e.ts
Normal file
31
jest.config.e2e.ts
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2023 actions-toolkit authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
clearMocks: true,
|
||||||
|
testEnvironment: 'node',
|
||||||
|
moduleFileExtensions: ['js', 'ts'],
|
||||||
|
setupFiles: ['dotenv/config'],
|
||||||
|
testMatch: ['**/*.test.e2e.ts'],
|
||||||
|
testTimeout: 1800000, // 30 minutes
|
||||||
|
transform: {
|
||||||
|
'^.+\\.ts$': 'ts-jest'
|
||||||
|
},
|
||||||
|
moduleNameMapper: {
|
||||||
|
'^csv-parse/sync': '<rootDir>/node_modules/csv-parse/dist/cjs/sync.cjs'
|
||||||
|
},
|
||||||
|
verbose: false
|
||||||
|
};
|
||||||
@@ -11,7 +11,9 @@
|
|||||||
"prettier": "prettier --check \"./**/*.ts\"",
|
"prettier": "prettier --check \"./**/*.ts\"",
|
||||||
"prettier:fix": "prettier --write \"./**/*.ts\"",
|
"prettier:fix": "prettier --write \"./**/*.ts\"",
|
||||||
"test": "jest",
|
"test": "jest",
|
||||||
"test-coverage": "jest --coverage"
|
"test:e2e": "jest -c jest.config.e2e.ts --runInBand --detectOpenHandles",
|
||||||
|
"test-coverage": "jest --coverage",
|
||||||
|
"test-coverage:e2e": "jest --coverage -c jest.config.e2e.ts --runInBand --detectOpenHandles"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -48,7 +50,9 @@
|
|||||||
"@actions/http-client": "^2.0.1",
|
"@actions/http-client": "^2.0.1",
|
||||||
"@actions/io": "^1.1.2",
|
"@actions/io": "^1.1.2",
|
||||||
"@actions/tool-cache": "^2.0.1",
|
"@actions/tool-cache": "^2.0.1",
|
||||||
|
"async-retry": "^1.3.3",
|
||||||
"csv-parse": "^5.3.5",
|
"csv-parse": "^5.3.5",
|
||||||
|
"handlebars": "^4.7.7",
|
||||||
"jwt-decode": "^3.1.2",
|
"jwt-decode": "^3.1.2",
|
||||||
"semver": "^7.3.8",
|
"semver": "^7.3.8",
|
||||||
"tmp": "^0.2.1"
|
"tmp": "^0.2.1"
|
||||||
|
|||||||
@@ -39,14 +39,14 @@ export class BuildKit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async getVersion(node: NodeInfo): Promise<string | undefined> {
|
public async getVersion(node: NodeInfo): Promise<string | undefined> {
|
||||||
if (!node.buildkitVersion && node.name) {
|
if (!node.buildkit && node.name) {
|
||||||
try {
|
try {
|
||||||
return await this.getVersionWithinImage(node.name);
|
return await this.getVersionWithinImage(node.name);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
core.warning(e);
|
core.warning(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return node.buildkitVersion;
|
return node.buildkit;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async getVersionWithinImage(nodeName: string): Promise<string> {
|
private async getVersionWithinImage(nodeName: string): Promise<string> {
|
||||||
@@ -80,7 +80,7 @@ export class BuildKit {
|
|||||||
builderInfo = await new Builder({buildx: this.buildx}).inspect(builderName);
|
builderInfo = await new Builder({buildx: this.buildx}).inspect(builderName);
|
||||||
}
|
}
|
||||||
for (const node of builderInfo.nodes) {
|
for (const node of builderInfo.nodes) {
|
||||||
let bkversion = node.buildkitVersion;
|
let bkversion = node.buildkit;
|
||||||
core.debug(`BuildKit.versionSatisfies ${bkversion}: ${range}`);
|
core.debug(`BuildKit.versionSatisfies ${bkversion}: ${range}`);
|
||||||
if (!bkversion) {
|
if (!bkversion) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -14,6 +14,8 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import * as core from '@actions/core';
|
||||||
|
|
||||||
import {Buildx} from './buildx';
|
import {Buildx} from './buildx';
|
||||||
import {Exec} from '../exec';
|
import {Exec} from '../exec';
|
||||||
|
|
||||||
@@ -30,6 +32,29 @@ export class Builder {
|
|||||||
this.buildx = opts?.buildx || new Buildx();
|
this.buildx = opts?.buildx || new Buildx();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async exists(name: string): Promise<boolean> {
|
||||||
|
const cmd = await this.buildx.getCommand(['inspect', name]);
|
||||||
|
|
||||||
|
const ok: boolean = await Exec.getExecOutput(cmd.command, cmd.args, {
|
||||||
|
ignoreReturnCode: true,
|
||||||
|
silent: true
|
||||||
|
})
|
||||||
|
.then(res => {
|
||||||
|
if (res.stderr.length > 0 && res.exitCode != 0) {
|
||||||
|
core.debug(`Builder.exists cmd err: ${res.stderr.trim()}`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return res.exitCode == 0;
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
core.debug(`Builder.exists error: ${error}`);
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
core.debug(`Builder.exists: ${ok}`);
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
public async inspect(name: string): Promise<BuilderInfo> {
|
public async inspect(name: string): Promise<BuilderInfo> {
|
||||||
const cmd = await this.buildx.getCommand(['inspect', name]);
|
const cmd = await this.buildx.getCommand(['inspect', name]);
|
||||||
return await Exec.getExecOutput(cmd.command, cmd.args, {
|
return await Exec.getExecOutput(cmd.command, cmd.args, {
|
||||||
@@ -80,7 +105,7 @@ export class Builder {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'driver options': {
|
case 'driver options': {
|
||||||
node.driverOpts = (value.match(/(\w+)="([^"]*)"/g) || []).map(v => v.replace(/^(.*)="(.*)"$/g, '$1=$2'));
|
node['driver-opts'] = (value.match(/(\w+)="([^"]*)"/g) || []).map(v => v.replace(/^(.*)="(.*)"$/g, '$1=$2'));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'status': {
|
case 'status': {
|
||||||
@@ -88,11 +113,11 @@ export class Builder {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'flags': {
|
case 'flags': {
|
||||||
node.buildkitdFlags = value;
|
node['buildkitd-flags'] = value;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'buildkit': {
|
case 'buildkit': {
|
||||||
node.buildkitVersion = value;
|
node.buildkit = value;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'platforms': {
|
case 'platforms': {
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import path from 'path';
|
|||||||
import * as core from '@actions/core';
|
import * as core from '@actions/core';
|
||||||
import * as semver from 'semver';
|
import * as semver from 'semver';
|
||||||
|
|
||||||
import {Docker} from '../docker';
|
import {Docker} from '../docker/docker';
|
||||||
import {Exec} from '../exec';
|
import {Exec} from '../exec';
|
||||||
import {Inputs} from './inputs';
|
import {Inputs} from './inputs';
|
||||||
|
|
||||||
@@ -76,7 +76,7 @@ export class Buildx {
|
|||||||
})
|
})
|
||||||
.then(res => {
|
.then(res => {
|
||||||
if (res.stderr.length > 0 && res.exitCode != 0) {
|
if (res.stderr.length > 0 && res.exitCode != 0) {
|
||||||
core.debug(`Buildx.isAvailable cmd err: ${res.stderr}`);
|
core.debug(`Buildx.isAvailable cmd err: ${res.stderr.trim()}`);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return res.exitCode == 0;
|
return res.exitCode == 0;
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ import * as util from 'util';
|
|||||||
import {Buildx} from './buildx';
|
import {Buildx} from './buildx';
|
||||||
import {Context} from '../context';
|
import {Context} from '../context';
|
||||||
import {Exec} from '../exec';
|
import {Exec} from '../exec';
|
||||||
import {Docker} from '../docker';
|
import {Docker} from '../docker/docker';
|
||||||
import {Git} from '../git';
|
import {Git} from '../git';
|
||||||
|
|
||||||
import {GitHubRelease} from '../types/github';
|
import {GitHubRelease} from '../types/github';
|
||||||
@@ -73,7 +73,7 @@ export class Install {
|
|||||||
if (ref.match(/^[0-9a-fA-F]{40}$/)) {
|
if (ref.match(/^[0-9a-fA-F]{40}$/)) {
|
||||||
vspec = ref;
|
vspec = ref;
|
||||||
} else {
|
} else {
|
||||||
vspec = await Git.getRemoteSha(repo, ref);
|
vspec = await Git.remoteSha(repo, ref);
|
||||||
}
|
}
|
||||||
core.debug(`Install.build: tool version spec ${vspec}`);
|
core.debug(`Install.build: tool version spec ${vspec}`);
|
||||||
|
|
||||||
|
|||||||
338
src/docker/assets.ts
Normal file
338
src/docker/assets.ts
Normal file
@@ -0,0 +1,338 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2023 actions-toolkit authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import fs from 'fs';
|
||||||
|
import {Context} from '../context';
|
||||||
|
|
||||||
|
export const setupDockerLinuxSh = (): string => {
|
||||||
|
return get('docker-setup-linux.sh', setupDockerLinuxShData, '0755');
|
||||||
|
};
|
||||||
|
|
||||||
|
export const setupDockerWinPs1 = (): string => {
|
||||||
|
return get('docker-setup-win.ps1', setupDockerWinPs1Data);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const dockerServiceLogsPs1 = (): string => {
|
||||||
|
return get('docker-service-logs.ps1', dockerServiceLogsPs1Data);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const colimaYaml = (): string => {
|
||||||
|
return get('colima.yaml', colimaYamlData);
|
||||||
|
};
|
||||||
|
|
||||||
|
const get = (filename: string, data: string, mode?: string): string => {
|
||||||
|
const assetPath = Context.tmpName({
|
||||||
|
template: `docker-asset-XXXXXX-${filename}`,
|
||||||
|
tmpdir: Context.tmpDir()
|
||||||
|
});
|
||||||
|
fs.writeFileSync(assetPath, data);
|
||||||
|
if (mode) {
|
||||||
|
fs.chmodSync(assetPath, mode);
|
||||||
|
}
|
||||||
|
return assetPath;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const setupDockerLinuxShData = `
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
: "\${TOOLDIR=}"
|
||||||
|
: "\${RUNDIR=}"
|
||||||
|
: "\${DOCKER_HOST=}"
|
||||||
|
|
||||||
|
export PATH="$TOOLDIR::$PATH"
|
||||||
|
|
||||||
|
if [ -z "$DOCKER_HOST" ]; then
|
||||||
|
echo >&2 'error: DOCKER_HOST required'
|
||||||
|
false
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v dockerd &> /dev/null; then
|
||||||
|
echo >&2 'error: dockerd missing from PATH'
|
||||||
|
false
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "$RUNDIR"
|
||||||
|
|
||||||
|
(
|
||||||
|
echo "Starting dockerd"
|
||||||
|
set -x
|
||||||
|
exec dockerd \\
|
||||||
|
--host="$DOCKER_HOST" \\
|
||||||
|
--exec-root="$RUNDIR/execroot" \\
|
||||||
|
--data-root="$RUNDIR/data" \\
|
||||||
|
--pidfile="$RUNDIR/docker.pid" \\
|
||||||
|
--userland-proxy=false \\
|
||||||
|
2>&1 | tee "$RUNDIR/dockerd.log"
|
||||||
|
) &
|
||||||
|
`;
|
||||||
|
|
||||||
|
export const setupDockerWinPs1Data = `
|
||||||
|
[CmdletBinding()]
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$ToolDir,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$RunDir,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$DockerHost)
|
||||||
|
|
||||||
|
$pwver = (Get-ItemProperty -Path HKLM:\\SOFTWARE\\Microsoft\\PowerShell\\3\\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion
|
||||||
|
Write-Host "PowerShell version: $pwver"
|
||||||
|
|
||||||
|
# Create run directory
|
||||||
|
New-Item -ItemType Directory "$RunDir" -ErrorAction SilentlyContinue | Out-Null
|
||||||
|
|
||||||
|
# Remove existing service
|
||||||
|
if (Get-Service docker -ErrorAction SilentlyContinue) {
|
||||||
|
$dockerVersion = (docker version -f "{{.Server.Version}}")
|
||||||
|
Write-Host "Current installed Docker version: $dockerVersion"
|
||||||
|
# stop service
|
||||||
|
Stop-Service -Force -Name docker
|
||||||
|
Write-Host "Service stopped"
|
||||||
|
# remove service
|
||||||
|
sc.exe delete "docker"
|
||||||
|
# removes event log entry. we could use "Remove-EventLog -LogName -Source docker"
|
||||||
|
# but this cmd is not available atm
|
||||||
|
$ErrorActionPreference = "SilentlyContinue"
|
||||||
|
& reg delete "HKLM\\SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\docker" /f 2>&1 | Out-Null
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
Write-Host "Service removed"
|
||||||
|
}
|
||||||
|
|
||||||
|
$env:DOCKER_HOST = $DockerHost
|
||||||
|
Write-Host "DOCKER_HOST: $env:DOCKER_HOST"
|
||||||
|
|
||||||
|
Write-Host "Creating service"
|
||||||
|
New-Item -ItemType Directory "$RunDir\\moby-root" -ErrorAction SilentlyContinue | Out-Null
|
||||||
|
New-Item -ItemType Directory "$RunDir\\moby-exec" -ErrorAction SilentlyContinue | Out-Null
|
||||||
|
Start-Process -Wait -NoNewWindow "$ToolDir\\dockerd" \`
|
||||||
|
-ArgumentList \`
|
||||||
|
"--host=$DockerHost", \`
|
||||||
|
"--data-root=$RunDir\\moby-root", \`
|
||||||
|
"--exec-root=$RunDir\\moby-exec", \`
|
||||||
|
"--pidfile=$RunDir\\docker.pid", \`
|
||||||
|
"--register-service"
|
||||||
|
Write-Host "Starting service"
|
||||||
|
Start-Service -Name docker
|
||||||
|
Write-Host "Service started successfully!"
|
||||||
|
|
||||||
|
$tries=20
|
||||||
|
Write-Host "Waiting for Docker daemon to start..."
|
||||||
|
While ($true) {
|
||||||
|
$ErrorActionPreference = "SilentlyContinue"
|
||||||
|
& "$ToolDir\\docker" version | Out-Null
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
If ($LastExitCode -eq 0) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
$tries--
|
||||||
|
If ($tries -le 0) {
|
||||||
|
Throw "Failed to get a response from Docker daemon"
|
||||||
|
}
|
||||||
|
Write-Host -NoNewline "."
|
||||||
|
Start-Sleep -Seconds 1
|
||||||
|
}
|
||||||
|
Write-Host "Docker daemon started successfully!"
|
||||||
|
`;
|
||||||
|
|
||||||
|
export const dockerServiceLogsPs1Data = `
|
||||||
|
Get-WinEvent -ea SilentlyContinue \`
|
||||||
|
-FilterHashtable @{ProviderName= "docker"; LogName = "application"} |
|
||||||
|
Sort-Object @{Expression="TimeCreated";Descending=$false} |
|
||||||
|
ForEach-Object {"$($_.TimeCreated.ToUniversalTime().ToString("o")) [$($_.LevelDisplayName)] $($_.Message)"}
|
||||||
|
`;
|
||||||
|
|
||||||
|
export const colimaYamlData = `
|
||||||
|
# Number of CPUs to be allocated to the virtual machine.
|
||||||
|
# Default: 2
|
||||||
|
cpu: 2
|
||||||
|
|
||||||
|
# Size of the disk in GiB to be allocated to the virtual machine.
|
||||||
|
# NOTE: changing this has no effect after the virtual machine has been created.
|
||||||
|
# Default: 60
|
||||||
|
disk: 60
|
||||||
|
|
||||||
|
# Size of the memory in GiB to be allocated to the virtual machine.
|
||||||
|
# Default: 2
|
||||||
|
memory: 2
|
||||||
|
|
||||||
|
# Architecture of the virtual machine (x86_64, aarch64, host).
|
||||||
|
# Default: host
|
||||||
|
arch: host
|
||||||
|
|
||||||
|
# Container runtime to be used (docker, containerd).
|
||||||
|
# Default: docker
|
||||||
|
runtime: docker
|
||||||
|
|
||||||
|
# Kubernetes configuration for the virtual machine.
|
||||||
|
kubernetes:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
# Auto-activate on the Host for client access.
|
||||||
|
# Setting to true does the following on startup
|
||||||
|
# - sets as active Docker context (for Docker runtime).
|
||||||
|
# - sets as active Kubernetes context (if Kubernetes is enabled).
|
||||||
|
# Default: true
|
||||||
|
autoActivate: false
|
||||||
|
|
||||||
|
# Network configurations for the virtual machine.
|
||||||
|
network:
|
||||||
|
# Assign reachable IP address to the virtual machine.
|
||||||
|
# NOTE: this is currently macOS only and ignored on Linux.
|
||||||
|
# Default: false
|
||||||
|
address: false
|
||||||
|
|
||||||
|
# Custom DNS resolvers for the virtual machine.
|
||||||
|
#
|
||||||
|
# EXAMPLE
|
||||||
|
# dns: [8.8.8.8, 1.1.1.1]
|
||||||
|
#
|
||||||
|
# Default: []
|
||||||
|
dns: []
|
||||||
|
|
||||||
|
# DNS hostnames to resolve to custom targets using the internal resolver.
|
||||||
|
# This setting has no effect if a custom DNS resolver list is supplied above.
|
||||||
|
# It does not configure the /etc/hosts files of any machine or container.
|
||||||
|
# The value can be an IP address or another host.
|
||||||
|
#
|
||||||
|
# EXAMPLE
|
||||||
|
# dnsHosts:
|
||||||
|
# example.com: 1.2.3.4
|
||||||
|
dnsHosts:
|
||||||
|
host.docker.internal: host.lima.internal
|
||||||
|
|
||||||
|
# Network driver to use (slirp, gvproxy), (requires vmType \`qemu\`)
|
||||||
|
# - slirp is the default user mode networking provided by Qemu
|
||||||
|
# - gvproxy is an alternative to VPNKit based on gVisor https://github.com/containers/gvisor-tap-vsock
|
||||||
|
# Default: gvproxy
|
||||||
|
driver: gvproxy
|
||||||
|
|
||||||
|
# Forward the host's SSH agent to the virtual machine.
|
||||||
|
# Default: false
|
||||||
|
forwardAgent: false
|
||||||
|
|
||||||
|
# Docker daemon configuration that maps directly to daemon.json.
|
||||||
|
# https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file.
|
||||||
|
# NOTE: some settings may affect Colima's ability to start docker. e.g. \`hosts\`.
|
||||||
|
#
|
||||||
|
# EXAMPLE - disable buildkit
|
||||||
|
# docker:
|
||||||
|
# features:
|
||||||
|
# buildkit: false
|
||||||
|
#
|
||||||
|
# EXAMPLE - add insecure registries
|
||||||
|
# docker:
|
||||||
|
# insecure-registries:
|
||||||
|
# - myregistry.com:5000
|
||||||
|
# - host.docker.internal:5000
|
||||||
|
#
|
||||||
|
# Colima default behaviour: buildkit enabled
|
||||||
|
# Default: {}
|
||||||
|
docker: {}
|
||||||
|
|
||||||
|
# Virtual Machine type (qemu, vz)
|
||||||
|
# NOTE: this is macOS 13 only. For Linux and macOS <13.0, qemu is always used.
|
||||||
|
#
|
||||||
|
# vz is macOS virtualization framework and requires macOS 13
|
||||||
|
#
|
||||||
|
# Default: qemu
|
||||||
|
vmType: qemu
|
||||||
|
|
||||||
|
# Volume mount driver for the virtual machine (virtiofs, 9p, sshfs).
|
||||||
|
#
|
||||||
|
# virtiofs is limited to macOS and vmType \`vz\`. It is the fastest of the options.
|
||||||
|
#
|
||||||
|
# 9p is the recommended and the most stable option for vmType \`qemu\`.
|
||||||
|
#
|
||||||
|
# sshfs is faster than 9p but the least reliable of the options (when there are lots
|
||||||
|
# of concurrent reads or writes).
|
||||||
|
#
|
||||||
|
# Default: virtiofs (for vz), sshfs (for qemu)
|
||||||
|
mountType: 9p
|
||||||
|
|
||||||
|
# The CPU type for the virtual machine (requires vmType \`qemu\`).
|
||||||
|
# Options available for host emulation can be checked with: \`qemu-system-$(arch) -cpu help\`.
|
||||||
|
# Instructions are also supported by appending to the cpu type e.g. "qemu64,+ssse3".
|
||||||
|
# Default: host
|
||||||
|
cpuType: host
|
||||||
|
|
||||||
|
# For a more general purpose virtual machine, Ubuntu container is optionally provided
|
||||||
|
# as a layer on the virtual machine.
|
||||||
|
# The underlying virtual machine is still accessible via \`colima ssh --layer=false\` or running \`colima\` in
|
||||||
|
# the Ubuntu session.
|
||||||
|
#
|
||||||
|
# Default: false
|
||||||
|
layer: false
|
||||||
|
|
||||||
|
# Custom provision scripts for the virtual machine.
|
||||||
|
# Provisioning scripts are executed on startup and therefore needs to be idempotent.
|
||||||
|
#
|
||||||
|
# EXAMPLE - script exected as root
|
||||||
|
# provision:
|
||||||
|
# - mode: system
|
||||||
|
# script: apk add htop vim
|
||||||
|
#
|
||||||
|
# EXAMPLE - script exected as user
|
||||||
|
# provision:
|
||||||
|
# - mode: user
|
||||||
|
# script: |
|
||||||
|
# [ -f ~/.provision ] && exit 0;
|
||||||
|
# echo provisioning as $USER...
|
||||||
|
# touch ~/.provision
|
||||||
|
#
|
||||||
|
# Default: []
|
||||||
|
provision:
|
||||||
|
- mode: system
|
||||||
|
script: |
|
||||||
|
mkdir -p /tmp/docker-bins
|
||||||
|
cd /tmp/docker-bins
|
||||||
|
wget -qO- "https://download.docker.com/linux/static/{{dockerChannel}}/{{hostArch}}/docker-{{dockerVersion}}.tgz" | tar xvz --strip 1
|
||||||
|
mv -f /tmp/docker-bins/* /usr/bin/
|
||||||
|
|
||||||
|
# Modify ~/.ssh/config automatically to include a SSH config for the virtual machine.
|
||||||
|
# SSH config will still be generated in ~/.colima/ssh_config regardless.
|
||||||
|
# Default: true
|
||||||
|
sshConfig: false
|
||||||
|
|
||||||
|
# Configure volume mounts for the virtual machine.
|
||||||
|
# Colima mounts user's home directory by default to provide a familiar
|
||||||
|
# user experience.
|
||||||
|
#
|
||||||
|
# EXAMPLE
|
||||||
|
# mounts:
|
||||||
|
# - location: ~/secrets
|
||||||
|
# writable: false
|
||||||
|
# - location: ~/projects
|
||||||
|
# writable: true
|
||||||
|
#
|
||||||
|
# Colima default behaviour: $HOME and /tmp/colima are mounted as writable.
|
||||||
|
# Default: []
|
||||||
|
mounts: []
|
||||||
|
|
||||||
|
# Environment variables for the virtual machine.
|
||||||
|
#
|
||||||
|
# EXAMPLE
|
||||||
|
# env:
|
||||||
|
# KEY: value
|
||||||
|
# ANOTHER_KEY: another value
|
||||||
|
#
|
||||||
|
# Default: {}
|
||||||
|
env: {}
|
||||||
|
`;
|
||||||
@@ -18,7 +18,7 @@ import os from 'os';
|
|||||||
import path from 'path';
|
import path from 'path';
|
||||||
import * as core from '@actions/core';
|
import * as core from '@actions/core';
|
||||||
import * as io from '@actions/io';
|
import * as io from '@actions/io';
|
||||||
import {Exec} from './exec';
|
import {Exec} from '../exec';
|
||||||
|
|
||||||
export class Docker {
|
export class Docker {
|
||||||
static get configDir(): string {
|
static get configDir(): string {
|
||||||
@@ -38,6 +38,22 @@ export class Docker {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async context(name?: string): Promise<string> {
|
||||||
|
const args = ['context', 'inspect', '--format', '{{.Name}}'];
|
||||||
|
if (name) {
|
||||||
|
args.push(name);
|
||||||
|
}
|
||||||
|
return await Exec.getExecOutput(`docker`, args, {
|
||||||
|
ignoreReturnCode: true,
|
||||||
|
silent: true
|
||||||
|
}).then(res => {
|
||||||
|
if (res.stderr.length > 0 && res.exitCode != 0) {
|
||||||
|
throw new Error(res.stderr);
|
||||||
|
}
|
||||||
|
return res.stdout.trim();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public static async printVersion(): Promise<void> {
|
public static async printVersion(): Promise<void> {
|
||||||
await Exec.exec('docker', ['version']);
|
await Exec.exec('docker', ['version']);
|
||||||
}
|
}
|
||||||
386
src/docker/install.ts
Normal file
386
src/docker/install.ts
Normal file
@@ -0,0 +1,386 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2023 actions-toolkit authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import * as child_process from 'child_process';
|
||||||
|
import fs from 'fs';
|
||||||
|
import os from 'os';
|
||||||
|
import path from 'path';
|
||||||
|
import retry from 'async-retry';
|
||||||
|
import * as handlebars from 'handlebars';
|
||||||
|
import * as util from 'util';
|
||||||
|
import * as core from '@actions/core';
|
||||||
|
import * as httpm from '@actions/http-client';
|
||||||
|
import * as io from '@actions/io';
|
||||||
|
import * as tc from '@actions/tool-cache';
|
||||||
|
|
||||||
|
import {Context} from '../context';
|
||||||
|
import {Exec} from '../exec';
|
||||||
|
import {Util} from '../util';
|
||||||
|
import {colimaYamlData, dockerServiceLogsPs1, setupDockerLinuxSh, setupDockerWinPs1} from './assets';
|
||||||
|
import {GitHubRelease} from '../types/github';
|
||||||
|
|
||||||
|
export interface InstallOpts {
|
||||||
|
version?: string;
|
||||||
|
channel?: string;
|
||||||
|
runDir: string;
|
||||||
|
contextName?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Install {
|
||||||
|
private readonly runDir: string;
|
||||||
|
private readonly version: string;
|
||||||
|
private readonly channel: string;
|
||||||
|
private readonly contextName: string;
|
||||||
|
private _version: string | undefined;
|
||||||
|
private _toolDir: string | undefined;
|
||||||
|
|
||||||
|
constructor(opts: InstallOpts) {
|
||||||
|
this.runDir = opts.runDir;
|
||||||
|
this.version = opts.version || 'latest';
|
||||||
|
this.channel = opts.channel || 'stable';
|
||||||
|
this.contextName = opts.contextName || 'setup-docker-action';
|
||||||
|
}
|
||||||
|
|
||||||
|
get toolDir(): string {
|
||||||
|
return this._toolDir || Context.tmpDir();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async download(): Promise<string> {
|
||||||
|
const release: GitHubRelease = await Install.getRelease(this.version);
|
||||||
|
this._version = release.tag_name.replace(/^v+|v+$/g, '');
|
||||||
|
core.debug(`docker.Install.download version: ${this._version}`);
|
||||||
|
|
||||||
|
const downloadURL = this.downloadURL(this._version, this.channel);
|
||||||
|
core.info(`Downloading ${downloadURL}`);
|
||||||
|
|
||||||
|
const downloadPath = await tc.downloadTool(downloadURL);
|
||||||
|
core.debug(`docker.Install.download downloadPath: ${downloadPath}`);
|
||||||
|
|
||||||
|
let extractFolder: string;
|
||||||
|
if (os.platform() == 'win32') {
|
||||||
|
extractFolder = await tc.extractZip(downloadPath);
|
||||||
|
} else {
|
||||||
|
extractFolder = await tc.extractTar(downloadPath);
|
||||||
|
}
|
||||||
|
if (Util.isDirectory(path.join(extractFolder, 'docker'))) {
|
||||||
|
extractFolder = path.join(extractFolder, 'docker');
|
||||||
|
}
|
||||||
|
core.debug(`docker.Install.download extractFolder: ${extractFolder}`);
|
||||||
|
|
||||||
|
core.info('Fixing perms');
|
||||||
|
fs.readdir(path.join(extractFolder), function (err, files) {
|
||||||
|
if (err) {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
files.forEach(function (file, index) {
|
||||||
|
fs.chmodSync(path.join(extractFolder, file), '0755');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const tooldir = await tc.cacheDir(extractFolder, `docker-${this.channel}`, this._version.replace(/(0+)([1-9]+)/, '$2'));
|
||||||
|
core.addPath(tooldir);
|
||||||
|
core.info('Added Docker to PATH');
|
||||||
|
|
||||||
|
this._toolDir = tooldir;
|
||||||
|
return tooldir;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async install(): Promise<void> {
|
||||||
|
if (!this.toolDir) {
|
||||||
|
throw new Error('toolDir must be set. Run download first.');
|
||||||
|
}
|
||||||
|
if (!this.runDir) {
|
||||||
|
throw new Error('runDir must be set');
|
||||||
|
}
|
||||||
|
switch (os.platform()) {
|
||||||
|
case 'darwin': {
|
||||||
|
await this.installDarwin();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'linux': {
|
||||||
|
await this.installLinux();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'win32': {
|
||||||
|
await this.installWindows();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
throw new Error(`Unsupported platform: ${os.platform()}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async installDarwin(): Promise<void> {
|
||||||
|
const colimaDir = path.join(os.homedir(), '.colima', 'default'); // TODO: create a custom colima profile to avoid overlap with other actions
|
||||||
|
await io.mkdirP(colimaDir);
|
||||||
|
const dockerHost = `unix://${colimaDir}/docker.sock`;
|
||||||
|
|
||||||
|
if (!(await Install.colimaInstalled())) {
|
||||||
|
await core.group('Installing colima', async () => {
|
||||||
|
await Exec.exec('brew', ['install', 'colima']);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
await core.group('Creating colima config', async () => {
|
||||||
|
const colimaCfg = handlebars.compile(colimaYamlData)({
|
||||||
|
hostArch: Install.platformArch(),
|
||||||
|
dockerVersion: this._version,
|
||||||
|
dockerChannel: this.channel
|
||||||
|
});
|
||||||
|
core.info(`Writing colima config to ${path.join(colimaDir, 'colima.yaml')}`);
|
||||||
|
fs.writeFileSync(path.join(colimaDir, 'colima.yaml'), colimaCfg);
|
||||||
|
core.info(colimaCfg);
|
||||||
|
});
|
||||||
|
|
||||||
|
// colima is already started on the runner so env var added in download
|
||||||
|
// method is not expanded to the running process.
|
||||||
|
const envs = Object.assign({}, process.env, {
|
||||||
|
PATH: `${this.toolDir}:${process.env.PATH}`
|
||||||
|
}) as {
|
||||||
|
[key: string]: string;
|
||||||
|
};
|
||||||
|
await core.group('Starting colima', async () => {
|
||||||
|
await Exec.exec('colima', ['start', '--very-verbose'], {env: envs});
|
||||||
|
});
|
||||||
|
|
||||||
|
await core.group('Create Docker context', async () => {
|
||||||
|
await Exec.exec('docker', ['context', 'create', this.contextName, '--docker', `host=${dockerHost}`]);
|
||||||
|
await Exec.exec('docker', ['context', 'use', this.contextName]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private async installLinux(): Promise<void> {
|
||||||
|
const dockerHost = `unix://${path.join(this.runDir, 'docker.sock')}`;
|
||||||
|
await io.mkdirP(this.runDir);
|
||||||
|
|
||||||
|
await core.group('Start Docker daemon', async () => {
|
||||||
|
const bashPath: string = await io.which('bash', true);
|
||||||
|
const proc = await child_process.spawn(`sudo -E ${bashPath} ${setupDockerLinuxSh()}`, [], {
|
||||||
|
detached: true,
|
||||||
|
shell: true,
|
||||||
|
stdio: ['ignore', process.stdout, process.stderr],
|
||||||
|
env: Object.assign({}, process.env, {
|
||||||
|
TOOLDIR: this.toolDir,
|
||||||
|
RUNDIR: this.runDir,
|
||||||
|
DOCKER_HOST: dockerHost
|
||||||
|
}) as {
|
||||||
|
[key: string]: string;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
proc.unref();
|
||||||
|
await retry(
|
||||||
|
async bail => {
|
||||||
|
await Exec.getExecOutput(`docker version`, undefined, {
|
||||||
|
ignoreReturnCode: true,
|
||||||
|
silent: true,
|
||||||
|
env: Object.assign({}, process.env, {
|
||||||
|
DOCKER_HOST: dockerHost
|
||||||
|
}) as {
|
||||||
|
[key: string]: string;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then(res => {
|
||||||
|
if (res.stderr.length > 0 && res.exitCode != 0) {
|
||||||
|
bail(new Error(res.stderr));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return res.exitCode == 0;
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
bail(error);
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{
|
||||||
|
retries: 5
|
||||||
|
}
|
||||||
|
);
|
||||||
|
core.info(`Docker daemon started started successfully`);
|
||||||
|
});
|
||||||
|
|
||||||
|
await core.group('Create Docker context', async () => {
|
||||||
|
await Exec.exec('docker', ['context', 'create', this.contextName, '--docker', `host=${dockerHost}`]);
|
||||||
|
await Exec.exec('docker', ['context', 'use', this.contextName]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private async installWindows(): Promise<void> {
|
||||||
|
const dockerHost = 'npipe:////./pipe/setup_docker_action';
|
||||||
|
|
||||||
|
await core.group('Install Docker daemon service', async () => {
|
||||||
|
const setupCmd = await Util.powershellCommand(setupDockerWinPs1(), {
|
||||||
|
ToolDir: this.toolDir,
|
||||||
|
RunDir: this.runDir,
|
||||||
|
DockerHost: dockerHost
|
||||||
|
});
|
||||||
|
await Exec.exec(setupCmd.command, setupCmd.args);
|
||||||
|
const logCmd = await Util.powershellCommand(dockerServiceLogsPs1());
|
||||||
|
await Exec.exec(logCmd.command, logCmd.args);
|
||||||
|
});
|
||||||
|
|
||||||
|
await core.group('Create Docker context', async () => {
|
||||||
|
await Exec.exec('docker', ['context', 'create', this.contextName, '--docker', `host=${dockerHost}`]);
|
||||||
|
await Exec.exec('docker', ['context', 'use', this.contextName]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public async tearDown(): Promise<void> {
|
||||||
|
if (!this.runDir) {
|
||||||
|
throw new Error('runDir must be set');
|
||||||
|
}
|
||||||
|
switch (os.platform()) {
|
||||||
|
case 'darwin': {
|
||||||
|
await this.tearDownDarwin();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'linux': {
|
||||||
|
await this.tearDownLinux();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'win32': {
|
||||||
|
await this.tearDownWindows();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
throw new Error(`Unsupported platform: ${os.platform()}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async tearDownDarwin(): Promise<void> {
|
||||||
|
await core.group('Docker daemon logs', async () => {
|
||||||
|
await Exec.exec('colima', ['exec', '--', 'cat', '/var/log/docker.log']);
|
||||||
|
});
|
||||||
|
await core.group('Stopping colima', async () => {
|
||||||
|
await Exec.exec('colima', ['stop', '--very-verbose']);
|
||||||
|
});
|
||||||
|
await core.group('Removing Docker context', async () => {
|
||||||
|
await Exec.exec('docker', ['context', 'rm', '-f', this.contextName]);
|
||||||
|
});
|
||||||
|
await core.group(`Cleaning up runDir`, async () => {
|
||||||
|
await Exec.exec('sudo', ['rm', '-rf', this.runDir]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private async tearDownLinux(): Promise<void> {
|
||||||
|
await core.group('Docker daemon logs', async () => {
|
||||||
|
core.info(fs.readFileSync(path.join(this.runDir, 'dockerd.log'), {encoding: 'utf8'}));
|
||||||
|
});
|
||||||
|
await core.group('Stopping Docker daemon', async () => {
|
||||||
|
await Exec.exec('sudo', ['kill', fs.readFileSync(path.join(this.runDir, 'docker.pid')).toString().trim()]);
|
||||||
|
});
|
||||||
|
await core.group('Removing Docker context', async () => {
|
||||||
|
await Exec.exec('docker', ['context', 'rm', '-f', this.contextName]);
|
||||||
|
});
|
||||||
|
await core.group(`Cleaning up runDir`, async () => {
|
||||||
|
await Exec.exec('sudo', ['rm', '-rf', this.runDir]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private async tearDownWindows(): Promise<void> {
|
||||||
|
await core.group('Docker daemon logs', async () => {
|
||||||
|
const logCmd = await Util.powershellCommand(dockerServiceLogsPs1());
|
||||||
|
await Exec.exec(logCmd.command, logCmd.args);
|
||||||
|
});
|
||||||
|
await core.group('Removing Docker context', async () => {
|
||||||
|
await Exec.exec('docker', ['context', 'rm', '-f', this.contextName]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private downloadURL(version: string, channel: string): string {
|
||||||
|
const platformOS = Install.platformOS();
|
||||||
|
const platformArch = Install.platformArch();
|
||||||
|
const ext = platformOS === 'win' ? '.zip' : '.tgz';
|
||||||
|
return util.format('https://download.docker.com/%s/static/%s/%s/docker-%s%s', platformOS, channel, platformArch, version, ext);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static platformOS(): string {
|
||||||
|
switch (os.platform()) {
|
||||||
|
case 'darwin': {
|
||||||
|
return 'mac';
|
||||||
|
}
|
||||||
|
case 'linux': {
|
||||||
|
return 'linux';
|
||||||
|
}
|
||||||
|
case 'win32': {
|
||||||
|
return 'win';
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
return os.platform();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static platformArch(): string {
|
||||||
|
switch (os.arch()) {
|
||||||
|
case 'x64': {
|
||||||
|
return 'x86_64';
|
||||||
|
}
|
||||||
|
case 'ppc64': {
|
||||||
|
return 'ppc64le';
|
||||||
|
}
|
||||||
|
case 'arm': {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
const arm_version = (process.config.variables as any).arm_version;
|
||||||
|
switch (arm_version) {
|
||||||
|
case 6: {
|
||||||
|
return 'armel';
|
||||||
|
}
|
||||||
|
case 7: {
|
||||||
|
return 'armhf';
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
return `v${arm_version}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
return os.arch();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static async colimaInstalled(): Promise<boolean> {
|
||||||
|
return await io
|
||||||
|
.which('colima', true)
|
||||||
|
.then(res => {
|
||||||
|
core.debug(`docker.Install.colimaAvailable ok: ${res}`);
|
||||||
|
return true;
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
core.debug(`docker.Install.colimaAvailable error: ${error}`);
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async getRelease(version: string): Promise<GitHubRelease> {
|
||||||
|
const url = `https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/docker-releases.json`;
|
||||||
|
const http: httpm.HttpClient = new httpm.HttpClient('docker-actions-toolkit');
|
||||||
|
const resp: httpm.HttpClientResponse = await http.get(url);
|
||||||
|
const body = await resp.readBody();
|
||||||
|
const statusCode = resp.message.statusCode || 500;
|
||||||
|
if (statusCode >= 400) {
|
||||||
|
throw new Error(`Failed to get Docker release ${version} from ${url} with status code ${statusCode}: ${body}`);
|
||||||
|
}
|
||||||
|
const releases = <Record<string, GitHubRelease>>JSON.parse(body);
|
||||||
|
if (!releases[version]) {
|
||||||
|
throw new Error(`Cannot find Docker release ${version} in ${url}`);
|
||||||
|
}
|
||||||
|
return releases[version];
|
||||||
|
}
|
||||||
|
}
|
||||||
78
src/git.ts
78
src/git.ts
@@ -15,21 +15,81 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import {Exec} from './exec';
|
import {Exec} from './exec';
|
||||||
|
import {Context} from '@actions/github/lib/context';
|
||||||
|
import {Context as GitContext} from './types/git';
|
||||||
|
|
||||||
export class Git {
|
export class Git {
|
||||||
public static async getRemoteSha(repo: string, ref: string): Promise<string> {
|
public static async context(): Promise<GitContext> {
|
||||||
return await Exec.getExecOutput(`git`, ['ls-remote', repo, ref], {
|
const ctx = new Context();
|
||||||
ignoreReturnCode: true,
|
ctx.ref = await Git.ref();
|
||||||
silent: true
|
ctx.sha = await Git.fullCommit();
|
||||||
}).then(res => {
|
return ctx;
|
||||||
if (res.stderr.length > 0 && res.exitCode != 0) {
|
}
|
||||||
throw new Error(res.stderr);
|
|
||||||
}
|
public static async isInsideWorkTree(): Promise<boolean> {
|
||||||
const [rsha] = res.stdout.trim().split(/[\s\t]/);
|
return await Git.exec(['rev-parse', '--is-inside-work-tree'])
|
||||||
|
.then(out => {
|
||||||
|
return out === 'true';
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async remoteSha(repo: string, ref: string): Promise<string> {
|
||||||
|
return await Git.exec(['ls-remote', repo, ref]).then(out => {
|
||||||
|
const [rsha] = out.split(/[\s\t]/);
|
||||||
if (rsha.length == 0) {
|
if (rsha.length == 0) {
|
||||||
throw new Error(`Cannot find remote ref for ${repo}#${ref}`);
|
throw new Error(`Cannot find remote ref for ${repo}#${ref}`);
|
||||||
}
|
}
|
||||||
return rsha;
|
return rsha;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async remoteURL(): Promise<string> {
|
||||||
|
return await Git.exec(['remote', 'get-url', 'origin']).then(rurl => {
|
||||||
|
if (rurl.length == 0) {
|
||||||
|
return Git.exec(['remote', 'get-url', 'upstream']).then(rurl => {
|
||||||
|
if (rurl.length == 0) {
|
||||||
|
throw new Error(`Cannot find remote URL for origin or upstream`);
|
||||||
|
}
|
||||||
|
return rurl;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return rurl;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async ref(): Promise<string> {
|
||||||
|
return await Git.exec(['symbolic-ref', 'HEAD']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async fullCommit(): Promise<string> {
|
||||||
|
return await Git.exec(['show', '--format=%H', 'HEAD', '--quiet', '--']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async shortCommit(): Promise<string> {
|
||||||
|
return await Git.exec(['show', '--format=%h', 'HEAD', '--quiet', '--']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async tag(): Promise<string> {
|
||||||
|
return await Git.exec(['tag', '--points-at', 'HEAD', '--sort', '-version:creatordate']).then(tags => {
|
||||||
|
if (tags.length == 0) {
|
||||||
|
return Git.exec(['describe', '--tags', '--abbrev=0']);
|
||||||
|
}
|
||||||
|
return tags.split('\n')[0];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static async exec(args: string[] = []): Promise<string> {
|
||||||
|
return await Exec.getExecOutput(`git`, args, {
|
||||||
|
ignoreReturnCode: true,
|
||||||
|
silent: true
|
||||||
|
}).then(res => {
|
||||||
|
if (res.stderr.length > 0 && res.exitCode != 0) {
|
||||||
|
throw new Error(res.stderr);
|
||||||
|
}
|
||||||
|
return res.stdout.trim();
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,16 +21,6 @@ export interface BuilderInfo {
|
|||||||
nodes: NodeInfo[];
|
nodes: NodeInfo[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface NodeInfo {
|
|
||||||
name?: string;
|
|
||||||
endpoint?: string;
|
|
||||||
driverOpts?: Array<string>;
|
|
||||||
status?: string;
|
|
||||||
buildkitdFlags?: string;
|
|
||||||
buildkitVersion?: string;
|
|
||||||
platforms?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Node {
|
export interface Node {
|
||||||
name?: string;
|
name?: string;
|
||||||
endpoint?: string;
|
endpoint?: string;
|
||||||
@@ -38,3 +28,8 @@ export interface Node {
|
|||||||
'buildkitd-flags'?: string;
|
'buildkitd-flags'?: string;
|
||||||
platforms?: string;
|
platforms?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface NodeInfo extends Node {
|
||||||
|
status?: string;
|
||||||
|
buildkit?: string;
|
||||||
|
}
|
||||||
|
|||||||
19
src/types/git.ts
Normal file
19
src/types/git.ts
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2023 actions-toolkit authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {Context as GitHubContext} from '@actions/github/lib/context';
|
||||||
|
|
||||||
|
export type Context = GitHubContext;
|
||||||
26
src/util.ts
26
src/util.ts
@@ -14,7 +14,9 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import fs from 'fs';
|
||||||
import * as core from '@actions/core';
|
import * as core from '@actions/core';
|
||||||
|
import * as io from '@actions/io';
|
||||||
import {parse} from 'csv-parse/sync';
|
import {parse} from 'csv-parse/sync';
|
||||||
|
|
||||||
export interface InputListOpts {
|
export interface InputListOpts {
|
||||||
@@ -71,4 +73,28 @@ export class Util {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async powershellCommand(script: string, params?: Record<string, string>) {
|
||||||
|
const powershellPath: string = await io.which('powershell', true);
|
||||||
|
const escapedScript = script.replace(/'/g, "''").replace(/"|\n|\r/g, '');
|
||||||
|
const escapedParams: string[] = [];
|
||||||
|
if (params) {
|
||||||
|
for (const key in params) {
|
||||||
|
escapedParams.push(`-${key} '${params[key].replace(/'/g, "''").replace(/"|\n|\r/g, '')}'`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
command: `"${powershellPath}"`,
|
||||||
|
args: ['-NoLogo', '-Sta', '-NoProfile', '-NonInteractive', '-ExecutionPolicy', 'Unrestricted', '-Command', `& '${escapedScript}' ${escapedParams.join(' ')}`]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static isDirectory(p) {
|
||||||
|
try {
|
||||||
|
return fs.lstatSync(p).isDirectory();
|
||||||
|
} catch (_) {
|
||||||
|
// noop
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,6 @@
|
|||||||
"./__tests__/**/*",
|
"./__tests__/**/*",
|
||||||
"./lib/**/*",
|
"./lib/**/*",
|
||||||
"node_modules",
|
"node_modules",
|
||||||
"jest.config.ts"
|
"jest.config*.ts"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
66
yarn.lock
66
yarn.lock
@@ -774,6 +774,7 @@ __metadata:
|
|||||||
"@types/tmp": ^0.2.3
|
"@types/tmp": ^0.2.3
|
||||||
"@typescript-eslint/eslint-plugin": ^5.49.0
|
"@typescript-eslint/eslint-plugin": ^5.49.0
|
||||||
"@typescript-eslint/parser": ^5.49.0
|
"@typescript-eslint/parser": ^5.49.0
|
||||||
|
async-retry: ^1.3.3
|
||||||
cpy-cli: ^4.2.0
|
cpy-cli: ^4.2.0
|
||||||
csv-parse: ^5.3.5
|
csv-parse: ^5.3.5
|
||||||
dotenv: ^16.0.3
|
dotenv: ^16.0.3
|
||||||
@@ -782,6 +783,7 @@ __metadata:
|
|||||||
eslint-plugin-import: ^2.27.5
|
eslint-plugin-import: ^2.27.5
|
||||||
eslint-plugin-jest: ^26.9.0
|
eslint-plugin-jest: ^26.9.0
|
||||||
eslint-plugin-prettier: ^4.2.1
|
eslint-plugin-prettier: ^4.2.1
|
||||||
|
handlebars: ^4.7.7
|
||||||
jest: ^27.5.1
|
jest: ^27.5.1
|
||||||
jwt-decode: ^3.1.2
|
jwt-decode: ^3.1.2
|
||||||
prettier: ^2.8.3
|
prettier: ^2.8.3
|
||||||
@@ -2033,6 +2035,15 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"async-retry@npm:^1.3.3":
|
||||||
|
version: 1.3.3
|
||||||
|
resolution: "async-retry@npm:1.3.3"
|
||||||
|
dependencies:
|
||||||
|
retry: 0.13.1
|
||||||
|
checksum: 38a7152ff7265a9321ea214b9c69e8224ab1febbdec98efbbde6e562f17ff68405569b796b1c5271f354aef8783665d29953f051f68c1fc45306e61aec82fdc4
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"asynckit@npm:^0.4.0":
|
"asynckit@npm:^0.4.0":
|
||||||
version: 0.4.0
|
version: 0.4.0
|
||||||
resolution: "asynckit@npm:0.4.0"
|
resolution: "asynckit@npm:0.4.0"
|
||||||
@@ -3667,6 +3678,24 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"handlebars@npm:^4.7.7":
|
||||||
|
version: 4.7.7
|
||||||
|
resolution: "handlebars@npm:4.7.7"
|
||||||
|
dependencies:
|
||||||
|
minimist: ^1.2.5
|
||||||
|
neo-async: ^2.6.0
|
||||||
|
source-map: ^0.6.1
|
||||||
|
uglify-js: ^3.1.4
|
||||||
|
wordwrap: ^1.0.0
|
||||||
|
dependenciesMeta:
|
||||||
|
uglify-js:
|
||||||
|
optional: true
|
||||||
|
bin:
|
||||||
|
handlebars: bin/handlebars
|
||||||
|
checksum: 1e79a43f5e18d15742977cb987923eab3e2a8f44f2d9d340982bcb69e1735ed049226e534d7c1074eaddaf37e4fb4f471a8adb71cddd5bc8cf3f894241df5cee
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"hard-rejection@npm:^2.1.0":
|
"hard-rejection@npm:^2.1.0":
|
||||||
version: 2.1.0
|
version: 2.1.0
|
||||||
resolution: "hard-rejection@npm:2.1.0"
|
resolution: "hard-rejection@npm:2.1.0"
|
||||||
@@ -5144,6 +5173,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"minimist@npm:^1.2.5":
|
||||||
|
version: 1.2.8
|
||||||
|
resolution: "minimist@npm:1.2.8"
|
||||||
|
checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"minipass-collect@npm:^1.0.2":
|
"minipass-collect@npm:^1.0.2":
|
||||||
version: 1.0.2
|
version: 1.0.2
|
||||||
resolution: "minipass-collect@npm:1.0.2"
|
resolution: "minipass-collect@npm:1.0.2"
|
||||||
@@ -5267,6 +5303,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"neo-async@npm:^2.6.0":
|
||||||
|
version: 2.6.2
|
||||||
|
resolution: "neo-async@npm:2.6.2"
|
||||||
|
checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"nested-error-stacks@npm:^2.0.0, nested-error-stacks@npm:^2.1.0":
|
"nested-error-stacks@npm:^2.0.0, nested-error-stacks@npm:^2.1.0":
|
||||||
version: 2.1.1
|
version: 2.1.1
|
||||||
resolution: "nested-error-stacks@npm:2.1.1"
|
resolution: "nested-error-stacks@npm:2.1.1"
|
||||||
@@ -5914,6 +5957,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"retry@npm:0.13.1":
|
||||||
|
version: 0.13.1
|
||||||
|
resolution: "retry@npm:0.13.1"
|
||||||
|
checksum: 47c4d5be674f7c13eee4cfe927345023972197dbbdfba5d3af7e461d13b44de1bfd663bfc80d2f601f8ef3fc8164c16dd99655a221921954a65d044a2fc1233b
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"retry@npm:^0.12.0":
|
"retry@npm:^0.12.0":
|
||||||
version: 0.12.0
|
version: 0.12.0
|
||||||
resolution: "retry@npm:0.12.0"
|
resolution: "retry@npm:0.12.0"
|
||||||
@@ -6694,6 +6744,15 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"uglify-js@npm:^3.1.4":
|
||||||
|
version: 3.17.4
|
||||||
|
resolution: "uglify-js@npm:3.17.4"
|
||||||
|
bin:
|
||||||
|
uglifyjs: bin/uglifyjs
|
||||||
|
checksum: 7b3897df38b6fc7d7d9f4dcd658599d81aa2b1fb0d074829dd4e5290f7318dbca1f4af2f45acb833b95b1fe0ed4698662ab61b87e94328eb4c0a0d3435baf924
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"unbox-primitive@npm:^1.0.2":
|
"unbox-primitive@npm:^1.0.2":
|
||||||
version: 1.0.2
|
version: 1.0.2
|
||||||
resolution: "unbox-primitive@npm:1.0.2"
|
resolution: "unbox-primitive@npm:1.0.2"
|
||||||
@@ -6939,6 +6998,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"wordwrap@npm:^1.0.0":
|
||||||
|
version: 1.0.0
|
||||||
|
resolution: "wordwrap@npm:1.0.0"
|
||||||
|
checksum: 2a44b2788165d0a3de71fd517d4880a8e20ea3a82c080ce46e294f0b68b69a2e49cff5f99c600e275c698a90d12c5ea32aff06c311f0db2eb3f1201f3e7b2a04
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"wrap-ansi@npm:^7.0.0":
|
"wrap-ansi@npm:^7.0.0":
|
||||||
version: 7.0.0
|
version: 7.0.0
|
||||||
resolution: "wrap-ansi@npm:7.0.0"
|
resolution: "wrap-ansi@npm:7.0.0"
|
||||||
|
|||||||
Reference in New Issue
Block a user