Merge pull request #2407 from pikasTech/fix/env-reuse-existing-artifact

fix: rebuild missing env reuse artifacts
This commit is contained in:
Lyon
2026-07-06 22:07:51 +08:00
committed by GitHub
2 changed files with 39 additions and 3 deletions
+35
View File
@@ -286,6 +286,41 @@ test("v03 planner reuses current env hash tag when registry already has it", asy
assert.deepEqual(plan.buildServices, []);
});
test("v03 planner rebuilds when hash metadata drifts and registry lacks reusable env image", 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"],
verifyReuseRegistry: true,
reuseRegistryProbe: async () => ({ status: "missing", method: "HEAD", statusCode: 404 })
});
const cloudApi = plan.services.find((service) => service.serviceId === "hwlab-cloud-api");
assert.equal(cloudApi.environmentInputChanged, true);
assert.equal(cloudApi.envChanged, true);
assert.equal(cloudApi.buildRequired, true);
assert.equal(cloudApi.reuseRegistry.status, "missing");
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();
+4 -3
View File
@@ -256,12 +256,13 @@ export async function createCiPlan(options = {}) {
serviceId: model.serviceId,
config: runtimeReuseByService.get(model.serviceId) ?? null
});
const affected = runtimeReuseDecision.runtimeReuseHit === true
const reuseArtifactReady = !envReuse || environmentReady === true;
const affected = runtimeReuseDecision.runtimeReuseHit === true && reuseArtifactReady
? false
: runtimeReuseDecision.envReuseHit === true
: runtimeReuseDecision.envReuseHit === true && reuseArtifactReady
? runtimeReuseDecision.sourceIdentityHit === false || runtimeConfigChanged === true
: plannedAffected;
const buildRequired = runtimeReuseDecision.skipImageBuild === true ? false : plannedBuildRequired;
const buildRequired = runtimeReuseDecision.skipImageBuild === true && reuseArtifactReady ? false : plannedBuildRequired;
services.push({
serviceId: model.serviceId,
runtimeKind: model.runtimeKind,