Merge pull request #1940 from pikasTech/fix/1923-cicd-rootlesskit-readiness
Pipelines as Code CI / hwlab-web-probe-sentinel-nc01- Failed
Pipelines as Code CI / platform-infra-gitea-nc01- Success
Pipelines as Code CI / unidesk-host- Success

修正 Web sentinel rootless BuildKit 启动合同
This commit is contained in:
Lyon
2026-07-13 23:02:19 +08:00
committed by GitHub
3 changed files with 33 additions and 9 deletions
@@ -34,3 +34,7 @@
### R3.2 [in_progress]
基于真实自动事件 `hwlab-web-probe-sentinel-nc01-bbjv2` 修复 BuildKit daemon 已启动但 readiness 重试提前耗尽的竞争,并让 PaC `history/debug-step/status` 从失败 TaskRun 日志默认有界投影 traceId、首断点、阶段、error type/code/exit 与精确下钻;不得以人工 PipelineRun、锁/租约或吞掉失败缓解,使用下一次普通 PR merge 自动事件证明业务成功且 Tempo 可按同一 traceId 查询,完成任务后将详细报告写入[任务报告](./details/observability-trace-reliability/R3.2_Task_Report.md)。
### R3.3 [in_progress]
基于真实自动事件 `hwlab-web-probe-sentinel-nc01-czhg5` 修复 `moby/buildkit:rootless` 启动合同:显式通过 RootlessKit 启动 buildkitd,保留 socket + worker readiness、有界 TERM/KILL/wait 与 typed 失败投影;禁止退回短连接重试、人工 PipelineRun 或第二 authority,使用下一次普通 PR merge 自动事件证明 image build、GitOps/Argo/runtime 成功且 Tempo 可按同一 traceId 查询,完成任务后将详细报告写入[任务报告](./details/observability-trace-reliability/R3.3_Task_Report.md)。
@@ -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: "" });
});
});