Repository navigation
Expand file tree
/
Copy pathdocker.ts
More file actions
88 lines (80 loc) · 2.7 KB
/
Copy pathdocker.ts
File metadata and controls
88 lines (80 loc) · 2.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import { $ } from "execa";
import type { ReleaseOpts } from "./main";
import { fetchGitRef, versionOrCommitToRef } from "./utils";
const IMAGE = "rivetdev/sandbox-agent";
export async function tagDocker(opts: ReleaseOpts) {
// Determine which commit to use for source images
let sourceCommit = opts.commit;
if (opts.reuseEngineVersion) {
console.log(`==> Reusing Docker images from ${opts.reuseEngineVersion}`);
const ref = versionOrCommitToRef(opts.reuseEngineVersion);
await fetchGitRef(ref);
const result = await $`git rev-parse ${ref}`;
sourceCommit = result.stdout.trim().slice(0, 7);
console.log(`==> Source commit: ${sourceCommit}`);
}
try {
await ensureArchImagesExist(sourceCommit, "");
} catch (_error) {
console.warn(
`⚠️ Docker images ${IMAGE}:${sourceCommit}-{amd64,arm64} not found - skipping Docker tagging`,
);
console.warn(
` To enable Docker tagging, build and push images first, then retry the release.`,
);
return;
}
await createManifest(sourceCommit, opts.version);
if (opts.latest) {
await createManifest(sourceCommit, "latest");
await createManifest(sourceCommit, opts.minorVersionChannel);
}
try {
await ensureArchImagesExist(sourceCommit, "-full");
await createManifest(sourceCommit, `${opts.version}-full`, "-full");
if (opts.latest) {
await createManifest(
sourceCommit,
`${opts.minorVersionChannel}-full`,
"-full",
);
await createManifest(sourceCommit, "full", "-full");
}
} catch (_error) {
console.warn(
`⚠️ Full Docker images ${IMAGE}:${sourceCommit}-full-{amd64,arm64} not found - skipping full Docker tagging`,
);
console.warn(
` To enable full Docker tagging, build and push full images first, then retry the release.`,
);
}
}
async function ensureArchImagesExist(
sourceCommit: string,
variantSuffix: "" | "-full",
) {
console.log(
`==> Checking images exist: ${IMAGE}:${sourceCommit}${variantSuffix}-{amd64,arm64}`,
);
console.log(`==> Inspecting ${IMAGE}:${sourceCommit}${variantSuffix}-amd64`);
await $({
stdio: "inherit",
})`docker manifest inspect ${IMAGE}:${sourceCommit}${variantSuffix}-amd64`;
console.log(`==> Inspecting ${IMAGE}:${sourceCommit}${variantSuffix}-arm64`);
await $({
stdio: "inherit",
})`docker manifest inspect ${IMAGE}:${sourceCommit}${variantSuffix}-arm64`;
console.log(`==> Both images exist`);
}
async function createManifest(
from: string,
to: string,
variantSuffix: "" | "-full" = "",
) {
console.log(
`==> Creating manifest: ${IMAGE}:${to} from ${IMAGE}:${from}${variantSuffix}-{amd64,arm64}`,
);
await $({
stdio: "inherit",
})`docker buildx imagetools create --tag ${IMAGE}:${to} ${IMAGE}:${from}${variantSuffix}-amd64 ${IMAGE}:${from}${variantSuffix}-arm64`;
}