Caching in GitHub actions
Caching dependencies¶
The actions/cache action caches dependencies for the execution environment.
- name: Cache multiple paths
  uses: actions/cache@v4
  with:
    path: |
      ~/cache
      !~/cache/exclude
    key: ${{ runner.os }}-${{ hashFiles('**/Lockfile') }}
    restore-keys: |
      ${{ runner.os }}-
- The keyis the identifier for writing into the cache. If thekeystays the same before and after the workflow, the cache will not be updated.
- The restore-keysare the identifiers for reading the cache besides thekey.If there is no matchingkeybut a part of it (restore-keys) matches, the GitHub action will still read the cache and update it after the job. (since thekeyis different)
Restore and save actions¶
The cache actions could be split into restore and save steps, leading to a fine-grained behavior.
- name: Restore cached Primes
      id: cache-primes-restore
      uses: actions/cache/restore@v4
      with:
        path: |
          path/to/dependencies
          some/other/dependencies
        key: ${{ runner.os }}-primes
#
# //intermediate workflow steps
#
- name: Save Primes
  id: cache-primes-save
  uses: actions/cache/save@v4
  with:
    path: |
      path/to/dependencies
      some/other/dependencies
Caching for a specific programming language¶
Some GitHub actions for setting up runtime for programming languages can cache package dependency.
- NodeJS: actions/setup-node
- Python: actions/setup-python (pip) and mamba-org/setup-micromamba (conda/mamba)
- Julia: julia-actions/cache
Cleanup PR caches¶
Clean up PR caches after it closes to save space.
name: Cleanup PR caches
on:
  pull_request:
    types:
      - closed
jobs:
  cleanup:
    permissions:
      actions: write
    runs-on: ubuntu-latest
    steps:
      - name: Cleanup
        run: |
          gh extension install actions/gh-actions-cache
          echo "Fetching list of cache key"
          cacheKeysForPR=$(gh actions-cache list -R $REPO -B $BRANCH -L 100 | cut -f 1 )
          ## Setting this to not fail the workflow while deleting cache keys.
          set +e
          echo "Deleting caches..."
          for cacheKey in $cacheKeysForPR
          do
              gh actions-cache delete $cacheKey -R $REPO -B $BRANCH --confirm
          done
          echo "Done"
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          REPO: ${{ github.repository }}
          BRANCH: refs/pull/${{ github.event.pull_request.number }}/merge