diff --git a/.github/workflows/frontend-optional.yml b/.github/workflows/frontend-optional.yml deleted file mode 100644 index 2d626c4efb8c..000000000000 --- a/.github/workflows/frontend-optional.yml +++ /dev/null @@ -1,133 +0,0 @@ -name: '[NOT REQUIRED] frontend (optional)' - -on: - pull_request: - -# Cancel in progress workflows on pull_requests. -# https://docs.github.com/en/actions/using-jobs/using-concurrency#example-using-a-fallback-value -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -# hack for https://github.com/actions/cache/issues/810#issuecomment-1222550359 -env: - SEGMENT_DOWNLOAD_TIMEOUT_MINS: 3 - NODE_OPTIONS: '--max-old-space-size=5120' - -jobs: - files-changed: - name: detect what files changed - runs-on: ubuntu-24.04 - timeout-minutes: 3 - # Map a step output to a job output - outputs: - testable_modified: ${{ steps.changes.outputs.testable_modified }} - testable_rules_changed: ${{ steps.changes.outputs.testable_rules_changed }} - typecheckable_rules_changed: ${{ steps.changes.outputs.typecheckable_rules_changed }} - frontend_all: ${{ steps.changes.outputs.frontend_all }} - merge_base: ${{ steps.merge_base.outputs.merge_base }} - steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - with: - fetch-depth: 100 - - - name: Check for frontend file changes - uses: dorny/paths-filter@0bc4621a3135347011ad047f9ecf449bf72ce2bd # v3.0.0 - id: changes - with: - token: ${{ github.token }} - filters: .github/file-filters.yml - list-files: shell - - # On PRs, HEAD is the merge commit; its parents (HEAD^1, HEAD^2) are base and head. - # Merge base of those two is what Jest --changedSince needs. - # If merge base can't be computed or non-frontend files changed, output is empty - # and the optional Jest job will be skipped entirely. - - name: Get merge base for changedSince - id: merge_base - run: | - MERGE_BASE=$(git merge-base HEAD^1 HEAD^2 2>/dev/null) || true - if [ -n "$MERGE_BASE" ]; then - CHANGED=$(git diff --name-only "$MERGE_BASE" HEAD^2) - if echo "$CHANGED" | grep -qvE '^static/'; then - echo "Non-frontend file changed — skipping optional Jest" - MERGE_BASE="" - else - echo "Merge base: $MERGE_BASE (Jest will use --changedSince)" - fi - else - echo "Could not compute merge base — skipping optional Jest" - fi - echo "merge_base=${MERGE_BASE:-}" >> "$GITHUB_OUTPUT" - - # This job intentionally mirrors `frontend-jest-tests` in frontend.yml. - # Our intent is to try it out for a few weeks and see if it's stable. - frontend-jest-tests-changed-only: - if: >- - needs.files-changed.outputs.merge_base != '' && - (needs.files-changed.outputs.testable_rules_changed == 'true' || needs.files-changed.outputs.testable_modified == 'true') - needs: [files-changed] - name: Jest - # If you change the runs-on image, you must also change the runner in jest-balance.yml - # so that the balancer runs in the same environment as the tests. - runs-on: ubuntu-24.04 - timeout-minutes: 30 - strategy: - # This helps not having to run multiple jobs because one fails, thus, reducing resource usage - # and reducing the risk that one of many runs would turn red again (read: intermittent tests) - fail-fast: false - matrix: - # XXX: When updating this, make sure you also update CI_NODE_TOTAL. - instance: [0, 1, 2, 3] - - steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Checkout sentry - with: - # PRs need history so we can compute merge base for Jest --changedSince. - # 100 is an arbitrary depth that will get most reasonable PRs' commits. - fetch-depth: ${{ github.event_name == 'pull_request' && '100' || '1' }} - - - uses: ./.github/actions/setup-node-pnpm - - - name: jest transform cache - uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 - with: - path: | - .cache/jest - ~/.cache/swc - key: jest-cache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'jest.config.ts') }}-${{ matrix.instance }} - restore-keys: | - jest-cache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'jest.config.ts') }}- - jest-cache-${{ runner.os }}- - - - name: Download jest-balance.json - id: download-artifact - uses: dawidd6/action-download-artifact@ac66b43f0e6a346234dd65d4d0c8fbb31cb316e5 # v11 - with: - workflow: 38531594 # jest-balancer.yml - workflow_conclusion: success # The conclusion of the workflow we're looking for - branch: master # The branch we're looking for - name: jest-balance.json # Artifact name - name_is_regexp: false - path: tests/js/test-balancer/ # Directory where to extract artifact(s), defaults to the current directory - search_artifacts: true # Search for the last workflow run whose stored the artifact we're looking for - if_no_artifact_found: warn # Can be one of: "fail", "warn", "ignore" - - - name: jest - env: - GITHUB_PR_SHA: ${{ github.event.pull_request.head.sha || github.sha }} - GITHUB_PR_REF: ${{ github.event.pull_request.head.ref || github.ref }} - # XXX: CI_NODE_TOTAL must be hardcoded to the length of strategy.matrix.instance. - # Otherwise, if there are other things in the matrix, using strategy.job-total - # wouldn't be correct. - CI_NODE_TOTAL: 4 - CI_NODE_INDEX: ${{ matrix.instance }} - # Disable testing-library from printing out any of of the DOM to - # stdout. No one actually looks through this in CI, they're just - # going to run it locally. - # - # This quiets up the logs quite a bit. - DEBUG_PRINT_LIMIT: 0 - MERGE_BASE: ${{ needs.files-changed.outputs.merge_base }} - run: pnpm run test-ci --forceExit diff --git a/.github/workflows/frontend.yml b/.github/workflows/frontend.yml index ff9909d6a826..6e4b4a3bd37d 100644 --- a/.github/workflows/frontend.yml +++ b/.github/workflows/frontend.yml @@ -29,8 +29,11 @@ jobs: typecheckable_rules_changed: ${{ steps.changes.outputs.typecheckable_rules_changed }} mdx_typecheckable: ${{ steps.changes.outputs.mdx_typecheckable }} frontend_all: ${{ steps.changes.outputs.frontend_all }} + merge_base: ${{ steps.merge_base.outputs.merge_base }} steps: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + with: + fetch-depth: 100 - name: Check for frontend file changes uses: dorny/paths-filter@0bc4621a3135347011ad047f9ecf449bf72ce2bd # v3.0.0 @@ -40,6 +43,28 @@ jobs: filters: .github/file-filters.yml list-files: shell + # On PRs, HEAD is the merge commit; its parents (HEAD^1, HEAD^2) are base and head. + # Merge base of those two is what Jest --changedSince needs. + # If merge base can't be computed or non-frontend files changed, output is empty + # and the Jest job will run the full test suite instead. + - name: Get merge base for changedSince + id: merge_base + if: github.event_name == 'pull_request' + run: | + MERGE_BASE=$(git merge-base HEAD^1 HEAD^2 2>/dev/null) || true + if [ -n "$MERGE_BASE" ]; then + CHANGED=$(git diff --name-only "$MERGE_BASE" HEAD^2) + if echo "$CHANGED" | grep -qvE '^static/'; then + echo "Non-frontend file changed — running full Jest suite" + MERGE_BASE="" + else + echo "Merge base: $MERGE_BASE (Jest will use --changedSince)" + fi + else + echo "Could not compute merge base — running full Jest suite" + fi + echo "merge_base=${MERGE_BASE:-}" >> "$GITHUB_OUTPUT" + typescript: if: needs.files-changed.outputs.frontend_all == 'true' needs: files-changed @@ -144,6 +169,9 @@ jobs: steps: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 name: Checkout sentry + with: + # PRs need history so Jest can resolve --changedSince from local Git history. + fetch-depth: ${{ github.event_name == 'pull_request' && '100' || '1' }} - uses: ./.github/actions/setup-node-pnpm @@ -189,6 +217,9 @@ jobs: # When the "Frontend: Rerun Flaky Tests" label is on the PR, # tests wrapped with it.isKnownFlake() run 50x to validate fixes. RERUN_KNOWN_FLAKY_TESTS: "${{ contains(github.event.pull_request.labels.*.name, 'Frontend: Rerun Flaky Tests') }}" + # When set, Jest uses --changedSince to run only tests affected by this PR. + # Empty on master or when non-frontend files changed (falls back to full suite). + MERGE_BASE: ${{ needs.files-changed.outputs.merge_base }} run: pnpm run test-ci --forceExit form-field-registry: