fix: 修正 PaC 相同 revision 状态判定

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Codex
2026-07-14 19:07:41 +02:00
parent f4aec43c80
commit 23cfc5e9cb
3 changed files with 104 additions and 4 deletions
+69 -1
View File
@@ -19,6 +19,53 @@ function digestFromImage(value) {
return value.split("@").slice(1).join("@") || null;
}
function normalizeGitopsRevisionRelation(value) {
const relation = record(value);
const expectedRevision = stringOrNull(relation.expectedRevision);
const observedRevision = stringOrNull(relation.observedRevision);
const validRevision = /^[0-9a-f]{7,64}$/iu;
if (expectedRevision === null
|| observedRevision === null
|| expectedRevision !== observedRevision
|| !validRevision.test(expectedRevision)) {
return relation;
}
const originalReason = stringOrNull(relation.reason);
const warnings = Array.isArray(relation.warnings) ? [...relation.warnings] : [];
if (originalReason === "owning-git-fetch-failed"
&& !warnings.some((item) => record(item).code === "pac-owning-git-fetch-failed")) {
warnings.push({
warning: true,
blocking: false,
code: "pac-owning-git-fetch-failed",
object: { kind: "gitops-revision", id: "owning-git" },
configPath: "live:gitops-revision",
reason: originalReason,
mutation: false,
valuesPrinted: false,
});
}
const graphProven = relation.relation === "exact" && relation.proof === "owning-git-commit-graph";
const directlyProven = relation.relation === "exact" && relation.proof === "direct-revision-equality";
return {
...relation,
relation: "exact",
expectedRevision,
observedRevision,
proof: graphProven || directlyProven ? relation.proof : "direct-revision-equality",
reason: graphProven ? "commits-equal" : "revisions-equal",
contextReason: graphProven
? null
: directlyProven
? stringOrNull(relation.contextReason)
: originalReason,
warnings,
valuesPrinted: false,
};
}
function exactSkipMarker(records, event) {
return [...records].reverse().find((item) => item.event === event
&& item.status === "skipped"
@@ -633,7 +680,7 @@ function evaluatePacStatus(inputValue) {
const argo = record(input.argo);
const runtime = record(input.runtime);
const sourceObservation = record(artifact.sourceObservation);
const revisionRelation = record(argo.revisionRelation);
const revisionRelation = normalizeGitopsRevisionRelation(argo.revisionRelation);
const gitopsRelation = stringOrNull(revisionRelation.relation) || "unknown";
const sourceCommit = stringOrNull(input.sourceCommit);
const registryDigest = stringOrNull(input.registryDigest);
@@ -1017,6 +1064,16 @@ function runPacStatusFixtureChecks() {
expectedCode: "pac-ready-gitops-exact",
input: fixtureInput({ artifact: { imageStatus: "built", digest: digestA, digests: [digestA], gitopsCommit: revision, sourceObservation: delivery, catalog: publishedCatalog() }, argo: exactArgo, runtime: { image: `registry/service@${digestA}`, digest: digestA, replicas: 1, readyReplicas: 1 } }),
},
{
id: "equal-revisions-ignore-owning-git-fetch-failure",
expectedOk: true,
expectedCode: "pac-ready-gitops-exact",
input: fixtureInput({
artifact: { imageStatus: "built", digest: digestA, digests: [digestA], gitopsCommit: revision, sourceObservation: delivery, catalog: publishedCatalog() },
argo: { ...exactArgo, revisionRelation: { relation: "unknown", expectedRevision: revision, observedRevision: revision, proof: "unavailable", reason: "owning-git-fetch-failed", fetchOk: false } },
runtime: { image: `registry/service@${digestA}`, digest: digestA, replicas: 1, readyReplicas: 1 },
}),
},
{
id: "gitops-only-registry-not-configured",
expectedOk: true,
@@ -1041,6 +1098,16 @@ function runPacStatusFixtureChecks() {
expectedCode: "pac-argo-revision-stale",
input: fixtureInput({ artifact: { imageStatus: "built", digest: digestA, digests: [digestA], gitopsCommit: revision, sourceObservation: delivery, catalog: publishedCatalog() }, argo: { ...exactArgo, revision: "d".repeat(40), revisionRelation: { relation: "stale", expectedRevision: revision, observedRevision: "d".repeat(40) } }, runtime: { image: `registry/service@${digestA}`, digest: digestA, replicas: 1, readyReplicas: 1 } }),
},
{
id: "different-revisions-fetch-failure-remains-unknown",
expectedOk: false,
expectedCode: "pac-argo-revision-unknown",
input: fixtureInput({
artifact: { imageStatus: "built", digest: digestA, digests: [digestA], gitopsCommit: revision, sourceObservation: delivery, catalog: publishedCatalog() },
argo: { ...exactArgo, revision: "d".repeat(40), revisionRelation: { relation: "unknown", expectedRevision: revision, observedRevision: "d".repeat(40), proof: "unavailable", reason: "owning-git-fetch-failed", fetchOk: false } },
runtime: { image: `registry/service@${digestA}`, digest: digestA, replicas: 1, readyReplicas: 1 },
}),
},
{
id: "delivery-gitops-missing",
expectedOk: false,
@@ -1245,6 +1312,7 @@ module.exports = {
evaluatePacStatus,
extractPacArtifactEvidence,
extractPacSourceObservation,
normalizeGitopsRevisionRelation,
parsePacLogRecords,
runPacStatusFixtureChecks,
pipelineRunMatchesConsumer,