ci: serialize go-unit/ui-test/integration to fix the runner workspace race #86

Closed
developer wants to merge 1 commits from feature/ci-serialize-runner-jobs into development
Owner

What & why

Fixes the recurring go-unit false-failure. The go-unit, ui-test, and
integration jobs run on the host runner, which shares a single workspace.
When they run concurrently they race on workspace teardown: ui-test's
production build (pnpm test:pwa) leaves a root-owned ui/frontend/build
that a sibling job's non-root cleanup cannot remove, and act_runner then
marks that job failed (unlinkat … permission denied) even though its tests
passed. This repeatedly hit go-unit when it overlapped a ui-test build.

Fix

Put all three jobs in one global concurrency group (galaxy-host-runner,
cancel-in-progress: false) so only one runs at a time on the runner — they
can no longer collide on the shared workspace. This subsumes ui-test's former
ui-test-singleton group (which guarded the Playwright :5173 port); the
shared group preserves that guarantee. Runs queue rather than cancel.

Trade-off: CI is more serial — these three queue instead of running in
parallel, so a full run is slower in wall-clock. Accepted to make the runs
reliable.

Note

Deferred follow-up to the rules PR (#85). The earlier #84 cleanup (ui-test
removing its build artifacts at job end) only covered the sequential case;
this serialization closes the concurrent race.

## What & why Fixes the recurring `go-unit` false-failure. The `go-unit`, `ui-test`, and `integration` jobs run on the host runner, which shares a single workspace. When they run concurrently they race on workspace teardown: ui-test's production build (`pnpm test:pwa`) leaves a root-owned `ui/frontend/build` that a sibling job's non-root cleanup cannot remove, and `act_runner` then marks that job failed (`unlinkat … permission denied`) even though its tests passed. This repeatedly hit `go-unit` when it overlapped a ui-test build. ## Fix Put all three jobs in one global concurrency group (`galaxy-host-runner`, `cancel-in-progress: false`) so only one runs at a time on the runner — they can no longer collide on the shared workspace. This subsumes ui-test's former `ui-test-singleton` group (which guarded the Playwright `:5173` port); the shared group preserves that guarantee. Runs queue rather than cancel. Trade-off: CI is more serial — these three queue instead of running in parallel, so a full run is slower in wall-clock. Accepted to make the runs reliable. ## Note Deferred follow-up to the rules PR (#85). The earlier #84 cleanup (ui-test removing its build artifacts at job end) only covered the sequential case; this serialization closes the concurrent race.
developer added 1 commit 2026-05-31 16:12:02 +00:00
ci: serialize go-unit/ui-test/integration on a shared concurrency group
Tests · Go / test (push) Has been cancelled
Tests · Go / test (pull_request) Has been cancelled
Tests · Integration / integration (pull_request) Has been cancelled
Tests · UI / test (push) Waiting to run
Tests · UI / test (pull_request) Successful in 3m11s
046857177e
These three jobs run on the host runner, which shares a single workspace.
Run concurrently, they race on workspace teardown: ui-test's production
build leaves a root-owned ui/frontend/build that a sibling job's (non-root)
cleanup cannot remove, which then spuriously fails that job — observed
repeatedly on go-unit when it overlapped a ui-test build. Put all three in
one global concurrency group (galaxy-host-runner, cancel-in-progress:
false) so they run one at a time and never collide. CI becomes more serial
but the false failures stop.

This also subsumes ui-test's former ui-test-singleton group, which guarded
the Playwright :5173 port; the shared group preserves that guarantee.
developer closed this pull request 2026-05-31 16:28:09 +00:00
Some checks are pending
Tests · Go / test (push) Has been cancelled
Tests · Go / test (pull_request) Has been cancelled
Tests · Integration / integration (pull_request) Has been cancelled
Tests · UI / test (push) Waiting to run
Tests · UI / test (pull_request) Successful in 3m11s

Pull request closed

Sign in to join this conversation.