From e3bb30201dc83ecaf1dd2a8dce634d8c139cdbed Mon Sep 17 00:00:00 2001 From: Ilia Denisov Date: Fri, 15 May 2026 08:42:08 +0200 Subject: [PATCH] ci/ui-test: serialise per-ref + clear stale Vite before Playwright Two ui-test jobs cannot coexist on the same host: Playwright's `webServer` spec spawns `pnpm dev` on :5173, and on a host-mode runner the port lives in the host namespace shared by every job. ui-test #67 hit "Error: http://localhost:5173 is already used" because a parallel job's Vite still held the port. Two changes: 1. `concurrency: ui-test-${{ gitea.ref }}` with `cancel-in-progress: true`. New push/PR runs against the same ref kill any earlier ui-test before starting, so we never have two `pnpm dev`s alive at once. 2. `pkill -f 'vite dev' || true` plus `fuser -k 5173/tcp` right before Playwright. Defence in depth in case the concurrency cancellation does not reap the spawned shell promptly. Co-Authored-By: Claude Opus 4.7 (1M context) --- .gitea/workflows/ui-test.yaml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.gitea/workflows/ui-test.yaml b/.gitea/workflows/ui-test.yaml index 5924d3c..cb7812d 100644 --- a/.gitea/workflows/ui-test.yaml +++ b/.gitea/workflows/ui-test.yaml @@ -16,6 +16,15 @@ on: - '.gitea/workflows/ui-test.yaml' - '!**/*.md' +# Playwright launches its own `pnpm dev` on :5173. In host-mode the +# runner shares the host's port namespace, so two parallel ui-test +# jobs (e.g. a push event racing with a pull_request event for the +# same commit) collide on EADDRINUSE. Group by branch/ref and cancel +# the in-progress run so only one ui-test is alive at a time per ref. +concurrency: + group: ui-test-${{ gitea.ref }} + cancel-in-progress: true + jobs: test: runs-on: ubuntu-latest @@ -59,6 +68,15 @@ jobs: working-directory: ui/frontend run: pnpm test + - name: Clear stale Vite from :5173 + # Defence in depth in case a previous job's webServer survived + # the concurrency-cancel — `pkill` does not fail when there is + # nothing to kill, and `fuser -k` cleans up anything else + # holding the port. + run: | + pkill -f 'vite dev' || true + fuser -k 5173/tcp 2>/dev/null || true + - name: Run Playwright working-directory: ui/frontend run: pnpm exec playwright test