Repository navigation
ci: keep the reusable test call out of CD's concurrency group - #101
Merged
Merged
Conversation
In a called workflow `github.workflow` is the caller's name, so the group this workflow computed when CD called it as its publish gate was identical to CD's own. A called workflow that shares its caller's concurrency group deadlocks against the run that started it: the gate job is cancelled before it starts, leaving no job, no log and no annotation, and `deploy` is skipped because it needs a job that never ran. That is what failed the v1.1.0 release. Assisted-by: claude-code:claude-opus-5
ariostas
enabled auto-merge (squash)
August 26, 2026 20:25
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🤖 AI text below 🤖
The v1.1.0 CD run failed without publishing to PyPI, and the reason was invisible in the UI:
Build distand both smoke jobs passed,Deploy to PyPIshowed as skipped, and theTestsgate job was simply absent — no job, no log, no annotation, no check run.The cause is that
ci.ymland thecd.ymljob that calls it were computing the same concurrency group. In a called workflowgithub.workflowis the caller's workflow name, soevaluated to
CD-refs/tags/v1.1.0for the gate — byte-identical to the group the CD run itself was already holding. GitHub treats a called workflow that shares its caller's group as a deadlock and cancels it before it starts, which is why it produced no output at all;deploythen skipped because itneedsa job that never ran.Adding a literal to the group keeps the two apart: standalone runs get
unittests-unittests-<ref>, the CD gate getsCD-unittests-<ref>, and neither collides with CD's ownCD-<ref>. Each still cancels its own superseded runs per ref, as before.This was the first release since #90 added the gate and the concurrency blocks, so nothing had exercised the combination until now.
Note that v1.1.0 was never uploaded to PyPI, and re-running the failed run cannot fix it — it re-reads the workflows at the tag, which predates this change. Zenodo did archive it (10.5281/zenodo.22117449), since that fires on the release webhook rather than on the workflow. Moving the v1.1.0 tag would make Zenodo mint a second, permanent record labelled v1.1.0, so cutting v1.1.1 on top of this is the cleaner recovery.