fix: rebuild missing v03 env reuse images

This commit is contained in:
root
2026-06-12 19:14:02 +00:00
parent da0ca25152
commit 42b68db978
4 changed files with 182 additions and 9 deletions
+69
View File
@@ -132,6 +132,75 @@ test("v02 planner rebuilds env image when an env reuse catalog digest is missing
assert.deepEqual(cloudApi.reason, ["environment-input-changed"]);
});
test("v03 planner rebuilds env image when catalog env input hash is stale", async () => {
const repo = await createFixtureRepo();
const initialSha = (await git(repo, ["rev-parse", "HEAD"])).stdout.trim();
const initialPlan = await createCiPlan({
repoRoot: repo,
lane: "v03",
baseRef: "HEAD",
targetRef: initialSha,
artifactCatalogPath: "deploy/artifact-catalog.v03.json",
services: ["hwlab-cloud-api"]
});
const catalog = createCatalogFixture("ready", catalogOptionsFromPlan(initialPlan, { sourceCommitId: initialSha }));
catalog.services.find((service) => service.serviceId === "hwlab-cloud-api").environmentInputHash = "stale-environment-input";
await writeFile(path.join(repo, "deploy/artifact-catalog.v03.json"), JSON.stringify(catalog, null, 2));
await git(repo, ["add", "deploy/artifact-catalog.v03.json"]);
await git(repo, ["commit", "-m", "seed stale v03 env catalog"]);
const plan = await createCiPlan({
repoRoot: repo,
lane: "v03",
baseRef: "HEAD~1",
targetRef: "HEAD",
artifactCatalogPath: "deploy/artifact-catalog.v03.json",
services: ["hwlab-cloud-api"]
});
const cloudApi = plan.services.find((service) => service.serviceId === "hwlab-cloud-api");
assert.equal(cloudApi.buildRequired, true);
assert.equal(cloudApi.environmentInputChanged, true);
assert.deepEqual(cloudApi.reason, ["environment-input-mismatch"]);
assert.deepEqual(plan.buildServices, ["hwlab-cloud-api"]);
});
test("v03 planner rebuilds env image when target registry lacks reused digest", async () => {
const repo = await createFixtureRepo();
const initialSha = (await git(repo, ["rev-parse", "HEAD"])).stdout.trim();
const initialPlan = await createCiPlan({
repoRoot: repo,
lane: "v03",
baseRef: "HEAD",
targetRef: initialSha,
artifactCatalogPath: "deploy/artifact-catalog.v03.json",
services: ["hwlab-cloud-api"]
});
await writeFile(path.join(repo, "deploy/artifact-catalog.v03.json"), JSON.stringify(createCatalogFixture("ready", catalogOptionsFromPlan(initialPlan, { sourceCommitId: initialSha })), null, 2));
await git(repo, ["add", "deploy/artifact-catalog.v03.json"]);
await git(repo, ["commit", "-m", "seed fresh v03 catalog"]);
await mkdir(path.join(repo, "deploy/gitops/node/d601/runtime-v03"), { recursive: true });
await writeFile(path.join(repo, "deploy/gitops/node/d601/runtime-v03/workloads.yaml"), "kind: List\nitems: []\n");
await git(repo, ["add", "."]);
await git(repo, ["commit", "-m", "change generated gitops after fresh catalog"]);
const plan = await createCiPlan({
repoRoot: repo,
lane: "v03",
baseRef: "HEAD~1",
targetRef: "HEAD",
artifactCatalogPath: "deploy/artifact-catalog.v03.json",
services: ["hwlab-cloud-api"],
verifyReuseRegistry: true,
reuseRegistryProbe: async () => ({ status: "missing", method: "HEAD", statusCode: 404 })
});
const cloudApi = plan.services.find((service) => service.serviceId === "hwlab-cloud-api");
assert.equal(cloudApi.buildRequired, true);
assert.equal(cloudApi.reuseRegistry.status, "missing");
assert.deepEqual(cloudApi.reason, ["reuse-registry-missing"]);
assert.deepEqual(plan.buildServices, ["hwlab-cloud-api"]);
});
test("artifact reuse paths preserve catalog provenance instead of current planner provenance", async () => {
const artifactPublish = await readFile("scripts/artifact-publish.mjs", "utf8");
assert.match(artifactPublish, /downloadDependencyScript/u);