Zuul CI troubleshooting
SkillDev toolsTroubleshoot failing Zuul CI jobs for this project. Use this when asked to debug, investigate, or fix Zuul job failures.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Zuul CI troubleshooting skill
What this skill tells your AI
The instructions your AI receives, as published by vexxhost/atmosphere in .agents/skills/zuul/SKILL.md and read by ahel’s review.
Finding the Zuul check for a PR
Get the list of checks for the pull request. Identify the Zuul check by
looking for a check whose URL points to a Zuul instance (typically
containing /buildset/ in the path). Note the check name, status, and
buildset URL for further investigation.
Getting buildset details via Zuul API
Zuul's dashboard is an SPA so you cannot scrape it directly. Use the REST API instead. Extract the Zuul base URL and buildset UUID from the check URL, then call:
GET <zuul_base_url>/api/buildset/<buildset_uuid>
The response is JSON containing the buildset result, pipeline, refs, and
a builds array. Each build has job_name, result, duration,
log_url, and error_detail. Use this to identify which specific
job(s) failed within the buildset.
Log retrieval
For details on reading job logs, scanning the artifact manifest, and
the artifact directory structure, see .github/skills/zuul/logs.md.
Troubleshooting approach
- Start with the buildset API to identify which job(s) failed.
- Grep
job-output.txtforFAILED(excludingRETRYING) andPLAY RECAPwithfailed=> 0 to locate the failure point. - If the failure is in a verify/test stage (for example tempest), check
whether the converge stage itself passed (
failed=0) — the root cause may be environmental rather than a deployment error. - Use the scan-manifest script to discover available artifacts, then inspect host-level state (networking, routes, processes) and pod logs for the relevant services.
- Cross-reference Ansible task output (
okvschangedvsfailed) with the actual system state from artifacts — tasks can report success while the underlying command silently fails.
Comparing variants in the same buildset
When a buildset has multiple job variants (for example OVN vs OVS, or different CSI backends), and only one variant fails:
- Check whether the same test passed in the other variant — this narrows the root cause to what differs between them (networking backend, storage driver, node configuration).
- Compare system-level artifacts (routes, interfaces, bridge config) between the passing and failing jobs to spot environmental differences.
- A failure in only one variant often points to an infrastructure or configuration issue rather than a code bug.
Analyzing tempest failures
Tempest is the OpenStack integration test suite used in the verify stage. When tempest tests fail:
- Use the scan-manifest script to find the tempest pod logs (search
for "tempest"). The
tempest-run-testspod log contains the full tempest output and is much easier to parse than searching throughjob-output.txt. - Categorize the failure type:
- SSH/connectivity timeouts: Likely a networking or routing issue on the test host. Check interface state, routes, and bridge config.
- API errors (4xx/5xx): Check the pod logs for the failing OpenStack service (for example Neutron, Nova, Cinder).
- Resource creation failures: Check quota, scheduling, and the relevant service logs.
- Use the scan-manifest script to find pod logs for the service under test and look for errors or crashes around the timestamp of the failure.
- When a test fails with a timeout waiting for a resource, trace through the chain: check the service worker logs first, then the compute logs (Nova) to verify the underlying VM state, then the host networking artifacts (routes, interfaces). A resource stuck in a pending state often means the control plane cannot reach the data plane — verify connectivity, not just that the VM exists.
Analyzing service failures
When OpenStack or infrastructure services are unhealthy:
- Use the scan-manifest script to search for the service name and find its pod logs and Kubernetes object descriptions.
- Check for pods in
failed-pods/— these are pods that were not running at the time of log collection. - Review Helm release status in the helm artifacts to see if the deployment itself succeeded.
- Check the Kubernetes object descriptions for events, restart counts, and readiness probe failures.
Analyzing Ansible failures
When Ansible tasks fail or behave unexpectedly:
- Look for
PLAY RECAPlines to identify which play had failures. - Search backward from the recap to find the specific
TASKthat failed and its error output. - Watch for tasks that use
|| true,ignore_errors, orfailed_when: false— these mask real errors. A task can showokin the recap but have actually failed underneath. - Check whether plays that run privileged commands have
become: true. If a molecule scenario or Zuul job changed how privilege escalation is configured (for example removing a globalansible_becomesetting), individual plays may need explicitbecome: true. - Verify variable values by checking the generated workspace config and Ansible facts in the job output.
Signals
- GitHub stars
- 172
- Forks
- 42
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
zuul- Source
- github.com/vexxhost/atmosphere