fix(pac): 修正 runtime GitOps verify marker 条件

This commit is contained in:
Codex
2026-07-14 01:22:30 +02:00
parent 6b647917bc
commit fd0d6a1c9f
3 changed files with 82 additions and 12 deletions
@@ -336,10 +336,16 @@ function injectRuntimeGitopsGuard(pipeline) {
const step = steps.find((item) => typeof recordOrNull(item)?.script === "string" && item.script.includes("scripts/gitops-render.mjs"));
if (!step) throw new Error("runtime GitOps guard injection failed: gitops-promote render step missing");
const originalScript = String(step.script);
let script = patchNoBuildNoRolloutSkip(originalScript);
const noBuildSkipPatched = script !== originalScript;
let script = patchNoBuildNoRolloutCondition(originalScript);
const noBuildConditionPatched = script !== originalScript;
const beforeSkipPatch = script;
script = patchNoBuildNoRolloutSkip(script);
const noBuildSkipPatched = script !== beforeSkipPatch;
const beforeInjection = script;
script = injectRuntimeGitopsCommands(script);
if (hasWillRunGitopsPromoteCoupling(script)) {
throw new Error("runtime GitOps guard injection failed: no-build-no-rollout marker remains coupled to willRunGitopsPromote");
}
if (hasNoBuildNoRolloutEarlyExit(script)) {
throw new Error("runtime GitOps guard injection failed: no-build-no-rollout-plan early exit remains after patch");
}
@@ -354,12 +360,20 @@ function injectRuntimeGitopsGuard(pipeline) {
present: true,
configMapName: runtimeGitopsConfigMapName,
stepName: stringOrNull(step.name),
noBuildConditionPatched,
noBuildSkipPatched,
postprocessInjected,
verifyInjected,
};
}
function patchNoBuildNoRolloutCondition(script) {
return String(script).replace(
/const willRunGitopsPromote = plan\.ciCdPlan && plan\.ciCdPlan\.willRunGitopsPromote === true;\nprocess\.exit\(!willRunGitopsPromote && buildServices\.length === 0 && affectedServices\.length === 0 \? 0 : 1\);/u,
"process.exit(buildServices.length === 0 && affectedServices.length === 0 ? 0 : 1);",
);
}
function patchNoBuildNoRolloutSkip(script) {
return String(script).replace(
/(^|\n)([ \t]*)echo '\{"event":"gitops-promote","status":"skipped","reason":"no-build-no-rollout-plan"\}'(?:\s*>\s*&2)?\n[ \t]*exit 0(?=\n|$)/u,
@@ -367,6 +381,10 @@ function patchNoBuildNoRolloutSkip(script) {
);
}
function hasWillRunGitopsPromoteCoupling(script) {
return /process\.exit\(!willRunGitopsPromote && buildServices\.length === 0 && affectedServices\.length === 0 \? 0 : 1\);/u.test(String(script));
}
function hasNoBuildNoRolloutEarlyExit(script) {
return /echo '\{"event":"gitops-promote","status":"skipped","reason":"no-build-no-rollout-plan"\}'(?:\s*>\s*&2)?\n[ \t]*exit 0(?=\n|$)/u.test(String(script));
}
@@ -54,10 +54,16 @@ function injectRuntimeGitopsGuard(pipeline) {
if (!step) throw new Error("runtime GitOps guard injection failed: gitops-promote render step missing");
const originalScript = String(step.script);
let script = patchNoBuildNoRolloutSkip(originalScript);
const noBuildSkipPatched = script !== originalScript;
let script = patchNoBuildNoRolloutCondition(originalScript);
const noBuildConditionPatched = script !== originalScript;
const beforeSkipPatch = script;
script = patchNoBuildNoRolloutSkip(script);
const noBuildSkipPatched = script !== beforeSkipPatch;
const beforeInjection = script;
script = injectRuntimeGitopsCommands(script);
if (hasWillRunGitopsPromoteCoupling(script)) {
throw new Error("runtime GitOps guard injection failed: no-build-no-rollout marker remains coupled to willRunGitopsPromote");
}
if (hasNoBuildNoRolloutEarlyExit(script)) {
throw new Error("runtime GitOps guard injection failed: no-build-no-rollout-plan early exit remains after patch");
}
@@ -70,12 +76,20 @@ function injectRuntimeGitopsGuard(pipeline) {
present: true,
configMapName,
stepName: typeof step.name === "string" ? step.name : null,
noBuildConditionPatched,
noBuildSkipPatched,
postprocessInjected: !hasPostprocess(beforeInjection) && postprocessPresent,
verifyInjected: !hasVerify(beforeInjection) && verifyPresent,
};
}
function patchNoBuildNoRolloutCondition(script) {
return String(script).replace(
/const willRunGitopsPromote = plan\.ciCdPlan && plan\.ciCdPlan\.willRunGitopsPromote === true;\nprocess\.exit\(!willRunGitopsPromote && buildServices\.length === 0 && affectedServices\.length === 0 \? 0 : 1\);/u,
"process.exit(buildServices.length === 0 && affectedServices.length === 0 ? 0 : 1);",
);
}
function patchNoBuildNoRolloutSkip(script) {
return String(script).replace(
/(^|\n)([ \t]*)echo '\{"event":"gitops-promote","status":"skipped","reason":"no-build-no-rollout-plan"\}'(?:\s*>\s*&2)?\n[ \t]*exit 0(?=\n|$)/u,
@@ -83,6 +97,10 @@ function patchNoBuildNoRolloutSkip(script) {
);
}
function hasWillRunGitopsPromoteCoupling(script) {
return /process\.exit\(!willRunGitopsPromote && buildServices\.length === 0 && affectedServices\.length === 0 \? 0 : 1\);/u.test(String(script));
}
function hasNoBuildNoRolloutEarlyExit(script) {
return /echo '\{"event":"gitops-promote","status":"skipped","reason":"no-build-no-rollout-plan"\}'(?:\s*>\s*&2)?\n[ \t]*exit 0(?=\n|$)/u.test(String(script));
}