Skip to content

fix(ci): stop PR builds cancelling each other and blocking on deploys#56

Open
yesnet0 wants to merge 1 commit into
mainfrom
fix/pr-builds-cancel-each-other
Open

fix(ci): stop PR builds cancelling each other and blocking on deploys#56
yesnet0 wants to merge 1 commit into
mainfrom
fix/pr-builds-cancel-each-other

Conversation

@yesnet0

@yesnet0 yesnet0 commented Jul 13, 2026

Copy link
Copy Markdown
Member

The bug

hugo.yml puts every run — production deploys and pull-request validation builds — into a single global concurrency group:

concurrency:
  group: "pages"
  cancel-in-progress: false

GitHub permits one running and one pending run per concurrency group. A third contender cancels the pending one.

What that actually cost us

Dependabot opened 10 PRs on 2026-07-05. They all contended for that single slot and cancelled each other. The result:

  • 2 builds succeeded, 8 were cancelled
  • The PRs sat for a week showing no checks at all

That last part is the dangerous bit: "cancelled" renders as "checks not configured", not as "checks failed". It reads like the repo has no CI rather than like CI was silently starved — so the natural next move is to merge them, which would be merging blind into disclose.io. One of those 10 (#36) bumps Tailwind 3 → 4, a breaking major: v4 drops the CLI binary that build:css invokes via npx tailwindcss, so it takes the CSS build out.

The fix

Split the groups by event:

  • Deploys (push to main) keep serializing on pages — only one GitHub Pages deployment can be in flight, so that constraint is real.
  • PR builds get a per-ref group (pages-pr-<ref>), so they neither cancel each other nor queue behind a production deploy.
  • cancel-in-progress is now true for PRs only — a superseded PR build should be cancelled; a deploy never should.

After this merges

The 10 open Dependabot PRs will get real CI for the first time. Expect several to go red — that is the point. Nothing should be merged into this repo until they do.


Found during a maintenance pass on the disclose.io org, 2026-07-12.

hugo.yml put every run — deploys AND pull-request validation builds — into a
single global concurrency group named "pages". GitHub allows one running and
one pending run per group, so a third contender cancels the pending one.

The visible consequence: when Dependabot opened 10 PRs at once, they all
contended for that one slot and cancelled each other. Two got a build; eight
were cancelled; the PRs sat for a week with no CI at all, which read as
"checks not configured" rather than "checks were cancelled". Merging any of
them would have been merging blind — and one of them is a Tailwind v3 -> v4
major that breaks the CSS build outright.

Deploys still serialize on "pages" (only one Pages deployment can be in flight).
PR builds now get a per-ref group, so they neither cancel each other nor contend
with a production deploy. Superseded PR builds cancel; deploys never do.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant