Fix: Percy CLI hangs on Node.js 26 during Chromium extraction (PER-10062) #6195
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Windows | |
| on: | |
| push: | |
| branches: [master] | |
| pull_request: | |
| workflow_dispatch: | |
| permissions: | |
| contents: read | |
| jobs: | |
| build: | |
| name: Build | |
| # Skip CI only for the automated release PR: opened by github-actions[bot], | |
| # from this same repo, on a release/* branch (the Create Release PR workflow | |
| # posts the required checks as passing for it). Keyed on the PR author, not the | |
| # branch name, so a "release/…" branch can't be used to bypass required checks. | |
| if: >- | |
| ${{ !(github.event_name == 'pull_request' | |
| && github.event.pull_request.user.login == 'github-actions[bot]' | |
| && github.event.pull_request.head.repo.full_name == github.repository | |
| && startsWith(github.head_ref, 'release/')) }} | |
| runs-on: windows-latest | |
| steps: | |
| - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 | |
| - uses: actions/setup-node@3235b876344d2a9aa001b8d1453c930bba69e610 # v3.9.1 | |
| with: | |
| node-version: 14 | |
| - uses: actions/cache@f4b3439a656ba812b8cb417d2d49f9c810103092 # v3.4.0 | |
| with: | |
| path: | | |
| node_modules | |
| packages/*/node_modules | |
| packages/core/.local-chromium | |
| key: > | |
| ${{ runner.os }}/node-14/ | |
| ${{ hashFiles('.github/.cache-key') }}/ | |
| ${{ hashFiles('**/yarn.lock') }} | |
| restore-keys: > | |
| ${{ runner.os }}/node-14/ | |
| ${{ hashFiles('.github/.cache-key') }}/ | |
| - run: yarn | |
| - run: yarn build | |
| - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 | |
| with: | |
| name: dist | |
| path: packages/*/dist | |
| test: | |
| name: Test ${{ matrix.package }} | |
| # Skip only for the automated release PR (see the build job for rationale). | |
| if: >- | |
| ${{ !(github.event_name == 'pull_request' | |
| && github.event.pull_request.user.login == 'github-actions[bot]' | |
| && github.event.pull_request.head.repo.full_name == github.repository | |
| && startsWith(github.head_ref, 'release/')) }} | |
| needs: [build] | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| package: | |
| - '@percy/env' | |
| - '@percy/client' | |
| - '@percy/dom' | |
| - '@percy/logger' | |
| - '@percy/config' | |
| - '@percy/core' | |
| - '@percy/cli' | |
| - '@percy/cli-command' | |
| - '@percy/cli-exec' | |
| - '@percy/cli-snapshot' | |
| - '@percy/cli-upload' | |
| - '@percy/cli-build' | |
| - '@percy/cli-config' | |
| - '@percy/sdk-utils' | |
| - '@percy/webdriver-utils' | |
| - '@percy/monitoring' | |
| - '@percy/cli-doctor' | |
| runs-on: windows-latest | |
| # Collect failed node-test spec names here so retries can re-run only the | |
| # specs that flaked instead of the whole ~60-min suite. See PER-9011. | |
| # Name is deliberately non-PERCY_ so it doesn't trip env-audit tests. | |
| env: | |
| CLI_TEST_FAILURES_FILE: ${{ github.workspace }}/.cli-test-failures.json | |
| steps: | |
| - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 | |
| - uses: actions/setup-node@3235b876344d2a9aa001b8d1453c930bba69e610 # v3.9.1 | |
| with: | |
| node-version: 14 | |
| - uses: actions/cache@f4b3439a656ba812b8cb417d2d49f9c810103092 # v3.4.0 | |
| with: | |
| path: | | |
| node_modules | |
| packages/*/node_modules | |
| packages/core/.local-chromium | |
| key: > | |
| ${{ runner.os }}/node-14/ | |
| ${{ hashFiles('.github/.cache-key') }}/ | |
| ${{ hashFiles('**/yarn.lock') }} | |
| restore-keys: > | |
| ${{ runner.os }}/node-14/ | |
| ${{ hashFiles('.github/.cache-key') }}/ | |
| - uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 | |
| with: | |
| name: dist | |
| path: packages | |
| - run: yarn | |
| # First attempt runs the full suite and records any failed specs. | |
| - name: Run tests | |
| continue-on-error: true | |
| id: retry0 | |
| run: yarn workspace ${{ matrix.package }} test --colors | |
| # Retries re-run ONLY the specs that failed in the previous attempt | |
| # (CLI_TEST_ONLY_FAILED), so a flaky spec costs seconds, not ~60 min. | |
| - name: Run tests Retry (1/4) | |
| continue-on-error: true | |
| id: retry1 | |
| if: steps.retry0.outcome=='failure' | |
| env: | |
| CLI_TEST_ONLY_FAILED: '1' | |
| run: yarn workspace ${{ matrix.package }} test --colors | |
| - name: Run tests Retry (2/4) | |
| continue-on-error: true | |
| id: retry2 | |
| if: steps.retry1.outcome=='failure' | |
| env: | |
| CLI_TEST_ONLY_FAILED: '1' | |
| run: yarn workspace ${{ matrix.package }} test --colors | |
| - name: Run tests Retry (3/4) | |
| continue-on-error: true | |
| id: retry3 | |
| if: steps.retry2.outcome=='failure' | |
| env: | |
| CLI_TEST_ONLY_FAILED: '1' | |
| run: yarn workspace ${{ matrix.package }} test --colors | |
| - name: Run tests Retry (4/4) | |
| id: retry4 | |
| if: steps.retry3.outcome=='failure' | |
| env: | |
| CLI_TEST_ONLY_FAILED: '1' | |
| run: yarn workspace ${{ matrix.package }} test --colors | |
| # Keep "green via retry" honest: surface a warning whenever the first | |
| # attempt failed and a retry recovered it, so flakiness stays visible. | |
| - name: Flag flaky tests | |
| if: steps.retry0.outcome=='failure' | |
| run: echo "::warning title=Flaky Windows tests::${{ matrix.package }} flaked on the first attempt and was recovered by a spec-level retry (tracked in PER-9011)." |