The journeys stack is per-run, and publishes nothing on a runner (#728) #757
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/journeys-concurrent-runs"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
#754's journeys job failed having run no test at all:
on a backend-only PR, ten seconds after the stack came up. That is not a flake, and it is not that PR's doing.
What was actually happening
The job ran
docker compose -p questboard-e2e— hard-coded, and hard-coded again in the teardown step. So two overlapping runs (two open PRs, or a PR and the push tomainthat merged another) were one Compose project on one runner. The secondupadopted the first's containers and restarted them, and the first job, sitting on its own redis healthcheck, watched redis stop cleanly underneath it and reported a dependency failure.The tell is in the log: every line of that job's compose output is duplicated — two processes narrating the same project.
This gets likelier the more of the rebuild is in flight at once, which is why it turned up now and not during lane 1, when PRs went up roughly one at a time. With lanes 3 to 11 still to go it would have kept costing cycles and, worse, kept looking like a flake — the failure has no test in it to point at.
The fix, which has to be both halves
A unique project name alone would only move the collision to the host ports, because the e2e overlay publishes five of them.
COMPOSE_PROJECT_NAME: questboard-e2e-${{ github.run_id }}, used by the run —scripts/journeys.shalready honoured the variable — and by the teardown, which had the old name written out.QB_E2E_NO_PORTS=1adds a newdocker-compose.e2e.ci.yml, which resets the five published ports.Dropping them costs nothing, and the overlay already said so in its own comments before this PR: "Published on FRONTEND_HTTP_PORT … so a person can watch the stack in a real browser. The suite does not use it", "Inspection only", "The web UI, for a human reading what the stack sent". The suite reaches the stack by service name —
playwright.config.jssetsbaseURLtohttp://frontend— so on a runner, where nobody is watching, those bindings only stop a second stack from starting.Local runs are unchanged, deliberately. Those ports are the whole point of
KEEP_STACK=1, and the script's header and the e2e README both say not to set the flag by hand.Checks
sh -n scripts/journeys.shclean; the workflow parses and still has its ten jobs, with the teardown reading the variable and including the new overlay. The merged Compose config rendered both ways: five published ports without the overlay, none with it, and the same ten services either way.The real proof is this PR's own journeys job — and, better, the next two runs that overlap.
🤖 Generated with Claude Code