name: E2E Tests on: workflow_dispatch: inputs: browser-name: description: "Name used for cache keys and artifact names (e.g. chromium, other-browser)" required: false default: "other-browser" type: string projects: description: "Playwright --project flags (e.g. --project=firefox --project=webkit)" required: false default: "--project=firefox --project=webkit" type: string timeout-minutes: description: "Job timeout in minutes" required: false default: "30" type: string workflow_call: inputs: browser-name: description: "Name used for cache keys and artifact names (e.g. chromium, other-browser)" required: true type: string projects: description: "Playwright --project flags (e.g. --project=chromium)" required: true type: string timeout-minutes: description: "Job timeout in minutes" required: false type: number default: 30 permissions: contents: read jobs: install-dependencies: uses: ./.github/workflows/dependencies.yml with: node_version: "22.x" with-front-dependencies-installation: true prepare-e2e: runs-on: ubuntu-latest needs: install-dependencies timeout-minutes: 10 permissions: contents: read steps: - name: Checkout uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Setup Node.js uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7 with: node-version: "24.x" - name: Restore the frontend cache uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6 with: path: "src/frontend/**/node_modules" key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }} fail-on-cache-miss: true - name: Restore Playwright browsers cache id: playwright-cache uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6 with: path: ~/.cache/ms-playwright key: playwright-${{ runner.os }}-${{ hashFiles('src/frontend/yarn.lock', 'src/frontend/apps/e2e/yarn.lock') }} restore-keys: | playwright-${{ runner.os }}- - name: Install Playwright browsers if: steps.playwright-cache.outputs.cache-hit != 'true' run: | cd src/frontend/apps/e2e yarn install-playwright chromium firefox webkit - name: Save Playwright browsers cache if: steps.playwright-cache.outputs.cache-hit != 'true' uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6 with: path: ~/.cache/ms-playwright key: ${{ steps.playwright-cache.outputs.cache-primary-key }} test-e2e: needs: prepare-e2e runs-on: ubuntu-latest timeout-minutes: ${{ inputs.timeout-minutes }} steps: - name: Checkout repository uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Setup Node.js uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7 with: node-version: "24.x" - name: Restore the frontend cache uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6 with: path: "src/frontend/**/node_modules" key: front-node_modules-${{ hashFiles('src/frontend/**/yarn.lock') }} fail-on-cache-miss: true - name: Set e2e env variables run: cat env.d/development/common.e2e >> env.d/development/common.local - name: Restore Playwright browsers cache uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6 with: path: ~/.cache/ms-playwright key: playwright-${{ runner.os }}-${{ hashFiles('src/frontend/yarn.lock', 'src/frontend/apps/e2e/yarn.lock') }} fail-on-cache-miss: true - name: Free disk space before Docker uses: ./.github/actions/free-disk-space - name: Start Docker services run: make bootstrap-e2e FLUSH_ARGS='--no-input' - name: Restore last-run cache if: ${{ github.run_attempt > 1 }} id: restore-last-run uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6 with: path: src/frontend/apps/e2e/test-results/.last-run.json key: playwright-last-run-${{ github.run_id }}-${{ inputs.browser-name }} - name: Run e2e tests env: PLAYWRIGHT_LIST_PRINT_STEPS: true FORCE_COLOR: true run: | cd src/frontend/ LAST_FAILED_FLAG="" if [ "${{ github.run_attempt }}" != "1" ]; then LAST_RUN_FILE="apps/e2e/test-results/.last-run.json" if [ -f "$LAST_RUN_FILE" ]; then FAILED_COUNT=$(jq '.failedTests | length' "$LAST_RUN_FILE" 2>/dev/null || echo "0") if [ "${FAILED_COUNT:-0}" -gt "0" ]; then LAST_FAILED_FLAG="--last-failed" fi fi fi yarn e2e:test ${{ inputs.projects }} $LAST_FAILED_FLAG - name: Save last-run cache if: always() uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6 with: path: src/frontend/apps/e2e/test-results/.last-run.json key: playwright-last-run-${{ github.run_id }}-${{ inputs.browser-name }} - name: Upload last-run artifact if: always() uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: playwright-instance-last-run-${{ inputs.browser-name }} path: src/frontend/apps/e2e/test-results/.last-run.json include-hidden-files: true if-no-files-found: warn retention-days: 7 - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 if: always() with: name: playwright-${{ inputs.browser-name }}-report path: src/frontend/apps/e2e/report/ retention-days: 7