fix: use RootlessKit for sentinel BuildKit readiness

This commit is contained in:
Codex
2026-07-13 16:53:33 +02:00
parent b24a6b8ca8
commit 912898a0ff
2 changed files with 29 additions and 9 deletions
@@ -761,7 +761,7 @@ export function sentinelPublishImageBuildShell(state: SentinelCicdState, jobName
"buildkit_log=/workspace/buildkitd.log",
"mkdir -p \"$(dirname \"$buildkit_socket\")\"",
"rm -f \"$buildkit_socket\"",
"buildkitd --addr \"$buildkit_address\" ${BUILDKITD_FLAGS:-} > \"$buildkit_log\" 2>&1 &",
"rootlesskit buildkitd --addr \"$buildkit_address\" ${BUILDKITD_FLAGS:-} > \"$buildkit_log\" 2>&1 &",
"buildkitd_pid=$!",
"buildkit_ready=false",
"buildkit_probe_attempt=0",
@@ -1,7 +1,10 @@
import { describe, expect, test } from "bun:test";
import { spawnSync } from "node:child_process";
import { readFileSync } from "node:fs";
import { resolve } from "node:path";
import { createRequire } from "node:module";
import { sentinelPublishImageBuildShell } from "./hwlab-node-web-sentinel-cicd-jobs";
import type { SentinelCicdState } from "./hwlab-node-web-sentinel-cicd-shared";
import { compactHistoryJson, compactStatusSummary, renderDebugStep, renderHistory, renderStatus } from "./platform-infra-pipelines-as-code";
const require = createRequire(import.meta.url);
@@ -58,13 +61,30 @@ describe("PaC 失败证据合同", () => {
});
test("sentinel image build 显式等待 socket 与 worker readiness 并清理 daemon", () => {
const source = readFileSync(resolve(import.meta.dir, "hwlab-node-web-sentinel-cicd-jobs.ts"), "utf8");
expect(source).toContain("mkdir -p \\\"$(dirname \\\"$buildkit_socket\\\")\\\"");
expect(source).toContain("buildkitd --addr");
expect(source).toContain("debug workers");
expect(source).toContain("failure_error_type=BuildKitReadinessError");
expect(source).toContain("failure_error_code=BUILDKIT_NOT_READY");
expect(source).toContain("cleanup_buildkitd");
expect(source).not.toContain("buildctl-daemonless.sh build");
const shell = sentinelPublishImageBuildShell({
spec: {
nodeId: "NC01",
lane: "v03",
buildkit: { sidecarImage: "moby/buildkit:rootless" },
networkProfile: { imageBuildProxy: { http: "", https: "", all: "", noProxy: [] } },
},
image: {
ref: "registry.example.test/web-probe-sentinel:test",
monitorWeb: {
imageBuildPackageMode: "frozen-lockfile",
imageBuildNetworkMode: "host",
imageBuildProxySource: "test",
},
},
} as unknown as SentinelCicdState, "sentinel-test");
expect(shell).toContain("mkdir -p \"$(dirname \"$buildkit_socket\")\"");
expect(shell).toContain("rootlesskit buildkitd --addr");
expect(shell).not.toMatch(/(^|\n)buildkitd --addr/);
expect(shell).toContain("debug workers");
expect(shell).toContain("failure_error_type=BuildKitReadinessError");
expect(shell).toContain("failure_error_code=BUILDKIT_NOT_READY");
expect(shell).toContain("cleanup_buildkitd");
expect(shell).not.toContain("buildctl-daemonless.sh build");
expect(spawnSync("sh", ["-n"], { input: shell, encoding: "utf8" })).toMatchObject({ status: 0, stderr: "" });
});
});