diff --git a/.gitea/workflows/go-unit.yaml b/.gitea/workflows/go-unit.yaml index b961d6a..6f26043 100644 --- a/.gitea/workflows/go-unit.yaml +++ b/.gitea/workflows/go-unit.yaml @@ -30,6 +30,17 @@ on: - '.gitea/workflows/go-unit.yaml' - '!**/*.md' +# Serialised with ui-test and integration via a shared concurrency group. +# All three run on the host runner, which shares a single workspace, so +# running them at the same time races on workspace teardown: the +# root-owned ui/frontend/build that ui-test's production build leaves +# behind cannot be removed by a sibling job's (non-root) cleanup, which +# then spuriously fails that job. One global group runs them one at a +# time; cancel-in-progress: false queues runs instead of cancelling them. +concurrency: + group: galaxy-host-runner + cancel-in-progress: false + jobs: test: runs-on: ubuntu-latest diff --git a/.gitea/workflows/integration.yaml b/.gitea/workflows/integration.yaml index 85d61cd..43c1c83 100644 --- a/.gitea/workflows/integration.yaml +++ b/.gitea/workflows/integration.yaml @@ -37,6 +37,14 @@ on: - '.gitea/workflows/integration.yaml' - '!**/*.md' +# Shared concurrency group with go-unit and ui-test: the host runner uses +# one workspace, so these jobs must not run concurrently or they race on +# workspace teardown (see go-unit.yaml for the full rationale). Runs are +# queued, not cancelled. +concurrency: + group: galaxy-host-runner + cancel-in-progress: false + jobs: integration: runs-on: ubuntu-latest diff --git a/.gitea/workflows/ui-test.yaml b/.gitea/workflows/ui-test.yaml index 8cfb439..c98368b 100644 --- a/.gitea/workflows/ui-test.yaml +++ b/.gitea/workflows/ui-test.yaml @@ -18,14 +18,16 @@ on: # Playwright launches its own `pnpm dev` on :5173, and in host-mode # the runner shares the host's port namespace with every other job, -# so two parallel ui-test runs collide on EADDRINUSE. Serialise via a -# singleton concurrency group with queueing — new runs wait their -# turn instead of cancelling the in-progress one. cancel-in-progress -# is explicitly false because Gitea has shown spurious self-cancel -# behaviour under cancel-in-progress: true even when no other run -# shares the group. +# so two parallel ui-test runs collide on EADDRINUSE. Serialise via the +# shared `galaxy-host-runner` concurrency group (also used by go-unit and +# integration) with queueing — new runs wait their turn instead of +# cancelling the in-progress one. The shared group additionally avoids the +# host-workspace teardown race those jobs hit (see go-unit.yaml). New runs +# wait their turn; cancel-in-progress is explicitly false because Gitea has +# shown spurious self-cancel behaviour under cancel-in-progress: true even +# when no other run shares the group. concurrency: - group: ui-test-singleton + group: galaxy-host-runner cancel-in-progress: false jobs: