name: Playwright Tests on: push: branches: - main - bt pull_request: types: - opened - synchronize workflow_dispatch: jobs: test-playwright: timeout-minutes: 60 runs-on: ubuntu-latest steps: - name: Checkout run: | set -euo pipefail git clone "http://172.17.0.1:3000/${{ github.repository }}.git" . git checkout "${{ github.sha }}" - name: Detect relevant file changes id: changes run: | set -euo pipefail CHANGED=false if [ "${{ github.event_name }}" = "pull_request" ]; then BASE="${{ github.base_ref }}" git fetch origin "+refs/heads/${BASE}:refs/remotes/origin/${BASE}" --depth=200 2>/dev/null \ || git fetch origin --depth=200 if git rev-parse "origin/${BASE}" >/dev/null 2>&1; then FILES=$(git diff --name-only "origin/${BASE}...HEAD" || true) else FILES=$(git show --name-only --pretty=format: HEAD) fi else BEFORE="${{ github.event.before }}" if [ -z "${BEFORE}" ] || [ "${BEFORE}" = "0000000000000000000000000000000000000000" ]; then FILES=$(git show --name-only --pretty=format: HEAD) else FILES=$(git diff --name-only "${BEFORE}" "${{ github.sha }}" || true) fi fi while IFS= read -r line; do [ -z "${line}" ] && continue case "${line}" in backend/*|frontend/*|.env|compose*|.gitea/workflows/playwright.yml|.github/workflows/playwright.yml) CHANGED=true break ;; esac done <<< "${FILES}" echo "changed=${CHANGED}" >> "${GITHUB_OUTPUT}" echo "Relevant changes for Playwright: ${CHANGED}" - name: Skip Playwright (no relevant changes) if: steps.changes.outputs.changed != 'true' run: echo "Skipping Playwright — no changes under backend/, frontend/, compose, .env, or playwright workflows." - name: Install uv and Bun if: steps.changes.outputs.changed == 'true' run: | set -euo pipefail export PATH="${HOME}/.local/bin:${HOME}/.bun/bin:${PATH}" export UV_PYTHON_DOWNLOADS=automatic sudo apt-get update -qq sudo apt-get install -y python3 python3-pip python3-venv curl unzip ca-certificates python3 -m pip install --user --upgrade pip python3 -m pip install --user "uv>=0.4" # Official Bun installer (not GitHub Actions) curl -fsSL https://bun.sh/install | bash - name: Generate client, build images, run Playwright if: steps.changes.outputs.changed == 'true' run: | set -euo pipefail export PATH="${HOME}/.local/bin:${HOME}/.bun/bin:${PATH}" export BUN_INSTALL="${HOME}/.bun" (cd backend && uv sync) bun ci bash scripts/generate-client.sh docker compose build docker compose down -v --remove-orphans || true docker compose run --rm playwright bunx playwright test \ --fail-on-flaky-tests \ --trace=retain-on-failure docker compose down -v --remove-orphans || true