diff --git a/.github/actions/setup-node-env/action.yml b/.github/actions/setup-node-env/action.yml index c29e96a079b..61e51e8c7a3 100644 --- a/.github/actions/setup-node-env/action.yml +++ b/.github/actions/setup-node-env/action.yml @@ -37,6 +37,7 @@ runs: check-latest: false - name: Setup pnpm + cache store + id: pnpm-cache uses: ./.github/actions/setup-pnpm-store-cache with: pnpm-version: ${{ inputs.pnpm-version }} @@ -97,3 +98,11 @@ runs: install_args+=("$LOCKFILE_FLAG") fi pnpm "${install_args[@]}" || pnpm "${install_args[@]}" + + - name: Save pnpm store cache + if: inputs.install-deps == 'true' && steps.pnpm-cache.outputs.cache-enabled == 'true' && steps.pnpm-cache.outputs.cache-hit != 'true' + uses: actions/cache/save@v5 + continue-on-error: true + with: + path: ${{ steps.pnpm-cache.outputs.store-path }} + key: ${{ steps.pnpm-cache.outputs.primary-key }} diff --git a/.github/actions/setup-pnpm-store-cache/action.yml b/.github/actions/setup-pnpm-store-cache/action.yml index 438f70de952..5a95ccadda0 100644 --- a/.github/actions/setup-pnpm-store-cache/action.yml +++ b/.github/actions/setup-pnpm-store-cache/action.yml @@ -14,9 +14,25 @@ inputs: required: false default: "true" use-actions-cache: - description: Whether to restore/save pnpm store with actions/cache. + description: Whether to restore pnpm store with actions/cache. required: false default: "true" +outputs: + cache-enabled: + description: Whether actions/cache restore was enabled. + value: ${{ steps.pnpm-cache-config.outputs.enabled }} + cache-hit: + description: Whether the pnpm store cache had an exact key hit. + value: ${{ steps.pnpm-cache-restore.outputs.cache-hit }} + cache-matched-key: + description: Cache key matched by restore, if any. + value: ${{ steps.pnpm-cache-restore.outputs.cache-matched-key }} + primary-key: + description: Primary pnpm store cache key. + value: ${{ steps.pnpm-cache-config.outputs.primary-key }} + store-path: + description: Resolved pnpm store path. + value: ${{ steps.pnpm-store.outputs.path }} runs: using: composite steps: @@ -46,18 +62,29 @@ runs: shell: bash run: echo "path=$(pnpm store path --silent)" >> "$GITHUB_OUTPUT" - - name: Restore pnpm store cache (exact key only) - if: inputs.use-actions-cache == 'true' && inputs.use-restore-keys != 'true' - uses: actions/cache@v5 - with: - path: ${{ steps.pnpm-store.outputs.path }} - key: ${{ runner.os }}-pnpm-store-${{ inputs.cache-key-suffix }}-${{ hashFiles('pnpm-lock.yaml') }} + - name: Resolve pnpm store cache keys + id: pnpm-cache-config + shell: bash + env: + CACHE_KEY_SUFFIX: ${{ inputs.cache-key-suffix }} + LOCKFILE_HASH: ${{ hashFiles('pnpm-lock.yaml') }} + USE_ACTIONS_CACHE: ${{ inputs.use-actions-cache }} + USE_RESTORE_KEYS: ${{ inputs.use-restore-keys }} + run: | + set -euo pipefail + echo "enabled=$USE_ACTIONS_CACHE" >> "$GITHUB_OUTPUT" + echo "primary-key=${RUNNER_OS}-pnpm-store-${CACHE_KEY_SUFFIX}-${LOCKFILE_HASH}" >> "$GITHUB_OUTPUT" + if [ "$USE_RESTORE_KEYS" = "true" ]; then + echo "restore-keys=${RUNNER_OS}-pnpm-store-${CACHE_KEY_SUFFIX}-" >> "$GITHUB_OUTPUT" + else + echo "restore-keys=" >> "$GITHUB_OUTPUT" + fi - - name: Restore pnpm store cache (with fallback keys) - if: inputs.use-actions-cache == 'true' && inputs.use-restore-keys == 'true' - uses: actions/cache@v5 + - name: Restore pnpm store cache + id: pnpm-cache-restore + if: inputs.use-actions-cache == 'true' + uses: actions/cache/restore@v5 with: path: ${{ steps.pnpm-store.outputs.path }} - key: ${{ runner.os }}-pnpm-store-${{ inputs.cache-key-suffix }}-${{ hashFiles('pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store-${{ inputs.cache-key-suffix }}- + key: ${{ steps.pnpm-cache-config.outputs.primary-key }} + restore-keys: ${{ steps.pnpm-cache-config.outputs.restore-keys }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 483f970caa2..08ce9bca19f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1843,6 +1843,7 @@ jobs: check-latest: false - name: Setup pnpm + cache store + id: pnpm-cache uses: ./.github/actions/setup-pnpm-store-cache with: pnpm-version: "10.33.0" @@ -1876,6 +1877,14 @@ jobs: # caches can skip repeated rebuild/download work on later shards/runs. pnpm install --frozen-lockfile --prefer-offline --ignore-scripts=false --config.engine-strict=false --config.enable-pre-post-scripts=true --config.side-effects-cache=true || pnpm install --frozen-lockfile --prefer-offline --ignore-scripts=false --config.engine-strict=false --config.enable-pre-post-scripts=true --config.side-effects-cache=true + - name: Save pnpm store cache + if: steps.pnpm-cache.outputs.cache-enabled == 'true' && steps.pnpm-cache.outputs.cache-hit != 'true' + uses: actions/cache/save@v5 + continue-on-error: true + with: + path: ${{ steps.pnpm-cache.outputs.store-path }} + key: ${{ steps.pnpm-cache.outputs.primary-key }} + - name: Run ${{ matrix.task }} (${{ matrix.runtime }}) env: TASK: ${{ matrix.task }}