sync upstream 2026-07-18 #155
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
| # Credit for fingerprint action https://github.com/expo/expo | |
| # https://github.com/expo/expo/blob/main/.github/workflows/pr-labeler.yml | |
| --- | |
| name: PR Tests | |
| on: | |
| push: | |
| branches: [main] | |
| pull_request: | |
| types: [opened, synchronize] | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| # Permissions are granted per-job below; anything unlisted defaults to none. | |
| # pull-requests: write is needed by sticky-pull-request-comment to post the | |
| # bundle-size and fingerprint diffs | |
| permissions: {} | |
| jobs: | |
| # Populate this from main so every PR can restore the same trusted baseline. | |
| webpack-analyzer-base: | |
| runs-on: ubuntu-24.04 | |
| if: ${{ github.event_name == 'push' }} | |
| permissions: | |
| contents: read | |
| steps: | |
| - name: ⬇️ Checkout | |
| uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 | |
| - uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9 | |
| - name: 🔧 Setup Node | |
| uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 | |
| with: | |
| node-version-file: package.json | |
| cache: pnpm | |
| - name: ⬇️ Get base stats from cache | |
| id: get-base-stats | |
| uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 | |
| with: | |
| path: stats.json | |
| key: stats-base-main-${{ github.sha }} | |
| - name: 🔦 Generate stats file for base commit | |
| if: ${{ !steps.get-base-stats.outputs.cache-hit }} | |
| run: | | |
| pnpm install | |
| pnpm intl:build | |
| pnpm generate-webpack-stats-file | |
| - name: ⬆️ Save base stats to cache | |
| if: ${{ !steps.get-base-stats.outputs.cache-hit }} | |
| uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 | |
| with: | |
| path: stats.json | |
| key: stats-base-main-${{ github.sha }} | |
| webpack-analyzer: | |
| runs-on: ubuntu-24.04 | |
| if: ${{ github.event.pull_request.head.repo.full_name == github.repository && github.event_name == 'pull_request'}} | |
| permissions: | |
| contents: read | |
| pull-requests: write | |
| steps: | |
| - name: ⬇️ Checkout | |
| uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 | |
| with: | |
| fetch-depth: 0 | |
| - uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9 | |
| - name: 🔧 Setup Node | |
| uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 | |
| with: | |
| node-version-file: package.json | |
| cache: pnpm | |
| - name: Ensure tracking relevant branches and checkout base | |
| env: | |
| HEAD_REF: ${{ github.head_ref }} | |
| BASE_REF: ${{ github.base_ref }} | |
| run: | | |
| git checkout $HEAD_REF | |
| git checkout $BASE_REF | |
| - name: Get the base commit | |
| id: base-commit | |
| env: | |
| BASE_REF: ${{ github.base_ref }} | |
| run: echo base-commit=$(git log -n 1 $BASE_REF --pretty=format:'%H') >> "$GITHUB_OUTPUT" | |
| - name: Merge PR commit | |
| env: | |
| HEAD_REF: ${{ github.head_ref }} | |
| run: | | |
| # Have to set a git config for the merge to work | |
| git config --global user.email "github-actions[bot]@users.noreply.github.com" | |
| git config --global user.name "github-actions[bot]" | |
| git merge --no-edit $HEAD_REF | |
| pnpm install | |
| pnpm intl:build | |
| - name: 🔦 Generate stats file for PR | |
| run: | | |
| pnpm generate-webpack-stats-file | |
| mv stats.json ../stats-new.json | |
| - name: ⬇️ Get base stats from cache | |
| id: get-base-stats | |
| # Restore-only prevents PR-scoped fallback builds from creating caches. | |
| uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 | |
| with: | |
| path: stats.json | |
| key: stats-base-main-${{ steps.base-commit.outputs.base-commit }} | |
| - name: Restore to base commit | |
| if: ${{ !steps.get-base-stats.outputs.cache-hit }} | |
| env: | |
| BASE_COMMIT: ${{ steps.base-commit.outputs.base-commit }} | |
| run: | | |
| git reset "$BASE_COMMIT" | |
| git restore . | |
| - name: 🔦 Generate stats file from base commit | |
| if: ${{ !steps.get-base-stats.outputs.cache-hit }} | |
| run: | | |
| pnpm install | |
| pnpm intl:build | |
| pnpm generate-webpack-stats-file | |
| - name: % Get diff | |
| id: get-diff | |
| uses: NejcZdovc/bundle-size-diff@5321de41d2d62a7b0f4d6e60f59d1280a0034160 # v1.1.0 | |
| with: | |
| base_path: "stats.json" | |
| pr_path: "../stats-new.json" | |
| excluded_assets: "(.+).chunk.js|(.+).js.map|(.+).json|(.+).png|(.+).svg|(.+).webp|(.+).jpg|(.+).ico" | |
| - name: 💬 Drop a comment | |
| uses: marocchino/sticky-pull-request-comment@5770ad5eb8f42dd2c4f34da00c94c5381e49af88 # v3.0.5 | |
| with: | |
| header: bundle-diff | |
| message: | | |
| | Old size | New size | Diff | | |
| |----------|----------|-----------------------| | |
| | ${{ steps.get-diff.outputs.base_file_string }} | ${{ steps.get-diff.outputs.pr_file_string }} | ${{ steps.get-diff.outputs.diff_file_string }} (${{ steps.get-diff.outputs.percent }}%) | | |
| --- | |
| fingerprint-native: | |
| runs-on: ubuntu-22.04 | |
| if: ${{ github.event.pull_request.head.repo.full_name == github.repository && github.event_name == 'pull_request'}} | |
| permissions: | |
| contents: read | |
| pull-requests: write | |
| steps: | |
| - name: ⬇️ Checkout | |
| uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 | |
| with: | |
| fetch-depth: 100 | |
| - name: ⬇️ Fetch commits from base branch | |
| run: git fetch origin main:main --depth 100 | |
| if: github.event_name == 'pull_request' | |
| - uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9 | |
| - name: 🔧 Setup Node | |
| uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 | |
| with: | |
| node-version-file: package.json | |
| cache: pnpm | |
| - name: 📷 Check fingerprint and install dependencies | |
| id: fingerprint | |
| timeout-minutes: 5 | |
| uses: bluesky-social/github-actions/fingerprint-native@b5556913e4aef3964cfd5936d0add3fc0d809bdb # v0.2.0 | |
| with: | |
| profile: pull-request | |
| - name: 💬 Drop a comment | |
| uses: marocchino/sticky-pull-request-comment@5770ad5eb8f42dd2c4f34da00c94c5381e49af88 # v3.0.5 | |
| if: ${{ steps.fingerprint.outputs.includes-changes }} | |
| with: | |
| header: fingerprint-diff | |
| message: | | |
| The Pull Request introduced fingerprint changes against the base commit: | |
| <details><summary>Fingerprint diff</summary> | |
| ```json | |
| ${{ steps.fingerprint.outputs.diff }} | |
| ``` | |
| </details> | |
| --- | |
| *Generated by [PR labeler](https://github.com/expo/expo/actions/workflows/pr-labeler.yml) 🤖* | |
| - name: 💬 Delete comment | |
| uses: marocchino/sticky-pull-request-comment@5770ad5eb8f42dd2c4f34da00c94c5381e49af88 # v3.0.5 | |
| if: ${{ !steps.fingerprint.outputs.includes-changes }} | |
| with: | |
| header: fingerprint-diff | |
| delete: true | |
| - name: 🏷️ Label as fingerprint changed | |
| if: ${{ steps.fingerprint.outputs.includes-changes }} | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| PR_NUMBER: ${{ github.event.pull_request.number }} | |
| run: | | |
| gh pr edit "$PR_NUMBER" --add-label "bot: fingerprint changed" || true | |
| - name: 🏷️ Remove fingerprint changed label | |
| if: ${{ !steps.fingerprint.outputs.includes-changes }} | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| PR_NUMBER: ${{ github.event.pull_request.number }} | |
| run: | | |
| gh pr edit "$PR_NUMBER" --remove-label "bot: fingerprint changed" || true |