diff --git a/scripts/g14-ci-plan.test.mjs b/scripts/g14-ci-plan.test.mjs index e1a6cc0a..fda0d9e7 100644 --- a/scripts/g14-ci-plan.test.mjs +++ b/scripts/g14-ci-plan.test.mjs @@ -253,6 +253,53 @@ test("planner scopes cloud-web runtime changes to cloud-web", async () => { assert.deepEqual(cloudWeb.reason, ["component-path-changed"]); }); +test("v02 planner treats shared trace renderer changes as cloud-web code rollout inputs", async () => { + const repo = await createFixtureRepo(); + const initialSha = (await git(repo, ["rev-parse", "HEAD"])).stdout.trim(); + const initialPlan = await createG14CiPlan({ + repoRoot: repo, + lane: "v02", + baseRef: "HEAD", + targetRef: initialSha, + artifactCatalogPath: "deploy/artifact-catalog.v02.json", + services: ["hwlab-cloud-api", "hwlab-cloud-web"] + }); + const initialCloudWeb = initialPlan.services.find((service) => service.serviceId === "hwlab-cloud-web"); + const initialHashes = Object.fromEntries(initialPlan.services.map((service) => [service.serviceId, service.componentInputHash])); + await writeFile(path.join(repo, "deploy/artifact-catalog.v02.json"), JSON.stringify(createCatalogFixture("ready", { + sourceCommitId: initialPlan.sourceCommitId, + componentInputHashes: initialHashes, + cloudWebEnvironmentInputHash: initialCloudWeb.environmentInputHash, + cloudWebCodeInputHash: initialCloudWeb.codeInputHash, + cloudWebBootCommit: initialPlan.sourceCommitId + }), null, 2)); + await git(repo, ["add", "deploy/artifact-catalog.v02.json"]); + await git(repo, ["commit", "-m", "seed v02 catalog with trace renderer"]); + + await mkdir(path.join(repo, "tools/src/hwlab-cli"), { recursive: true }); + await writeFile(path.join(repo, "tools/src/hwlab-cli/trace-renderer.ts"), "export const traceRenderer = 2;\n"); + await git(repo, ["add", "tools/src/hwlab-cli/trace-renderer.ts"]); + await git(repo, ["commit", "-m", "change shared trace renderer"]); + + const plan = await createG14CiPlan({ + repoRoot: repo, + lane: "v02", + baseRef: "HEAD~1", + targetRef: "HEAD", + artifactCatalogPath: "deploy/artifact-catalog.v02.json", + services: ["hwlab-cloud-api", "hwlab-cloud-web"] + }); + const cloudApi = plan.services.find((service) => service.serviceId === "hwlab-cloud-api"); + const cloudWeb = plan.services.find((service) => service.serviceId === "hwlab-cloud-web"); + assert.deepEqual(plan.affectedServices, ["hwlab-cloud-web"]); + assert.deepEqual(plan.rolloutServices, ["hwlab-cloud-web"]); + assert.deepEqual(plan.buildServices, []); + assert.equal(cloudApi.affected, false); + assert.equal(cloudWeb.codeChanged, true); + assert.deepEqual(cloudWeb.codeChangedPaths, ["tools/src/hwlab-cli/trace-renderer.ts"]); + assert.deepEqual(cloudWeb.reason, ["code-input-changed", "component-path-changed"]); +}); + test("planner ignores package script cleanup for runtime images", async () => { const repo = await createFixtureRepo(); await writeFile(path.join(repo, "package.json"), JSON.stringify({ diff --git a/scripts/src/g14-ci-plan-lib.mjs b/scripts/src/g14-ci-plan-lib.mjs index ea1127bb..4147f634 100644 --- a/scripts/src/g14-ci-plan-lib.mjs +++ b/scripts/src/g14-ci-plan-lib.mjs @@ -86,7 +86,8 @@ const serviceSpecificPaths = Object.freeze({ "web/hwlab-cloud-web/", "internal/dev-entrypoint/cloud-web-runtime.mjs", "internal/dev-entrypoint/cloud-web-proxy.mjs", - "internal/dev-entrypoint/cloud-web-routes.mjs" + "internal/dev-entrypoint/cloud-web-routes.mjs", + "tools/src/hwlab-cli/trace-renderer.ts" ], "hwlab-gateway": ["cmd/hwlab-gateway/"], "hwlab-edge-proxy": ["cmd/hwlab-edge-proxy/", "internal/dev-entrypoint/http.mjs"],