From a59fa00b1cd6d380e96e9ff30d560106939a7e15 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Sat, 25 Oct 2025 12:13:25 -0700 Subject: [PATCH] ci: building manifests for docker --- scripts/release/docker.ts | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/scripts/release/docker.ts b/scripts/release/docker.ts index 1b9dcb98f9..ac5dbd9901 100644 --- a/scripts/release/docker.ts +++ b/scripts/release/docker.ts @@ -11,41 +11,45 @@ export async function tagDocker(opts: { latest: boolean; }) { for (const { name, prefix, main } of REPOS) { - // Check image exists - console.log(`==> Pulling: ${name}:${prefix}-${opts.commit}`); + // Check both architecture images exist using manifest inspect + console.log(`==> Checking images exist: ${name}:${prefix}-${opts.commit}-{amd64,arm64}`); try { - await $({ - stdout: "ignore", - stderr: "ignore", - })`docker pull --platform amd64 ${name}:${prefix}-${opts.commit}`; + console.log(`==> Inspecting ${name}:${prefix}-${opts.commit}-amd64`); + await $`docker manifest inspect ${name}:${prefix}-${opts.commit}-amd64`; + console.log(`==> Inspecting ${name}:${prefix}-${opts.commit}-arm64`); + await $`docker manifest inspect ${name}:${prefix}-${opts.commit}-arm64`; + console.log(`==> Both images exist`); } catch (error) { + console.error(`==> Error inspecting images:`, error); throw new Error( - `Image ${name}:${prefix}-${opts.commit} does not exist on Docker Hub.`, + `Images ${name}:${prefix}-${opts.commit}-{amd64,arm64} do not exist on Docker Hub. Error: ${error}`, ); } - // Tag with version - await tag( + // Create and push manifest with version + await createManifest( name, `${prefix}-${opts.commit}`, `${prefix}-${opts.version}`, ); if (main) { - await tag(name, `${prefix}-${opts.commit}`, opts.version); + await createManifest(name, `${prefix}-${opts.commit}`, opts.version); } - // Tag with latest + // Create and push manifest with latest if (opts.latest) { - await tag(name, `${prefix}-${opts.commit}`, `${prefix}-latest`); + await createManifest(name, `${prefix}-${opts.commit}`, `${prefix}-latest`); if (main) { - await tag(name, `${prefix}-${opts.commit}`, "latest"); + await createManifest(name, `${prefix}-${opts.commit}`, "latest"); } } } } -async function tag(image: string, from: string, to: string) { - console.log(`==> Tagging: ${image}:${from} -> ${image}:${to}`); - await $`docker tag ${image}:${from} ${image}:${to}`; - await $`docker push ${image}:${to}`; +async function createManifest(image: string, from: string, to: string) { + console.log(`==> Creating manifest: ${image}:${to} from ${image}:${from}-{amd64,arm64}`); + + // Use buildx imagetools to create and push multi-arch manifest + // This works with manifest lists as inputs (unlike docker manifest create) + await $`docker buildx imagetools create --tag ${image}:${to} ${image}:${from}-amd64 ${image}:${from}-arm64`; }