with one click
prow-job-analysis
Use this skill when debugging a failed Prow CI job.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Use this skill when debugging a failed Prow CI job.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
Generate a comprehensive manual testing guide from a Jira issue, GitHub PR URLs, or both. Use when the user wants test steps, a QE test plan, or a testing guide for code changes.
Create Jira issues — story, bug, epic, feature, initiative, task, or feature-request — with CNTRLPLANE, OCPBUGS, GCP, HyperShift, ARO, ROSA conventions and type-specific templates
Generate triage reports and post findings to Jira and Slack
Query and deduplicate open CVE vulnerability issues from OCPBUGS for Node team components
Check whether a Jira issue is well-groomed and ready for /jira:solve
Analyze and compare disruption across one or more Prow CI job runs by examining interval data, audit logs, pod logs, and CPU metrics
| name | prow-job-analysis |
| description | Use this skill when debugging a failed Prow CI job. |
Analyze failures in OpenShift Prow CI jobs. Identify the job type, inspect artifacts, classify the failure, and route to the specialized reference for deep analysis.
The user will provide:
Prow job URL (required) — Prow UI or gcsweb URL
https://prow.ci.openshift.org/view/gs/test-platform-results/logs/<job>/<build_id>https://gcsweb-ci.apps.ci.l2s4.p1.openshiftapps.com/gcs/test-platform-results/...Test name (optional) — specific failed test to focus on
Flags (optional):
--backends <list> — focus disruption analysis on specific backendswhich python3which jqwhich gcloud — fastest access to the
public bucket (no auth required). Without it, every artifact operation works over
plain HTTPS: prow_job_artifact_search.py
(stdlib-only list/search/fetch) or curl against
https://storage.googleapis.com/test-platform-results/....test-platform-results/ in the URL and extract the bucket pathbuild_id — pattern (\d{10,}) in the pathgs://test-platform-results/{bucket-path}/Use the fetch-prowjob-json skill to get job metadata. Extract:
.spec.job--target= in ci-operator args.status.state.spec.refsParse the job name to determine the environment and expected failure modes:
| Pattern in Name | Job Type | Key Implications |
|---|---|---|
upgrade | Upgrade job | Installs first, then upgrades — see upgrade reference |
metal, baremetal | Bare metal | Uses dev-scripts + Metal3/Ironic — see metal install reference |
hypershift | HyperShift | Hosted control planes — see hypershift reference |
fips | FIPS-enabled | Watch for crypto/TLS errors |
ipv6, dualstack | IPv6/dualstack | Often disconnected, uses mirror registry |
single-node, sno | Single-node | Resource exhaustion more likely |
aggregated- prefix | Aggregated | Statistical analysis of multiple runs — see aggregated reference |
aws, gcp, azure | Cloud platform | Platform-specific errors — see cloud provider reference |
techpreview | Tech preview | Feature gates enabled, features may be unstable |
rhcos9, rhcos10, rhcos9_10, rt | RHCOS variant / RT kernel | OS variant pinned or heterogeneous; OS-level differences (kernel/systemd/SELinux) — see operating system changes reference |
mkdir -p .work/prow-job-analysis/{build_id}/logs
# Build log (always)
gcloud storage cp gs://test-platform-results/{bucket-path}/build-log.txt \
.work/prow-job-analysis/{build_id}/logs/ --no-user-output-enabled
# JUnit XML (always — identifies failed tests/steps)
gcloud storage ls "gs://test-platform-results/{bucket-path}/artifacts/**/junit*.xml" 2>/dev/null
# Node journals (always, when the job created a cluster) — required input for the
# Step 5 OS-layer check. Gzip-compressed WITHOUT a .gz extension: zcat/zgrep only.
gcloud storage cp -r \
"gs://test-platform-results/{bucket-path}/artifacts/{target}/gather-extra/artifacts/nodes" \
.work/prow-job-analysis/{build_id}/ --no-user-output-enabled 2>/dev/null || true
Examine the build log and JUnit results to classify the failure, then consult the appropriate reference file for detailed analysis procedures.
Operating-system (RHCOS) layer breakage frequently masquerades as an unrelated product failure: a single RHCOS bump swaps the kernel, cri-o, systemd, NetworkManager, and SELinux policy across the whole cluster at once, so the real cause surfaces as a symptom in some other domain. Before selecting a row from the routing table, complete BOTH steps:
1. Compare runtime versions across boots in the node journals (downloaded in
Step 4; gzip-compressed without a .gz extension — plain grep silently matches
nothing, use zcat/zgrep):
# Runtime versions per boot. End-of-run snapshots (oc_cmds/nodes, nodes.json)
# show only the final version; changes within the run are visible only here.
zgrep -hE "Starting CRI-O, version|Container runtime initialized" \
.work/prow-job-analysis/{build_id}/nodes/*/journal | sort | uniq -c
2. Scan the build log, JUnit, oc_cmds (node / clusteroperator status),
MachineConfig data, and the journals for these signals:
NetworkPluginNotReady, or a missing CNI config (/etc/cni/net.d empty / no CNI plugin)ContainerRuntimeVersion change on nodes (cri-o version bump between runs)passwd, files, or unitsNotReady after a rebootCreateContainerError, RunContainerError, or OCI runtime errors (crun / runc)panic, BUG, Oops, or soft lockup in node journals or the serial consoleavc: denied / SELinux denialsIf step 1 shows more than one runtime version on any node, or any step-2 signal is present, the RHCOS layer is implicated: still route via the table below using whichever reference matches the surface symptom, but also read operating-system-changes.md alongside it. Never clear the OS layer from end-of-run snapshots alone.
| Failure Signal | Reference | When to Use |
|---|---|---|
install should succeed fails in JUnit | Install — General | Install failed at config/infra/bootstrap/cluster-creation/operator-stability stage |
| Metal/baremetal job + install failure | Install — Metal | Bare-metal install (dev-scripts, Metal3/Ironic, libvirt) — use alongside Install — General |
| A test failed (start here) | Flaky Test Identification | Triage entry for any failing test: classify infra vs product regression vs flake, then route onward |
| Confirmed regression in a plain e2e test | Test Failure Root-Cause | Root-cause a real product regression in a plain (non-extension/install/upgrade) e2e test — e.g. [sig-network] ... should serve endpoints: test source, cluster state, originating error |
*-tests-ext extension binary error | Test Extension Binaries | OTE extension-binary extraction/discovery/version-skew failures — not core openshift-tests |
| Disruption events in intervals | Disruption | API backends stopped responding; interpret interval/timeline data (cause vs symptom vs noise) |
| Upgrade-phase failure or regression | Upgrade | CVO stuck, operators degraded, MCO drain/reboot stalls, or version skew during upgrade |
| HyperShift / HCP job failure | HyperShift | Hosted control planes — correlate management and hosted clusters |
aggregated- job failure | Aggregated Jobs | Statistical regression analysis across parallel child runs |
| Cloud API errors, quota, throttling | Cloud Provider Errors | AWS/GCP/Azure API/quota/provisioning failures before/during cluster creation |
| Node NotReady, OOM, disk pressure | Resource Exhaustion | CPU/memory/disk/PID/etcd exhaustion, eviction, unschedulable pods |
| DNS, OVN, registry/pull, ingress errors | Networking | OVN-Kubernetes/SDN, DNS, image pull/registry, load balancer/ingress, network policy |
| Container-start (cri-o), kernel panic, NetworkManager, RHCOS variant-isolated failure | Operating System Changes | Node OS (RHCOS) layer — cri-o/crun, kernel, systemd, NetworkManager, SELinux, or an RHCOS bump in the payload |
| Lease/quota, ci-operator, Prow infra | CI Infrastructure | Distinguish "product broke" from "CI config changed"; ci-operator, step registry, leases |
| Need a specific artifact file | Artifacts | Artifact directory structure, paths, and gcloud fetch commands |
These are the most frequently needed artifacts. See artifacts reference for the complete directory structure.
| Path | Description |
|---|---|
build-log.txt | Top-level ci-operator log |
artifacts/{target}/openshift-e2e-test/build-log.txt | E2E test console log |
artifacts/{target}/openshift-e2e-test/artifacts/junit/ | JUnit XML results |
artifacts/{target}/openshift-e2e-test/artifacts/junit/e2e-timelines_spyglass_*.json | Disruption timeline data |
artifacts/{target}/gather-extra/artifacts/oc_cmds/ | Cluster state snapshots |
artifacts/{target}/gather-extra/artifacts/pods/ | Pod logs by namespace |
artifacts/{target}/gather-extra/artifacts/audit_logs/ | API server audit logs |
artifacts/{target}/gather-must-gather/artifacts/must-gather.tar | Must-gather archive |
prowjob.json | Job metadata and timing |
Both formats are accepted and interchangeable:
# Prow UI
https://prow.ci.openshift.org/view/gs/test-platform-results/logs/{job}/{build_id}
# gcsweb (direct GCS browser)
https://gcsweb-ci.apps.ci.l2s4.p1.openshiftapps.com/gcs/test-platform-results/logs/{job}/{build_id}
The GCS bucket is always test-platform-results, publicly accessible, no auth required.
prowjob.json for timing, payload tag, and whether the job timed out.work/prow-job-analysis/{build_id}/ as the working directory for downloads