fix(cicd): 收紧 managed repository 配置与状态合同

This commit is contained in:
Codex
2026-07-12 00:35:27 +02:00
parent 49f13e404e
commit 2f8ccee0a5
5 changed files with 257 additions and 7 deletions
+44 -5
View File
@@ -482,18 +482,33 @@ export async function gitMirrorStatus(config: UniDeskConfig, options: GitMirrorS
declaredConfigRef: target.configPath,
});
const observation = await readGitMirrorStatus(config, target);
return renderGitMirrorStatusEnvelope(target, deliveryAuthority, observation, options);
}
export function renderGitMirrorStatusEnvelope(
target: ReturnType<typeof resolveAgentRunLaneTarget>,
deliveryAuthority: ReturnType<typeof resolveCicdDeliveryAuthority>,
observation: Awaited<ReturnType<typeof readGitMirrorStatus>>,
options: GitMirrorStatusOptions,
): Record<string, unknown> {
const spec = target.spec;
const summary = observation.summary;
const outputSummary = options.full || options.raw ? summary : compactManagedRepositoryStatus(summary);
const expanded = options.full || options.raw;
const repositoryLimit = spec.gitMirror.repositoryReconciler.status.defaultRepositoryLimit;
const compactTargetRepositories = spec.gitMirror.repositories
.slice(0, repositoryLimit)
.map((repository) => ({ key: repository.key, sourceBranch: repository.sourceBranch }));
const compactTarget = {
node: spec.nodeId,
lane: spec.lane,
namespace: spec.gitMirror.namespace,
controller: spec.gitMirror.repositoryReconciler.deploymentName,
repositories: spec.gitMirror.repositories.map((repository) => ({ key: repository.key, sourceBranch: repository.sourceBranch })),
repositories: compactTargetRepositories,
repositoryView: repositoryListView(spec.gitMirror.repositories.length, compactTargetRepositories.length, repositoryLimit),
};
const fullTarget = {
...compactTarget,
repositories: spec.gitMirror.repositories.map((repository) => ({ key: repository.key, sourceBranch: repository.sourceBranch })),
version: spec.version,
sourceAuthority: spec.source.sourceAuthority,
gitMirror: {
@@ -515,7 +530,15 @@ export async function gitMirrorStatus(config: UniDeskConfig, options: GitMirrorS
remoteConfigured: true,
})),
},
repositoryView: repositoryListView(spec.gitMirror.repositories.length, spec.gitMirror.repositories.length, null),
};
const summaryRepositories = Array.isArray(summary.repositories) ? summary.repositories : [];
const outputSummary = expanded
? {
...summary,
repositoryView: repositoryListView(summaryRepositories.length, summaryRepositories.length, null),
}
: compactManagedRepositoryStatus(summary, repositoryLimit);
const outputNext = deliveryAuthority.kind === "pac-pr-merge"
? {
status: `bun scripts/cli.ts platform-infra pipelines-as-code status --target ${deliveryAuthority.consumer.node} --consumer ${deliveryAuthority.consumer.consumerId}`,
@@ -549,7 +572,7 @@ export async function gitMirrorStatus(config: UniDeskConfig, options: GitMirrorS
full: options.full,
raw: options.raw,
rawOmitted: !options.raw,
probeTailOmitted: !(options.full || options.raw),
probeTailOmitted: !options.raw,
expandWith: `bun scripts/cli.ts agentrun git-mirror status --node ${spec.nodeId} --lane ${spec.lane} --full`,
rawWith: `bun scripts/cli.ts agentrun git-mirror status --node ${spec.nodeId} --lane ${spec.lane} --raw`,
},
@@ -578,9 +601,9 @@ function compactDeliveryAuthority(authority: ReturnType<typeof resolveCicdDelive
};
}
function compactManagedRepositoryStatus(summary: Record<string, unknown>): Record<string, unknown> {
function compactManagedRepositoryStatus(summary: Record<string, unknown>, limit: number): Record<string, unknown> {
const controller = record(summary.controller);
const repositories = Array.isArray(summary.repositories)
const allRepositories = Array.isArray(summary.repositories)
? summary.repositories.map((value) => record(value)).map((repository) => ({
key: repository.key ?? null,
sourceBranch: repository.sourceBranch ?? null,
@@ -592,8 +615,14 @@ function compactManagedRepositoryStatus(summary: Record<string, unknown>): Recor
aligned: repository.refAligned === true && repository.remoteFingerprintAligned === true,
}))
: [];
const repositories = allRepositories.slice(0, limit);
return {
ok: summary.ok === true,
repository: summary.repository ?? null,
sourceBranch: summary.sourceBranch ?? null,
gitopsBranch: summary.gitopsBranch ?? null,
sourceCommit: summary.sourceCommit ?? null,
gitopsCommit: summary.gitopsCommit ?? null,
controller: {
deploymentReady: controller.deploymentReady === true,
desiredRendered: controller.configRendered === true && controller.workloadRendered === true,
@@ -601,11 +630,21 @@ function compactManagedRepositoryStatus(summary: Record<string, unknown>): Recor
heartbeatFresh: controller.heartbeatFresh === true,
},
repositories,
repositoryView: repositoryListView(allRepositories.length, repositories.length, limit),
firstDrift: summary.firstDrift ?? null,
valuesPrinted: false,
};
}
function repositoryListView(total: number, shown: number, limit: number | null): Record<string, number | null> {
return {
limit,
total,
shown,
omitted: Math.max(0, total - shown),
};
}
function shortCommit(value: unknown): string | null {
return typeof value === "string" && /^[0-9a-f]{40}$/u.test(value) ? value.slice(0, 12) : null;
}