fix(cicd): bound branch follower drilldown visibility

This commit is contained in:
Codex
2026-07-04 00:07:16 +00:00
parent 65080a5f8d
commit c8dd9de688
5 changed files with 72 additions and 15 deletions
+44 -7
View File
@@ -16,6 +16,30 @@ export async function runBranchFollowerTaskRunDrillDown(
if (follower.nativeStatus.tekton === null) throw new Error(`follower ${follower.id} has no Tekton native status config`);
const taskRun = options.taskRunName;
if (taskRun === null) throw new Error("taskrun drill-down requires --taskrun <taskrun-name|pipeline-task>");
if (follower.drillDown === null) {
return {
ok: false,
action: "taskrun",
follower: follower.id,
adapter: follower.adapter,
degradedReason: "drilldown-policy-missing",
message: `follower ${follower.id} registry is missing drillDown policy; apply the current config before TaskRun drill-down`,
query: {
taskRun,
pipelineRun: options.pipelineRunName,
tektonNamespace: follower.nativeStatus.tekton.namespace,
pipelineRunPrefix: follower.nativeStatus.tekton.pipelineRunPrefix,
},
policy: null,
result: null,
statusAuthority: options.inCluster ? "kubernetes-api-serviceaccount" : "target-node-kubectl-raw",
parsedDownstreamCliOutput: false,
next: {
apply: "bun scripts/cli.ts cicd branch-follower apply --confirm --wait",
status: `bun scripts/cli.ts cicd branch-follower status --follower ${follower.id}`,
},
};
}
const policy = {
taskRunTimeoutSeconds: options.timeoutSeconds ?? follower.drillDown.taskRunTimeoutSeconds,
logsTailLines: options.logsTailLines ?? follower.drillDown.logsTailLines,
@@ -42,7 +66,9 @@ export async function runBranchFollowerTaskRunDrillDown(
].join("\n");
const startedAt = Date.now();
const result = runKubeScript(registry, options, script, "", policy.taskRunTimeoutSeconds * 1000);
const parsed = result.exitCode === 0 ? parseJsonObject(result.stdout) : null;
const parsedResult = result.exitCode === 0 ? parseJsonObject(result.stdout) : { value: null, error: "target-command-failed" };
const parsed = parsedResult.value;
const includeTails = result.exitCode !== 0 || parsed === null || parsed.ok === false;
return {
ok: result.exitCode === 0 && parsed !== null && parsed.ok !== false,
action: "taskrun",
@@ -59,10 +85,19 @@ export async function runBranchFollowerTaskRunDrillDown(
policy,
result: parsed,
command: {
identity: {
route: options.inCluster ? "in-cluster" : registry.controller.kubeRoute,
script: "scripts/native/cicd/taskrun-drilldown.mjs",
namespace: follower.nativeStatus.tekton.namespace,
taskRun,
pipelineRun: options.pipelineRunName,
},
exitCode: result.exitCode,
timedOut: result.timedOut,
elapsedMs: Date.now() - startedAt,
stderrTail: result.exitCode === 0 ? "" : redactText(tailText(result.stderr || result.stdout, 1200)),
parseError: parsedResult.error,
stdoutTail: includeTails ? redactText(tailText(result.stdout, 1600)) : "",
stderrTail: includeTails ? redactText(tailText(result.stderr, 1200)) : "",
},
next: {
status: `bun scripts/cli.ts cicd branch-follower status --follower ${follower.id}`,
@@ -71,14 +106,16 @@ export async function runBranchFollowerTaskRunDrillDown(
};
}
function parseJsonObject(text: string): Record<string, unknown> | null {
function parseJsonObject(text: string): { value: Record<string, unknown> | null; error: string | null } {
const trimmed = text.trim();
if (trimmed.length === 0) return null;
if (trimmed.length === 0) return { value: null, error: "empty-stdout" };
try {
const parsed = JSON.parse(trimmed) as unknown;
return typeof parsed === "object" && parsed !== null && !Array.isArray(parsed) ? parsed as Record<string, unknown> : null;
} catch {
return null;
return typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)
? { value: parsed as Record<string, unknown>, error: null }
: { value: null, error: "stdout-json-not-object" };
} catch (error) {
return { value: null, error: `stdout-json-parse-failed: ${error instanceof Error ? error.message : String(error)}` };
}
}