name: Preview smoke # Waits for Vercel's per-PR Preview deployment to be ready, then runs # Playwright smoke against its URL. # # Vercel's GitHub integration auto-deploys every push and posts a Deployment # to the GitHub API once ready. We wait on that Deployment so we always hit # the canonical preview URL Vercel just published. # # REQUIRES: @playwright/test installed. Until then, this workflow will fail # on `npx playwright install`. See .convoys/ for the testing convoy. on: pull_request: branches: [main] types: [labeled, opened, synchronize, reopened] concurrency: group: preview-smoke-${{ github.event.pull_request.number }} cancel-in-progress: true jobs: gate: name: Should run? runs-on: ubuntu-latest outputs: should_run: ${{ steps.check.outputs.should_run }} steps: - name: Decide id: check run: | if echo "${{ github.event.pull_request.body }}" | grep -qE 'pipeline:.*skip.*\bsmoke\b'; then echo "should_run=false" >> $GITHUB_OUTPUT echo "::notice::Smoke skipped via pipeline directive" else echo "should_run=true" >> $GITHUB_OUTPUT fi smoke: name: Playwright smoke needs: gate if: needs.gate.outputs.should_run == 'true' runs-on: ubuntu-latest timeout-minutes: 15 steps: - uses: actions/checkout@v4 - name: Wait for Vercel Preview deployment id: vercel uses: patrickedqvist/wait-for-vercel-preview@v1.3.2 with: token: ${{ secrets.GITHUB_TOKEN }} max_timeout: 600 - uses: actions/setup-node@v4 with: node-version: '20' cache: npm - run: npm ci - name: Install Playwright browsers run: npx playwright install --with-deps chromium - name: Run smoke tests run: npx playwright test --project=smoke env: BASE_URL: ${{ steps.vercel.outputs.url }} - name: Upload Playwright report on failure if: failure() uses: actions/upload-artifact@v4 with: name: playwright-report path: playwright-report/ retention-days: 7