name: E2E Tests on: push: branches: [master] pull_request: branches: [master] concurrency: group: e2e-${{ github.ref }} cancel-in-progress: true jobs: e2e: name: Playwright E2E runs-on: ubuntu-latest timeout-minutes: 20 env: CI: true steps: - name: Checkout uses: actions/checkout@v4 - name: Install pnpm uses: pnpm/action-setup@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 22 cache: pnpm - name: Install dependencies run: pnpm install --frozen-lockfile - name: Load E2E environment run: awk 'NF && $1 !~ /^#/' .env.test >> "$GITHUB_ENV" - name: Start CI service stack run: docker compose --env-file .env.ci -f docker-compose.ci.yml up -d --wait - name: Cache Playwright browsers id: playwright-cache uses: actions/cache@v4 with: path: ~/.cache/ms-playwright key: playwright-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }} - name: Install Playwright browsers if: steps.playwright-cache.outputs.cache-hit != 'true' run: npx playwright install --with-deps chromium - name: Install Playwright system deps if: steps.playwright-cache.outputs.cache-hit == 'true' run: npx playwright install-deps chromium - name: Generate Prisma client run: pnpm db:generate - name: Run database migrations run: pnpm db:migrate:deploy - name: Seed database run: pnpm db:seed - name: Run E2E tests run: pnpm test:e2e - name: Upload Playwright report if: ${{ !cancelled() }} uses: actions/upload-artifact@v4 with: name: playwright-report path: playwright-report/ retention-days: 14 - name: Upload Playwright traces if: failure() uses: actions/upload-artifact@v4 with: name: playwright-traces path: test-results/ retention-days: 7 - name: Stop CI service stack if: always() run: docker compose --env-file .env.ci -f docker-compose.ci.yml down -v