feat(cicd): add branch follower closeout drilldown
This commit is contained in:
@@ -3,6 +3,8 @@
|
||||
|
||||
export function renderDrillDownHuman(payload: Record<string, unknown>): string {
|
||||
if (payload.action === "taskrun") return renderTaskRunHuman(payload);
|
||||
if (payload.action === "job") return renderJobHuman(payload);
|
||||
if (payload.action === "runtime") return renderRuntimeHuman(payload);
|
||||
if (payload.follower === undefined) {
|
||||
const followers = arrayRecords(payload.followers);
|
||||
return [
|
||||
@@ -27,6 +29,80 @@ export function renderDrillDownHuman(payload: Record<string, unknown>): string {
|
||||
].filter((line) => line !== "").join("\n");
|
||||
}
|
||||
|
||||
function renderJobHuman(payload: Record<string, unknown>): string {
|
||||
const result = asOptionalRecord(payload.result);
|
||||
const job = asOptionalRecord(result?.job);
|
||||
const query = asOptionalRecord(payload.query);
|
||||
const policy = asOptionalRecord(payload.policy);
|
||||
const pods = arrayRecords(result?.pods);
|
||||
const logs = arrayRecords(result?.logs);
|
||||
const errors = arrayRecords(result?.errors);
|
||||
const command = asOptionalRecord(payload.command);
|
||||
const identity = asOptionalRecord(command?.identity);
|
||||
return [
|
||||
`CI/CD BRANCH-FOLLOWER JOB (${payload.ok === false ? "failed" : "ok"})`,
|
||||
"",
|
||||
table(
|
||||
["FOLLOWER", "ADAPTER", "STAGE", "NAMESPACE", "JOB", "STATUS", "REASON", "DURATION", "PODS"],
|
||||
[[
|
||||
payload.follower,
|
||||
payload.adapter ?? "-",
|
||||
job?.stage ?? query?.stage ?? "-",
|
||||
job?.namespace ?? query?.namespace ?? "-",
|
||||
job?.name ?? query?.jobName ?? "-",
|
||||
jobStatus(job),
|
||||
asOptionalRecord(job?.condition)?.reason ?? result?.degradedReason ?? "-",
|
||||
job?.durationSeconds ?? "-",
|
||||
pods.length,
|
||||
]],
|
||||
),
|
||||
pods.length === 0 ? "" : `\nPODS\n${table(["POD", "PHASE", "READY", "START", "CONTAINERS", "REASON"], pods.map(jobPodRow))}`,
|
||||
logs.length === 0 ? "" : `\nLOG TAILS\n${table(["POD", "CONTAINER", "STATUS", "REASON", "LINES", "BYTES", "TIMING", "MESSAGE"], logs.map(logRow))}`,
|
||||
errors.length === 0 ? "" : `\nERRORS\n${table(["POD", "CONTAINER", "REASON", "MESSAGE"], errors.map((item) => [item.pod, item.container, item.degradedReason, item.message]))}`,
|
||||
command === null ? "" : `\nTARGET COMMAND\n${table(["ROUTE", "SCRIPT", "EXIT", "PARSE_ERROR"], [[identity?.route ?? "-", identity?.script ?? "-", command.exitCode ?? "-", command.parseError ?? "-"]])}`,
|
||||
command?.stdoutTail ? `\nSTDOUT_TAIL\n${command.stdoutTail}` : "",
|
||||
command?.stderrTail ? `\nSTDERR_TAIL\n${command.stderrTail}` : "",
|
||||
"",
|
||||
`policy: tailLines=${policy?.logsTailLines ?? "-"} maxLogBytes=${policy?.maxLogBytes ?? "-"} timeoutSeconds=${policy?.timeoutSeconds ?? "-"} maxContainers=${policy?.maxContainers ?? "-"}`,
|
||||
"",
|
||||
].filter((line) => line !== "").join("\n");
|
||||
}
|
||||
|
||||
function renderRuntimeHuman(payload: Record<string, unknown>): string {
|
||||
const result = asOptionalRecord(payload.result);
|
||||
const query = asOptionalRecord(payload.query);
|
||||
const policy = asOptionalRecord(payload.policy);
|
||||
const workloads = arrayRecords(result?.workloads);
|
||||
const pods = workloads.flatMap((workload) => arrayRecords(workload.pods).map((pod) => ({ ...pod, workload: `${workload.kind ?? "-"}/${workload.name ?? "-"}` }))).slice(0, 12);
|
||||
const command = asOptionalRecord(payload.command);
|
||||
const identity = asOptionalRecord(command?.identity);
|
||||
return [
|
||||
`CI/CD BRANCH-FOLLOWER RUNTIME (${payload.ok === false ? "failed" : "ok"})`,
|
||||
"",
|
||||
table(
|
||||
["FOLLOWER", "ADAPTER", "NAMESPACE", "EXPECTED", "TARGET", "READY", "ALIGNED", "BLOCKING"],
|
||||
[[
|
||||
payload.follower,
|
||||
payload.adapter ?? "-",
|
||||
result?.namespace ?? query?.namespace ?? "-",
|
||||
shortSha(stringOrNull(result?.expectedSha)),
|
||||
shortSha(stringOrNull(result?.targetSha)),
|
||||
result?.ready ?? "-",
|
||||
result?.aligned ?? "-",
|
||||
result?.blockingReason ?? "-",
|
||||
]],
|
||||
),
|
||||
workloads.length === 0 ? "" : `\nWORKLOADS\n${table(["KIND", "NAME", "READY", "ALIGNED", "REPLICAS", "UPDATED", "SOURCE", "BLOCKING"], workloads.map(runtimeWorkloadRow))}`,
|
||||
pods.length === 0 ? "" : `\nPODS\n${table(["WORKLOAD", "POD", "PHASE", "READY", "START", "SOURCE", "CONTAINERS"], pods.map(runtimePodRow))}`,
|
||||
command === null ? "" : `\nTARGET COMMAND\n${table(["ROUTE", "SCRIPT", "EXIT", "PARSE_ERROR"], [[identity?.route ?? "-", identity?.script ?? "-", command.exitCode ?? "-", command.parseError ?? "-"]])}`,
|
||||
command?.stdoutTail ? `\nSTDOUT_TAIL\n${command.stdoutTail}` : "",
|
||||
command?.stderrTail ? `\nSTDERR_TAIL\n${command.stderrTail}` : "",
|
||||
"",
|
||||
`policy: timeoutSeconds=${policy?.timeoutSeconds ?? "-"} maxContainers=${policy?.maxContainers ?? "-"}`,
|
||||
"",
|
||||
].filter((line) => line !== "").join("\n");
|
||||
}
|
||||
|
||||
function renderTaskRunHuman(payload: Record<string, unknown>): string {
|
||||
const result = asOptionalRecord(payload.result);
|
||||
const taskRun = asOptionalRecord(result?.taskRun);
|
||||
@@ -69,6 +145,52 @@ function renderTaskRunHuman(payload: Record<string, unknown>): string {
|
||||
].filter((line) => line !== "").join("\n");
|
||||
}
|
||||
|
||||
function jobStatus(job: Record<string, unknown> | null): string {
|
||||
if (job === null) return "-";
|
||||
if (job.completed === true) return "completed";
|
||||
if (job.failedState === true) return "failed";
|
||||
if (numberOrNull(job.active) !== null && numberOrNull(job.active)! > 0) return "active";
|
||||
return stringOrNull(asOptionalRecord(job.condition)?.type) ?? "-";
|
||||
}
|
||||
|
||||
function jobPodRow(item: Record<string, unknown>): unknown[] {
|
||||
return [
|
||||
item.name,
|
||||
item.phase,
|
||||
item.ready,
|
||||
item.startTime ?? item.createdAt ?? "-",
|
||||
item.containerCount,
|
||||
item.reason ?? "-",
|
||||
];
|
||||
}
|
||||
|
||||
function runtimeWorkloadRow(item: Record<string, unknown>): unknown[] {
|
||||
const sourceCommit = asOptionalRecord(item.sourceCommit);
|
||||
return [
|
||||
item.kind,
|
||||
item.name,
|
||||
item.ready,
|
||||
item.aligned,
|
||||
`${item.readyReplicas ?? "-"}/${item.replicas ?? "-"}`,
|
||||
item.updatedReplicas ?? "-",
|
||||
shortSha(stringOrNull(sourceCommit?.value)),
|
||||
item.blockingReason ?? "-",
|
||||
];
|
||||
}
|
||||
|
||||
function runtimePodRow(item: Record<string, unknown>): unknown[] {
|
||||
const sourceCommit = asOptionalRecord(item.sourceCommit);
|
||||
return [
|
||||
item.workload,
|
||||
item.name,
|
||||
item.phase,
|
||||
item.ready,
|
||||
item.startTime ?? item.createdAt ?? "-",
|
||||
shortSha(stringOrNull(sourceCommit?.value)),
|
||||
arrayRecords(item.containers).length,
|
||||
];
|
||||
}
|
||||
|
||||
function logRow(item: Record<string, unknown>): unknown[] {
|
||||
return [
|
||||
item.pod,
|
||||
|
||||
Reference in New Issue
Block a user