CI Troubleshooting#
Operational reference for common CI failure modes. This document is advisory; it does not change package semantics, release scope, or stable contracts.
Why the workflow pins actions by SHA#
Every first-party action referenced in .github/workflows/ci.yml is pinned by full commit SHA with a trailing # vX.Y.Z version comment:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
Reasons:
Security hardening. A moving tag like
@v4can be re-pointed to a different commit by the action’s maintainer. SHA pinning removes that trust surface. GitHub’s official guidance recommends this for third-party actions and treats it as best practice for first-party ones as well.Reproducibility. Two runs of the same commit resolve to the same action bytes forever, regardless of upstream retagging.
Modest resilience against tag-resolution outages. When GitHub’s tag-resolution endpoint 503s, a SHA-pinned reference can (sometimes) skip that lookup step. It does not help if the tarball-download endpoint itself is down.
The pins are kept fresh by Dependabot per .github/dependabot.yml — a weekly Monday PR opens whenever a pinned action publishes a new patch or minor release. Major-version bumps (X.0.0 breaks) are explicitly ignored by the Dependabot config and stay a manual maintenance task, because GitHub Actions major bumps have a history of cross-API breaks (upload-artifact v3 → v4 broke the artifact API in Dec 2024; checkout v3 → v4 required a Node 20 runner). To take a major bump, a maintainer reads the action’s changelog, updates the SHA and version comment in .github/workflows/ci.yml directly, and reviews the PR themselves.
Other common CI failure modes#
pip installhangs or 5xxs. The workflow already wraps installs in aretry 3shell function. If that runs out of retries, the fix is the same: check status, re-run the failed job.docs-buildfails withWARNING: document isn't included in any toctree. Sphinx is built with-W --keep-going, so any new markdown doc must be added to the appropriatedocs/*/index.rsttoctree in the same PR.lint(blocking as of v0.30.1a) reports ruff violations. Reproduce locally withpython -m ruff check .and either fix the code or add a documented per-file ignore to[tool.ruff.lint.per-file-ignores]inpyproject.toml.Advisory
typecheckorcoveragered. Both arecontinue-on-error: truethrough v0.30.1a and do not block merges. Promotion to blocking is scheduled perdocs/design/V0_30_HYGIENE_AUDIT.md(v0.30.1bfor coverage;v0.30.1c-kfor mypy scope broadening).