ci: one queue for all of CI, nothing cancelled (#140)

Every workflow shared the concurrency group qemu. A group keeps one running
and one waiting run, and a run that joins cancels the one waiting: Build
runs 245 and 247 were cancelled at 0 s by PR 164's Acceptance runs.

Captain Bob, 2026-11-11: "It should be global"; the runner has capacity 1.
So the concurrency block is removed from all six workflows (a comment in
each says why): with one runner at capacity 1 every job waits its turn in
Gitea's queue and none is cancelled, and a runner-image rebuild still
blocks the rest. CLAUDE.md's CI section corrected; FABRIC-3 XLVIII.19.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017RzZgrf7V7Zk2iczBXDRbm
This commit is contained in:
Claude
2026-11-11 21:12:06 +00:00
parent 3c1ccabc8e
commit 88d5f777bb
8 changed files with 47 additions and 23 deletions
+5 -2
View File
@@ -358,8 +358,11 @@ present in `logs/`:
**Corrected 2026-11-10** — this file previously named stale job IDs (`build-amd64-iso`,
`build-aarch64-iso`, `build-riscv64-img`) and said "No QEMU boot step in CI."
Six workflows in `.gitea/workflows/`; all share a single `qemu` concurrency group
(`cancel-in-progress: false`) so at most one run executes at a time:
Six workflows in `.gitea/workflows/`. **One job at a time across all of CI, and none cancelled**
(corrected 2026-11-11, #140 -- Captain Bob: "It should be global"): there is no concurrency group;
the one runner (`starshipos-vps`) has capacity 1, so every job of every workflow waits its turn in
Gitea's queue. The shared `qemu` group this file described kept only one waiting run, and each run
that joined cancelled it:
- **`acceptance.yml`** — PR gate into `master`: 3 QEMU boots (amd64/aarch64/riscv64)
+ PC stick loaded high + `make -C v4 test-32`, all via `scripts/nightly.sh`; branch
protection requires this check to pass before the merge button unlocks.
+4 -4
View File
@@ -17,10 +17,10 @@ on:
types: [opened, synchronize, reopened]
workflow_dispatch:
concurrency:
group: qemu # every workflow shares this one group: one run at a time,
# a runner-image rebuild included (Captain Bob, 2026-11-07)
cancel-in-progress: false
# No concurrency group (Captain Bob, 2026-11-11, #140: "It should be global"). The one runner
# (starshipos-vps) has capacity 1, so every job of every workflow waits its turn in Gitea's queue
# and none is cancelled; a runner-image rebuild still blocks the rest (2026-11-07). A shared
# concurrency group kept only one waiting run, and each run that joined cancelled it.
jobs:
acceptance:
+4 -3
View File
@@ -13,9 +13,10 @@ on:
# the server the wikis share (Captain Bob, 2026-11-07)
workflow_dispatch:
concurrency:
group: qemu # every workflow shares this one group (Captain Bob, 2026-11-07: a
cancel-in-progress: false # runner-image rebuild blocks other jobs, always): one run at a time
# No concurrency group (Captain Bob, 2026-11-11, #140: "It should be global"). The one runner
# (starshipos-vps) has capacity 1, so every job of every workflow waits its turn in Gitea's queue
# and none is cancelled; a runner-image rebuild still blocks the rest (2026-11-07). A shared
# concurrency group kept only one waiting run, and each run that joined cancelled it.
jobs:
image:
+4 -3
View File
@@ -14,9 +14,10 @@ on:
- cron: '0 4 * * *' # 04:00 UTC, after the images (nightly.yml, 03:00)
workflow_dispatch:
concurrency:
group: qemu # every workflow shares this one group (Captain Bob, 2026-11-07: a
cancel-in-progress: false # runner-image rebuild blocks other jobs, always): one run at a time
# No concurrency group (Captain Bob, 2026-11-11, #140: "It should be global"). The one runner
# (starshipos-vps) has capacity 1, so every job of every workflow waits its turn in Gitea's queue
# and none is cancelled; a runner-image rebuild still blocks the rest (2026-11-07). A shared
# concurrency group kept only one waiting run, and each run that joined cancelled it.
jobs:
docs:
+4 -4
View File
@@ -20,10 +20,10 @@ on:
- cron: '0 3 * * *' # 03:00 UTC; the documents are at 04:00 (nightly-docs.yml)
workflow_dispatch:
concurrency:
group: qemu # every workflow shares this one group: one run at a time,
# a runner-image rebuild included (Captain Bob, 2026-11-07)
cancel-in-progress: false
# No concurrency group (Captain Bob, 2026-11-11, #140: "It should be global"). The one runner
# (starshipos-vps) has capacity 1, so every job of every workflow waits its turn in Gitea's queue
# and none is cancelled; a runner-image rebuild still blocks the rest (2026-11-07). A shared
# concurrency group kept only one waiting run, and each run that joined cancelled it.
jobs:
nightly:
+4 -4
View File
@@ -18,10 +18,10 @@ on:
push:
tags: ['v*']
concurrency:
group: qemu # every workflow shares this one group: one run at a time,
# a runner-image rebuild included (Captain Bob, 2026-11-07)
cancel-in-progress: false
# No concurrency group (Captain Bob, 2026-11-11, #140: "It should be global"). The one runner
# (starshipos-vps) has capacity 1, so every job of every workflow waits its turn in Gitea's queue
# and none is cancelled; a runner-image rebuild still blocks the rest (2026-11-07). A shared
# concurrency group kept only one waiting run, and each run that joined cancelled it.
jobs:
release:
+4 -3
View File
@@ -17,9 +17,10 @@ on:
paths: ['ci/runner-image/**', 'Makefile']
workflow_dispatch:
concurrency:
group: qemu # every workflow shares this one group (Captain Bob, 2026-11-07: a
cancel-in-progress: false # runner-image rebuild blocks other jobs, always): one run at a time
# No concurrency group (Captain Bob, 2026-11-11, #140: "It should be global"). The one runner
# (starshipos-vps) has capacity 1, so every job of every workflow waits its turn in Gitea's queue
# and none is cancelled; a runner-image rebuild still blocks the rest (2026-11-07). A shared
# concurrency group kept only one waiting run, and each run that joined cancelled it.
jobs:
image:
+18
View File
@@ -6547,3 +6547,21 @@ and memorize frequently so we can pick up where we left off").
release was a pre-release; now it is not. The tag stays on `93828e0e`, its 13 assets unchanged;
moving a tag was not an option (tags are sacred), and today's work ships as alpha.5.
### 19. #140: one queue for all of CI, nothing cancelled (2026-11-11)
- **Found again:** Build runs 245 and 247 (the board images and the v4 tests) were cancelled at 0 s on
two pushes to PR 164's branch: the push queued Build in the shared `qemu` group, the PR's
Acceptance run joined seconds later, and a group keeps one running and **one waiting** run -- the
joining run cancelled the waiting one. The v4 tests were run by hand instead (79 programs, 0
failures; `logs/20261111-193825/v4-test`).
- **Ruled** (Captain Bob): "It should be global" -- one queue for all of CI. The runner
(`starshipos-vps`) has capacity 1 (Captain Bob: "capacity is 1").
- **Built:** the `concurrency:` block is gone from all six workflows, each with a comment saying why;
`.claude/CLAUDE.md`'s CI section corrected. With one runner at capacity 1, every job of every
workflow waits in Gitea's queue and none is cancelled; a runner-image rebuild still blocks the rest
(2026-11-07). What changes: the runner takes **jobs**, not runs, so another workflow's job may run
between two of Build's -- never beside one; one QEMU at a time holds.
- **Left to Captain Bob:** the offline duplicate runner registration (id 1, also `starshipos-vps`) --
removed, it can never take a job if it comes back. #140's "Done when" is met by this entry and the
workflows' comments once it reaches `master`.