fix: 收敛 PaC 自动交付提示
This commit is contained in:
@@ -25,6 +25,84 @@ function exactSkipMarker(records, event) {
|
||||
|
||||
const pacContractTasks = new Set(["plan-artifacts", "collect-artifacts", "gitops-promote"]);
|
||||
|
||||
function firstString(...values) {
|
||||
for (const value of values) {
|
||||
if (typeof value === "string" && value.length > 0) return value;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function pipelineRunMatchesConsumer(consumerInput, itemInput) {
|
||||
const consumer = record(consumerInput);
|
||||
const item = record(itemInput);
|
||||
const metadata = record(item.metadata);
|
||||
const labels = record(metadata.labels);
|
||||
const name = stringOrNull(metadata.name) || "";
|
||||
const prefix = stringOrNull(consumer.pipelineRunPrefix) || "";
|
||||
const pipeline = stringOrNull(consumer.pipeline) || "";
|
||||
return (prefix.length > 0 && name.startsWith(prefix))
|
||||
|| (pipeline.length > 0 && labels["tekton.dev/pipeline"] === pipeline)
|
||||
|| (pipeline.length > 0 && labels["tekton.dev/pipelineName"] === pipeline);
|
||||
}
|
||||
|
||||
function classifyPacPipelineRun(consumerInput, itemInput) {
|
||||
const consumer = record(consumerInput);
|
||||
const item = record(itemInput);
|
||||
const metadata = record(item.metadata);
|
||||
const labels = record(metadata.labels);
|
||||
const annotations = record(metadata.annotations);
|
||||
const candidate = pipelineRunMatchesConsumer(consumer, item);
|
||||
const eventType = firstString(
|
||||
labels["pipelinesascode.tekton.dev/event-type"],
|
||||
annotations["pipelinesascode.tekton.dev/event-type"],
|
||||
);
|
||||
const repository = firstString(
|
||||
labels["pipelinesascode.tekton.dev/repository"],
|
||||
annotations["pipelinesascode.tekton.dev/repository"],
|
||||
);
|
||||
const managedBy = stringOrNull(labels["app.kubernetes.io/managed-by"]);
|
||||
const provider = stringOrNull(annotations["pipelinesascode.tekton.dev/git-provider"]);
|
||||
const expectedRepository = stringOrNull(consumer.repository);
|
||||
const outer = candidate
|
||||
&& eventType === "push"
|
||||
&& expectedRepository !== null
|
||||
&& repository === expectedRepository
|
||||
&& managedBy === "pipelinesascode.tekton.dev"
|
||||
&& provider === "gitea";
|
||||
const inner = candidate
|
||||
&& !outer
|
||||
&& labels["app.kubernetes.io/part-of"] === "hwlab-web-probe-sentinel"
|
||||
&& labels["unidesk.ai/ci-system"] === "tekton"
|
||||
&& annotations["unidesk.ai/source-authority"] === "gitea-snapshot"
|
||||
&& typeof annotations["unidesk.ai/publish-gitops"] === "string";
|
||||
|
||||
const deliveryClass = outer
|
||||
? "outer-pac-event"
|
||||
: inner
|
||||
? "inner-deterministic-publish"
|
||||
: "unknown";
|
||||
const reason = outer
|
||||
? "observed-pac-push-metadata-matches-consumer"
|
||||
: inner
|
||||
? "deterministic-sentinel-publish-without-proven-parent"
|
||||
: candidate
|
||||
? "consumer-candidate-lacks-classification-evidence"
|
||||
: "not-a-consumer-candidate";
|
||||
return {
|
||||
deliveryClass,
|
||||
reason,
|
||||
candidate,
|
||||
deliveryAuthorityEligible: outer,
|
||||
deliveryOwner: outer ? "pac-controller-observed" : null,
|
||||
executionOwner: inner ? "tekton-child-unattached" : null,
|
||||
parentPipelineRun: null,
|
||||
parentRelation: inner ? "unproven" : null,
|
||||
metadataObservationOnly: outer,
|
||||
admissionProvenanceVerified: false,
|
||||
valuesPrinted: false,
|
||||
};
|
||||
}
|
||||
|
||||
function taskTerminalRecord(value) {
|
||||
const taskRun = record(value);
|
||||
const metadata = record(taskRun.metadata);
|
||||
@@ -728,10 +806,12 @@ function runPacStatusFixtureChecks() {
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
classifyPacPipelineRun,
|
||||
evaluatePacStatus,
|
||||
extractPacArtifactEvidence,
|
||||
extractPacSourceObservation,
|
||||
parsePacLogRecords,
|
||||
runPacStatusFixtureChecks,
|
||||
pipelineRunMatchesConsumer,
|
||||
taskTerminalRecord,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user