name: Core E2E Tests on: pull_request: branches: - main paths: - 'frontend-modern/**' - 'internal/**' - 'tests/integration/**' - 'Dockerfile' - '.github/workflows/test-e2e.yml' push: branches: - main - master paths: - 'frontend-modern/**' - 'internal/**' - 'tests/integration/**' - 'Dockerfile' - '.github/workflows/test-e2e.yml' workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: e2e: name: Playwright Core E2E runs-on: ubuntu-latest timeout-minutes: 45 # E2E tests are smoke tests - they run but don't block merges # This reduces friction from flaky tests while maintaining visibility continue-on-error: true steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' cache-dependency-path: tests/integration/package-lock.json - name: Install Playwright dependencies working-directory: tests/integration run: | npm ci npx playwright install --with-deps chromium - name: Build Docker images for test environment run: | docker build -t pulse-mock-github:test ./tests/integration/mock-github-server docker build -t pulse:test -f Dockerfile --build-arg PULSE_LICENSE_PUBLIC_KEY="$PULSE_LICENSE_PUBLIC_KEY" . env: PULSE_LICENSE_PUBLIC_KEY: ${{ secrets.PULSE_LICENSE_PUBLIC_KEY }} - name: Start test containers working-directory: tests/integration env: PULSE_E2E_BOOTSTRAP_TOKEN: 0123456789abcdef0123456789abcdef0123456789abcdef PULSE_E2E_SKIP_PLAYWRIGHT_INSTALL: "true" run: node scripts/pretest.mjs - name: Run E2E suite working-directory: tests/integration env: PULSE_E2E_BOOTSTRAP_TOKEN: 0123456789abcdef0123456789abcdef0123456789abcdef PULSE_E2E_SKIP_DOCKER: "true" PULSE_E2E_SKIP_PLAYWRIGHT_INSTALL: "true" run: npm test - name: Collect container logs if: always() working-directory: tests/integration run: | echo "=== Docker containers ===" docker ps -a echo "=== Pulse test server logs ===" docker logs pulse-test-server 2>&1 || echo "No pulse-test-server container" echo "=== Mock GitHub server logs ===" docker logs pulse-mock-github 2>&1 || echo "No pulse-mock-github container" - name: Upload Playwright report if: always() uses: actions/upload-artifact@v4 with: name: playwright-report path: tests/integration/playwright-report/ retention-days: 30 - name: Upload test videos and screenshots if: failure() uses: actions/upload-artifact@v4 with: name: test-failures path: tests/integration/test-results/ retention-days: 7