Remove repo reports and add recurrence guard
This commit is contained in:
@@ -17,6 +17,16 @@ import {
|
||||
|
||||
const execFileAsync = promisify(execFile);
|
||||
const repoRoot = path.resolve(path.dirname(new URL(import.meta.url).pathname), "../..");
|
||||
const tempReportRoot = "/tmp/hwlab-dev-gate";
|
||||
const artifactReportFixturePath = path.join(tempReportRoot, "dev-artifacts.json");
|
||||
|
||||
function tempReport(name) {
|
||||
return path.join(tempReportRoot, name);
|
||||
}
|
||||
|
||||
function stateReport(repoRoot, name) {
|
||||
return path.join(repoRoot, ".state/test-reports", name);
|
||||
}
|
||||
|
||||
function iso(offsetMs = 0) {
|
||||
return new Date(Date.parse("2026-05-23T08:00:00.000Z") + offsetMs).toISOString();
|
||||
@@ -51,7 +61,7 @@ async function makeRepo(options = {}) {
|
||||
const commitId = options.commitId ?? "abc1234";
|
||||
const repoRoot = await fsTempDir();
|
||||
await mkdir(path.join(repoRoot, "deploy/k8s/base"), { recursive: true });
|
||||
await mkdir(path.join(repoRoot, "reports/dev-gate"), { recursive: true });
|
||||
await mkdir(tempReportRoot, { recursive: true });
|
||||
await writeFile(
|
||||
path.join(repoRoot, "deploy/deploy.json"),
|
||||
`${JSON.stringify({
|
||||
@@ -92,7 +102,7 @@ async function makeRepo(options = {}) {
|
||||
publish: {
|
||||
ciPublished: true,
|
||||
registryVerified: true,
|
||||
provenance: "reports/dev-gate/dev-artifacts.json"
|
||||
provenance: "ci-artifact:dev-artifacts.json"
|
||||
},
|
||||
services: [
|
||||
{
|
||||
@@ -121,7 +131,7 @@ async function makeRepo(options = {}) {
|
||||
}, null, 2)}\n`
|
||||
);
|
||||
await writeFile(
|
||||
path.join(repoRoot, "reports/dev-gate/dev-artifacts.json"),
|
||||
artifactReportFixturePath,
|
||||
`${JSON.stringify({
|
||||
reportVersion: "v1",
|
||||
taskId: "dev-artifact-publish",
|
||||
@@ -211,7 +221,7 @@ function makeRunCommand({
|
||||
"deploy/artifact-catalog.dev.json",
|
||||
"deploy/deploy.json",
|
||||
"deploy/k8s/base/workloads.yaml",
|
||||
"reports/dev-gate/dev-artifacts.json"
|
||||
"ci-artifact:dev-artifacts.json"
|
||||
],
|
||||
desiredStatePromotionStatus = "pass",
|
||||
runtimeJobLogSuffix = "",
|
||||
@@ -469,7 +479,7 @@ test("dev-cd status and dry-run are read-only compact JSON", async () => {
|
||||
"--dry-run",
|
||||
"--kubeconfig",
|
||||
"/etc/rancher/k3s/k3s.yaml",
|
||||
"--write-report"
|
||||
"--report", stateReport(repoRoot, "dev-cd-apply.json")
|
||||
], {
|
||||
repoRoot,
|
||||
env: {},
|
||||
@@ -490,7 +500,7 @@ test("dev-cd status and dry-run are read-only compact JSON", async () => {
|
||||
assert.equal(status.live.summary.checked, 2);
|
||||
assertNoReadOnlySideEffects(commandLog);
|
||||
await assert.rejects(
|
||||
readFile(path.join(repoRoot, "reports/dev-gate/dev-cd-apply.json"), "utf8"),
|
||||
readFile(stateReport(repoRoot, "dev-cd-apply.json"), "utf8"),
|
||||
{ code: "ENOENT" }
|
||||
);
|
||||
});
|
||||
@@ -664,7 +674,7 @@ test("dev-cd status degrades artifact merge provenance when catalog/report do no
|
||||
kind: "hwlab-artifact-catalog",
|
||||
commitId: "9999999",
|
||||
artifactState: "published",
|
||||
publish: { ciPublished: true, registryVerified: true, provenance: "reports/dev-gate/dev-artifacts.json" },
|
||||
publish: { ciPublished: true, registryVerified: true, provenance: "ci-artifact:dev-artifacts.json" },
|
||||
services: []
|
||||
}, null, 2)}\n`
|
||||
);
|
||||
@@ -705,7 +715,7 @@ test("dev-cd status degrades artifact merge provenance when catalog/report do no
|
||||
test("apply stops before lock acquisition when artifact merge provenance mismatches deploy-json promotion", async () => {
|
||||
const repoRoot = await makeRepo({ commitId: "abc1234" });
|
||||
await writeFile(
|
||||
path.join(repoRoot, "reports/dev-gate/dev-artifacts.json"),
|
||||
artifactReportFixturePath,
|
||||
`${JSON.stringify({
|
||||
status: "published",
|
||||
commitId: "9999999",
|
||||
@@ -1036,7 +1046,7 @@ test("apply preflight passes with D601 native k3s and required SecretRef keys be
|
||||
"task-preflight-pass",
|
||||
"--kubeconfig",
|
||||
"/etc/rancher/k3s/k3s.yaml",
|
||||
"--write-report",
|
||||
"--report", stateReport(repoRoot, "dev-cd-apply.json"),
|
||||
"--full-output"
|
||||
], {
|
||||
repoRoot,
|
||||
@@ -1088,7 +1098,7 @@ test("apply preflight blocks missing SecretRef before Lease or side-effect comma
|
||||
"task-missing-secret",
|
||||
"--kubeconfig",
|
||||
"/etc/rancher/k3s/k3s.yaml",
|
||||
"--write-report"
|
||||
"--report", stateReport(repoRoot, "dev-cd-apply.json")
|
||||
], {
|
||||
repoRoot,
|
||||
env: {},
|
||||
@@ -1105,7 +1115,7 @@ test("apply preflight blocks missing SecretRef before Lease or side-effect comma
|
||||
});
|
||||
|
||||
const summary = JSON.parse(output);
|
||||
const writtenReport = JSON.parse(await readFile(path.join(repoRoot, "reports/dev-gate/dev-cd-apply.json"), "utf8"));
|
||||
const writtenReport = JSON.parse(await readFile(stateReport(repoRoot, "dev-cd-apply.json"), "utf8"));
|
||||
assert.equal(code, 2);
|
||||
assert.equal(summary.status, "blocked");
|
||||
assert.equal(summary.preflight.status, "blocked");
|
||||
@@ -1230,7 +1240,7 @@ test("transaction runs phases, allows internal side-effect env, releases lock, a
|
||||
"task-b",
|
||||
"--kubeconfig",
|
||||
"/etc/rancher/k3s/k3s.yaml",
|
||||
"--write-report",
|
||||
"--report", stateReport(repoRoot, "dev-cd-apply.json"),
|
||||
"--full-output"
|
||||
], {
|
||||
repoRoot,
|
||||
@@ -1270,10 +1280,10 @@ test("transaction runs phases, allows internal side-effect env, releases lock, a
|
||||
assert.equal(report.devCdApply.liveVerify.summary.checked, 2);
|
||||
assert.equal(report.devCdApply.liveVerify.endpoints.some((endpoint) => endpoint.id === "cloud-web-16666"), true);
|
||||
assert.equal(report.devCdApply.liveVerify.endpoints.some((endpoint) => endpoint.id === "cloud-api-16667"), true);
|
||||
assert.equal(report.devCdApply.reportPaths.transaction, "reports/dev-gate/dev-cd-apply.json");
|
||||
assert.equal(report.devCdApply.reportPaths.runtimeProvisioning, "reports/dev-gate/dev-runtime-provisioning-report.json");
|
||||
assert.equal(report.devCdApply.reportPaths.runtimeMigration, "reports/dev-gate/dev-runtime-migration-report.json");
|
||||
assert.equal(report.devCdApply.reportPaths.runtimePostflight, "reports/dev-gate/dev-runtime-postflight-report.json");
|
||||
assert.equal(report.devCdApply.reportPaths.transaction, stateReport(repoRoot, "dev-cd-apply.json"));
|
||||
assert.equal(report.devCdApply.reportPaths.runtimeProvisioning, tempReport("dev-runtime-provisioning-report.json"));
|
||||
assert.equal(report.devCdApply.reportPaths.runtimeMigration, tempReport("dev-runtime-migration-report.json"));
|
||||
assert.equal(report.devCdApply.reportPaths.runtimePostflight, tempReport("dev-runtime-postflight-report.json"));
|
||||
|
||||
const publishCall = commandLog.find((entry) => entry.args.includes("scripts/dev-artifact-publish.mjs"));
|
||||
const applyCall = commandLog.find((entry) => entry.args.includes("scripts/dev-deploy-apply.mjs"));
|
||||
@@ -1309,7 +1319,7 @@ test("transaction runs phases, allows internal side-effect env, releases lock, a
|
||||
commandLog.findIndex((entry) => entry.args.includes("scripts/dev-deploy-apply.mjs"))
|
||||
);
|
||||
|
||||
const writtenReport = JSON.parse(await readFile(path.join(repoRoot, "reports/dev-gate/dev-cd-apply.json"), "utf8"));
|
||||
const writtenReport = JSON.parse(await readFile(stateReport(repoRoot, "dev-cd-apply.json"), "utf8"));
|
||||
assert.equal(writtenReport.devCdApply.liveVerify.summary.checked, 2);
|
||||
});
|
||||
|
||||
@@ -1325,7 +1335,7 @@ test("transaction can skip runtime postflight while preserving publish apply and
|
||||
"task-skip-postflight",
|
||||
"--kubeconfig",
|
||||
"/etc/rancher/k3s/k3s.yaml",
|
||||
"--write-report",
|
||||
"--report", stateReport(repoRoot, "dev-cd-apply.json"),
|
||||
"--full-output",
|
||||
"--skip-runtime-postflight"
|
||||
], {
|
||||
@@ -1403,7 +1413,7 @@ test("transaction blocks with structured runtime postflight blocker when M3 evid
|
||||
"task-postflight-blocked",
|
||||
"--kubeconfig",
|
||||
"/etc/rancher/k3s/k3s.yaml",
|
||||
"--write-report"
|
||||
"--report", stateReport(repoRoot, "dev-cd-apply.json")
|
||||
], {
|
||||
repoRoot,
|
||||
env: {},
|
||||
@@ -1414,7 +1424,7 @@ test("transaction blocks with structured runtime postflight blocker when M3 evid
|
||||
});
|
||||
|
||||
const summary = JSON.parse(output);
|
||||
const report = JSON.parse(await readFile(path.join(repoRoot, "reports/dev-gate/dev-cd-apply.json"), "utf8"));
|
||||
const report = JSON.parse(await readFile(stateReport(repoRoot, "dev-cd-apply.json"), "utf8"));
|
||||
const blocker = report.blockers.find((item) => item.scope === "runtime-durable-postflight");
|
||||
assert.equal(code, 2);
|
||||
assert.equal(summary.status, "blocked");
|
||||
@@ -1447,7 +1457,7 @@ test("runtime maintenance job reports are parsed after redacting secret-like log
|
||||
"task-redaction",
|
||||
"--kubeconfig",
|
||||
"/etc/rancher/k3s/k3s.yaml",
|
||||
"--write-report",
|
||||
"--report", stateReport(repoRoot, "dev-cd-apply.json"),
|
||||
"--full-output"
|
||||
], {
|
||||
repoRoot,
|
||||
@@ -1484,7 +1494,7 @@ test("transaction can apply an already published deploy-json promotion without r
|
||||
"task-promotion",
|
||||
"--kubeconfig",
|
||||
"/etc/rancher/k3s/k3s.yaml",
|
||||
"--write-report",
|
||||
"--report", stateReport(repoRoot, "dev-cd-apply.json"),
|
||||
"--full-output"
|
||||
], {
|
||||
repoRoot,
|
||||
@@ -1551,7 +1561,7 @@ test("apply stdout is concise by default while write-report keeps the full repor
|
||||
"task-c",
|
||||
"--kubeconfig",
|
||||
"/etc/rancher/k3s/k3s.yaml",
|
||||
"--write-report"
|
||||
"--report", stateReport(repoRoot, "dev-cd-apply.json")
|
||||
], {
|
||||
repoRoot,
|
||||
env: {},
|
||||
@@ -1569,7 +1579,7 @@ test("apply stdout is concise by default while write-report keeps the full repor
|
||||
assert.equal(summary.lock.acquired, true);
|
||||
assert.equal(summary.steps.some((step) => step.id === "dev-deploy-apply"), true);
|
||||
|
||||
const writtenReport = JSON.parse(await readFile(path.join(repoRoot, "reports/dev-gate/dev-cd-apply.json"), "utf8"));
|
||||
const writtenReport = JSON.parse(await readFile(stateReport(repoRoot, "dev-cd-apply.json"), "utf8"));
|
||||
assert.equal(writtenReport.devCdApply.deployJson.before.manifest.environment, "dev");
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user