fix(deploy): treat finalized manifests as clean no-op

This commit is contained in:
冰朔 2026-08-07 14:54:43 +08:00
commit c28a3da8ea
4 changed files with 73 additions and 4 deletions

View file

@ -32,10 +32,32 @@ async function processOne(options = {}) {
const checked = validateEvent(event, options.registry || loadRegistry(options.registryFile));
if (checked) throw new Error(checked);
const result = await (options.provisionFn || provision)({ target: event.target, action: "provision-approved-architecture", resource: event.resource }, { repoUrl: options.registry ? options.registry[event.repo].repo_url : loadRegistry(options.registryFile)[event.repo].repo_url });
const receipt = { schema: "guanghu.deployment-agent-receipt/v1", event_id: event.event_id, workorder_id: event.workorder_id, repo: event.repo, branch: event.branch, commit_sha: event.commit_sha, resource: event.resource, result: result.ok ? "DEPLOYED_AND_VERIFIED" : "FAILED_OR_ROLLED_BACK", diagnostic_code: result.ok ? "deployment_succeeded" : String(result.error || "deployment_failed"), evidence: result, recorded_at: new Date().toISOString() };
const noDeploymentRequired = result.ok === false && result.error === "manifest_already_finalized";
const completed = result.ok || noDeploymentRequired;
const receipt = {
schema: "guanghu.deployment-agent-receipt/v1",
event_id: event.event_id,
workorder_id: event.workorder_id,
repo: event.repo,
branch: event.branch,
commit_sha: event.commit_sha,
resource: event.resource,
result: result.ok
? "DEPLOYED_AND_VERIFIED"
: noDeploymentRequired
? "NO_DEPLOYMENT_REQUIRED"
: "FAILED_OR_ROLLED_BACK",
diagnostic_code: result.ok
? "deployment_succeeded"
: noDeploymentRequired
? "manifest_already_finalized"
: String(result.error || "deployment_failed"),
evidence: result,
recorded_at: new Date().toISOString(),
};
writeAtomic(path.join(receiptsDir, `${event.event_id}.json`), `${JSON.stringify(receipt, null, 2)}\n`);
fs.renameSync(processing, `${processing}.${result.ok ? "done" : "failed"}`);
return { ok: result.ok, state: receipt.result, receipt };
fs.renameSync(processing, `${processing}.${completed ? "done" : "failed"}`);
return { ok: completed, state: receipt.result, receipt };
} catch (error) {
const receipt = { schema: "guanghu.deployment-agent-receipt/v1", event_id: event && event.event_id || "", result: "REJECTED", diagnostic_code: String(error && error.message || "deployment_event_invalid").slice(0, 160), recorded_at: new Date().toISOString() };
writeAtomic(path.join(receiptsDir, `${path.basename(file, ".json")}.rejected.json`), `${JSON.stringify(receipt, null, 2)}\n`);