name: E2E Tests on: push: branches: - dev - master pull_request: branches: - dev - master workflow_dispatch: env: NODE_OPTIONS: --max_old_space_size=6144 concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true permissions: contents: read jobs: prepare-dependencies: name: Prepare dependencies runs-on: ubuntu-latest steps: - name: Check out files from GitHub uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Prepare dependencies uses: ./.github/actions/prepare-dependencies prepare-container-dependencies: name: Prepare container dependencies runs-on: ubuntu-latest container: image: mcr.microsoft.com/playwright:v1.62.1-noble options: --user 1001 defaults: run: shell: bash steps: - name: Check out files from GitHub uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Prepare dependencies uses: ./.github/actions/prepare-dependencies with: node-modules-cache-key: node-modules-container-v1 # ── Build the demo once and share it across test jobs via artifact ────────── build-demo: name: Build demo needs: prepare-dependencies runs-on: ubuntu-latest steps: - name: Check out files from GitHub uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Node with shared dependencies uses: ./.github/actions/setup with: node-modules-cache: true - name: Build demo uses: ./.github/actions/build with: target: build-demo-e2e github-token: ${{ secrets.GITHUB_TOKEN }} is-test: true - name: Upload demo build uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: demo-dist path: demo/dist/ if-no-files-found: error retention-days: 3 # ── Build the e2e test app and share it via artifact ──────────────────────── build-e2e-test-app: name: Build e2e test app needs: prepare-dependencies runs-on: ubuntu-latest steps: - name: Check out files from GitHub uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Node with shared dependencies uses: ./.github/actions/setup with: node-modules-cache: true - name: Build e2e test app uses: ./.github/actions/build with: target: build-e2e-test-app-e2e github-token: ${{ secrets.GITHUB_TOKEN }} is-test: true - name: Upload e2e test app build uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: e2e-test-app-dist path: test/e2e/app/dist/ if-no-files-found: error retention-days: 3 # ── Build the gallery and share it via artifact ───────────────────────────── build-gallery: name: Build gallery needs: prepare-dependencies runs-on: ubuntu-latest steps: - name: Check out files from GitHub uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Node with shared dependencies uses: ./.github/actions/setup with: node-modules-cache: true - name: Build gallery uses: ./.github/actions/build with: target: build-gallery github-token: ${{ secrets.GITHUB_TOKEN }} is-test: true - name: Upload gallery build uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: gallery-dist path: gallery/dist/ if-no-files-found: error retention-days: 3 # ── Run Playwright tests against Chromium ────────────────────────────────── e2e-demo: name: E2E demo (${{ matrix.shardIndex }}/${{ matrix.shardTotal }}) needs: - build-demo - prepare-container-dependencies runs-on: ubuntu-latest container: image: mcr.microsoft.com/playwright:v1.62.1-noble options: --user 1001 --ipc=host defaults: run: shell: bash timeout-minutes: 20 strategy: fail-fast: false matrix: shardIndex: - 1 - 2 shardTotal: - 2 steps: - name: Check out files from GitHub uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Node with shared dependencies uses: ./.github/actions/setup with: node-modules-cache: true node-modules-cache-key: node-modules-container-v1 - name: Download demo build uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: demo-dist path: demo/dist/ - name: Run Playwright demo tests run: yarn test:e2e:demo --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} timeout-minutes: 15 - name: Upload demo blob report uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 if: always() with: name: blob-report-demo-${{ matrix.shardIndex }} path: test/e2e/reports/demo/ if-no-files-found: warn retention-days: 3 e2e-app: name: E2E app (${{ matrix.shardIndex }}/${{ matrix.shardTotal }}) needs: - build-e2e-test-app - prepare-container-dependencies runs-on: ubuntu-latest container: image: mcr.microsoft.com/playwright:v1.62.1-noble options: --user 1001 --ipc=host defaults: run: shell: bash timeout-minutes: 20 strategy: fail-fast: false matrix: shardIndex: - 1 - 2 - 3 - 4 shardTotal: - 4 steps: - name: Check out files from GitHub uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Node with shared dependencies uses: ./.github/actions/setup with: node-modules-cache: true node-modules-cache-key: node-modules-container-v1 - name: Download e2e test app build uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: e2e-test-app-dist path: test/e2e/app/dist/ - name: Run Playwright app tests run: yarn test:e2e:app --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} timeout-minutes: 15 - name: Upload app blob report uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 if: always() with: name: blob-report-app-${{ matrix.shardIndex }} path: test/e2e/reports/app/ if-no-files-found: warn retention-days: 3 e2e-gallery: name: E2E gallery (${{ matrix.shardIndex }}/${{ matrix.shardTotal }}) needs: - build-gallery - prepare-container-dependencies runs-on: ubuntu-latest container: image: mcr.microsoft.com/playwright:v1.62.1-noble options: --user 1001 --ipc=host defaults: run: shell: bash timeout-minutes: 20 strategy: fail-fast: false matrix: shardIndex: - 1 - 2 - 3 - 4 shardTotal: - 4 steps: - name: Check out files from GitHub uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Node with shared dependencies uses: ./.github/actions/setup with: node-modules-cache: true node-modules-cache-key: node-modules-container-v1 - name: Download gallery build uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: gallery-dist path: gallery/dist/ - name: Run Playwright gallery tests run: yarn test:e2e:gallery --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} timeout-minutes: 15 - name: Upload gallery blob report uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 if: always() with: name: blob-report-gallery-${{ matrix.shardIndex }} path: test/e2e/reports/gallery/ if-no-files-found: warn retention-days: 3 report: name: Report needs: - e2e-demo - e2e-app - e2e-gallery runs-on: ubuntu-latest if: ${{ always() }} permissions: contents: read pull-requests: write steps: - name: Check out files from GitHub uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Node with shared dependencies uses: ./.github/actions/setup with: node-modules-cache: true - name: Download demo blob reports uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 continue-on-error: true with: pattern: blob-report-demo-* path: test/e2e/reports/demo/ - name: Download app blob reports uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 continue-on-error: true with: pattern: blob-report-app-* path: test/e2e/reports/app/ - name: Download gallery blob reports uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 continue-on-error: true with: pattern: blob-report-gallery-* path: test/e2e/reports/gallery/ - name: Stage blobs for merge run: node test/e2e/collect-blob-reports.mjs - name: Merge blob reports run: npx playwright merge-reports -c test/e2e/playwright.merge.config.ts test/e2e/reports/blob - name: Upload merged HTML report id: upload-report uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: playwright-report path: test/e2e/reports/combined/ retention-days: 14 - name: Post report to PR if: >- github.event_name == 'pull_request' && (needs.e2e-demo.result == 'failure' || needs.e2e-app.result == 'failure' || needs.e2e-gallery.result == 'failure') uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: script: | const { default: postReportComment } = await import( `${process.env.GITHUB_WORKSPACE}/test/e2e/post-report-comment.mjs` ); await postReportComment({ github, context, core }); - name: Check suite results run: | failed=0 for suite in \ "demo:${{ needs.e2e-demo.result }}" \ "app:${{ needs.e2e-app.result }}" \ "gallery:${{ needs.e2e-gallery.result }}"; do name="${suite%%:*}" result="${suite#*:}" echo "E2E ${name}: ${result}" if [ "$result" != "success" ]; then failed=1 fi done exit "$failed"