diff --git a/caching-strategies.md b/caching-strategies.md index 47946c3..48cb676 100644 --- a/caching-strategies.md +++ b/caching-strategies.md @@ -12,7 +12,7 @@ This document lists some of the strategies (and example workflows if possible) w jobs: build: runs-on: ubuntu-latest - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: key: ${{ some-metadata }}-cache ``` @@ -24,7 +24,7 @@ In your workflows, you can use different strategies to name your key depending o One of the most common use case is to use hash for lockfile as key. This way, same cache will be restored for a lockfile until there's a change in dependencies listed in lockfile. ```yaml - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: | path/to/dependencies @@ -37,7 +37,7 @@ One of the most common use case is to use hash for lockfile as key. This way, sa If cache is not found matching the primary key, restore keys can be used to download the closest matching cache that was recently created. This ensures that the build/install step will need to additionally fetch just a handful of newer dependencies, and hence saving build time. ```yaml - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: | path/to/dependencies @@ -54,7 +54,7 @@ The restore keys can be provided as a complete name, or a prefix, read more [her In case of workflows with matrix running for multiple Operating Systems, the caches can be stored separately for each of them. This can be used in combination with hashfiles in case multiple caches are being generated per OS. ```yaml - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: | path/to/dependencies @@ -73,7 +73,7 @@ Caches scoped to the particular workflow run id or run attempt can be stored and On similar lines, commit sha can be used to create a very specialized and short lived cache. ```yaml - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: | path/to/dependencies @@ -86,7 +86,7 @@ On similar lines, commit sha can be used to create a very specialized and short Cache key can be formed by combination of more than one metadata, evaluated info. ```yaml - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: | path/to/dependencies @@ -146,9 +146,9 @@ In case you are using a centralized job to create and save your cache that can b ```yaml steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/cache/restore@v3 + - uses: actions/cache/restore@v4 id: cache with: path: path/to/dependencies @@ -171,9 +171,9 @@ You can use the output of this action to exit the workflow on cache miss. This w ```yaml steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/cache/restore@v3 + - uses: actions/cache/restore@v4 id: cache with: path: path/to/dependencies @@ -194,7 +194,7 @@ steps: If you want to avoid re-computing the cache key again in `save` action, the outputs from `restore` action can be used as input to the `save` action. ```yaml - - uses: actions/cache/restore@v3 + - uses: actions/cache/restore@v4 id: restore-cache with: path: | @@ -204,7 +204,7 @@ If you want to avoid re-computing the cache key again in `save` action, the outp . . . - - uses: actions/cache/save@v3 + - uses: actions/cache/save@v4 with: path: | path/to/dependencies @@ -219,7 +219,7 @@ On the other hand, the key can also be explicitly re-computed while executing th Let's say we have a restore step that computes key at runtime ```yaml -uses: actions/cache/restore@v3 +uses: actions/cache/restore@v4 id: restore-cache with: key: cache-${{ hashFiles('**/lockfiles') }} @@ -228,7 +228,7 @@ with: Case 1: Where an user would want to reuse the key as it is ```yaml -uses: actions/cache/save@v3 +uses: actions/cache/save@v4 with: key: ${{ steps.restore-cache.outputs.cache-primary-key }} ``` @@ -236,7 +236,7 @@ with: Case 2: Where the user would want to re-evaluate the key ```yaml -uses: actions/cache/save@v3 +uses: actions/cache/save@v4 with: key: npm-cache-${{hashfiles(package-lock.json)}} ``` @@ -249,13 +249,13 @@ Similarly, `actions/cache/save` action can be conditionally used based on the ou ```yaml steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 . . // restore if need be . - name: Build run: /build.sh - - uses: actions/cache/save@v3 + - uses: actions/cache/save@v4 if: always() // or any other condition to invoke the save action with: path: path/to/dependencies @@ -270,12 +270,12 @@ In case of multi-module projects, where the built artifact of one project needs ```yaml steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Build run: ./build-parent-module.sh - - uses: actions/cache/save@v3 + - uses: actions/cache/save@v4 id: cache with: path: path/to/dependencies @@ -286,9 +286,9 @@ steps: ```yaml steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/cache/restore@v3 + - uses: actions/cache/restore@v4 id: cache with: path: path/to/dependencies diff --git a/examples.md b/examples.md index 2a49996..d47780b 100644 --- a/examples.md +++ b/examples.md @@ -46,7 +46,7 @@ Using [NuGet lock files](https://docs.microsoft.com/nuget/consume-packages/package-references-in-project-files#locking-dependencies): ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 with: path: ~/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} @@ -55,10 +55,10 @@ Using [NuGet lock files](https://docs.microsoft.com/nuget/consume-packages/packa ``` Depending on the environment, huge packages might be pre-installed in the global cache folder. -With `actions/cache@v3` you can now exclude unwanted packages with [exclude pattern](https://github.com/actions/toolkit/tree/main/packages/glob#exclude-patterns) +With `actions/cache@v4` you can now exclude unwanted packages with [exclude pattern](https://github.com/actions/toolkit/tree/main/packages/glob#exclude-patterns) ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 with: path: | ~/.nuget/packages @@ -75,7 +75,7 @@ Or you could move the cache folder like below. env: NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages steps: - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: ${{ github.workspace }}/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} @@ -87,7 +87,7 @@ steps: ```yaml - name: Cache lein project dependencies - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.m2/repository key: ${{ runner.os }}-clojure-${{ hashFiles('**/project.clj') }} @@ -101,7 +101,7 @@ steps: ### POSIX ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 with: path: ~/.dub key: ${{ runner.os }}-dub-${{ hashFiles('**/dub.selections.json') }} @@ -112,7 +112,7 @@ steps: ### Windows ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 with: path: ~\AppData\Local\dub key: ${{ runner.os }}-dub-${{ hashFiles('**/dub.selections.json') }} @@ -125,7 +125,7 @@ steps: ### Linux ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 with: path: | ~/.deno @@ -136,7 +136,7 @@ steps: ### macOS ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 with: path: | ~/.deno @@ -147,7 +147,7 @@ steps: ### Windows ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 with: path: | ~\.deno @@ -158,7 +158,7 @@ steps: ## Elixir - Mix ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 with: path: | deps @@ -185,7 +185,7 @@ steps: ### Linux ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 with: path: | ~/.cache/go-build @@ -198,7 +198,7 @@ steps: ### macOS ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 with: path: | ~/Library/Caches/go-build @@ -211,7 +211,7 @@ steps: ### Windows ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 with: path: | ~\AppData\Local\go-build @@ -227,7 +227,7 @@ We cache the elements of the Cabal store separately, as the entirety of `~/.caba ```yaml - name: Cache ~/.cabal/packages, ~/.cabal/store and dist-newstyle - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.cabal/packages @@ -242,14 +242,14 @@ We cache the elements of the Cabal store separately, as the entirety of `~/.caba ### Linux or macOS ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 name: Cache ~/.stack with: path: ~/.stack key: ${{ runner.os }}-stack-global-${{ hashFiles('stack.yaml') }}-${{ hashFiles('package.yaml') }} restore-keys: | ${{ runner.os }}-stack-global- -- uses: actions/cache@v3 +- uses: actions/cache@v4 name: Cache .stack-work with: path: .stack-work @@ -261,7 +261,7 @@ We cache the elements of the Cabal store separately, as the entirety of `~/.caba ### Windows ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 name: Cache %APPDATA%\stack %LOCALAPPDATA%\Programs\stack with: path: | @@ -270,7 +270,7 @@ We cache the elements of the Cabal store separately, as the entirety of `~/.caba key: ${{ runner.os }}-stack-global-${{ hashFiles('stack.yaml') }}-${{ hashFiles('package.yaml') }} restore-keys: | ${{ runner.os }}-stack-global- -- uses: actions/cache@v3 +- uses: actions/cache@v4 name: Cache .stack-work with: path: .stack-work @@ -284,7 +284,7 @@ We cache the elements of the Cabal store separately, as the entirety of `~/.caba > **Note** Ensure no Gradle daemons are running anymore when your workflow completes. Creating the cache package might fail due to locks being held by Gradle. Refer to the [Gradle Daemon documentation](https://docs.gradle.org/current/userguide/gradle_daemon.html) on how to disable or stop the Gradle Daemons. ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 with: path: | ~/.gradle/caches @@ -298,7 +298,7 @@ We cache the elements of the Cabal store separately, as the entirety of `~/.caba ```yaml - name: Cache local Maven repository - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} @@ -334,7 +334,7 @@ After [deprecation](https://github.blog/changelog/2022-10-11-github-actions-depr `Get npm cache directory` step can then be used with `actions/cache` as shown below ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 id: npm-cache # use this to check for `cache-hit` ==> if: steps.npm-cache.outputs.cache-hit != 'true' with: path: ${{ steps.npm-cache-dir.outputs.dir }} @@ -347,7 +347,7 @@ After [deprecation](https://github.blog/changelog/2022-10-11-github-actions-depr ```yaml - name: restore lerna - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: '**/node_modules' key: ${{ runner.os }}-${{ hashFiles('**/yarn.lock') }} @@ -361,7 +361,7 @@ The yarn cache directory will depend on your operating system and version of `ya id: yarn-cache-dir-path run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT -- uses: actions/cache@v3 +- uses: actions/cache@v4 id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} @@ -379,7 +379,7 @@ The yarn 2 cache directory will depend on your config. See https://yarnpkg.com/c id: yarn-cache-dir-path run: echo "dir=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT -- uses: actions/cache@v3 +- uses: actions/cache@v4 id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} @@ -394,7 +394,7 @@ Esy allows you to export built dependencies and import pre-built dependencies. ```yaml - name: Restore Cache id: restore-cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: _export key: ${{ runner.os }}-esy-${{ hashFiles('esy.lock/index.json') }} @@ -423,7 +423,7 @@ Esy allows you to export built dependencies and import pre-built dependencies. id: composer-cache run: | echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT -- uses: actions/cache@v3 +- uses: actions/cache@v4 with: path: ${{ steps.composer-cache.outputs.dir }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} @@ -444,7 +444,7 @@ Locations: ### Simple example ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} @@ -457,7 +457,7 @@ Replace `~/.cache/pip` with the correct `path` if not using Ubuntu. ### Multiple OS's in a workflow ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 if: startsWith(runner.os, 'Linux') with: path: ~/.cache/pip @@ -465,7 +465,7 @@ Replace `~/.cache/pip` with the correct `path` if not using Ubuntu. restore-keys: | ${{ runner.os }}-pip- -- uses: actions/cache@v3 +- uses: actions/cache@v4 if: startsWith(runner.os, 'macOS') with: path: ~/Library/Caches/pip @@ -473,7 +473,7 @@ Replace `~/.cache/pip` with the correct `path` if not using Ubuntu. restore-keys: | ${{ runner.os }}-pip- -- uses: actions/cache@v3 +- uses: actions/cache@v4 if: startsWith(runner.os, 'Windows') with: path: ~\AppData\Local\pip\Cache @@ -499,7 +499,7 @@ jobs: - os: windows-latest path: ~\AppData\Local\pip\Cache steps: - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: ${{ matrix.path }} key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} @@ -518,7 +518,7 @@ jobs: echo "dir=$(pip cache dir)" >> $GITHUB_OUTPUT - name: pip cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ${{ steps.pip-cache.outputs.dir }} key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} @@ -536,7 +536,7 @@ jobs: ⋮ -- uses: actions/cache@v3 +- uses: actions/cache@v4 with: path: ~/.local/share/virtualenvs key: ${{ runner.os }}-python-${{ steps.setup-python.outputs.python-version }}-pipenv-${{ hashFiles('Pipfile.lock') }} @@ -563,7 +563,7 @@ For renv, the cache directory will vary by OS. The `RENV_PATHS_ROOT` environment cat("##[set-output name=r-version;]", R.Version()$version.string, sep = "") shell: Rscript {0} - name: Restore Renv package cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ${{ env.RENV_PATHS_ROOT }} key: ${{ steps.get-version.outputs.os-version }}-${{ steps.get-version.outputs.r-version }}-${{ inputs.cache-version }}-${{ hashFiles('renv.lock') }} @@ -589,7 +589,7 @@ whenever possible: ## Rust - Cargo ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 with: path: | ~/.cargo/bin/ @@ -604,7 +604,7 @@ whenever possible: ```yaml - name: Cache SBT - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.ivy2/cache @@ -615,7 +615,7 @@ whenever possible: ## Swift, Objective-C - Carthage ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 with: path: Carthage key: ${{ runner.os }}-carthage-${{ hashFiles('**/Cartfile.resolved') }} @@ -626,7 +626,7 @@ whenever possible: ## Swift, Objective-C - CocoaPods ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 with: path: Pods key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }} @@ -637,7 +637,7 @@ whenever possible: ## Swift - Swift Package Manager ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 with: path: .build key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }} @@ -652,7 +652,7 @@ env: MINT_PATH: .mint/lib MINT_LINK_PATH: .mint/bin steps: - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: .mint key: ${{ runner.os }}-mint-${{ hashFiles('**/Mintfile') }} @@ -668,7 +668,7 @@ steps: ```yaml - name: Cache Bazel - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.cache/bazel @@ -682,7 +682,7 @@ steps: ```yaml - name: Cache Bazel - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | /private/var/tmp/_bazel_runner/ diff --git a/restore/README.md b/restore/README.md index a7203e9..ed8b552 100644 --- a/restore/README.md +++ b/restore/README.md @@ -35,9 +35,9 @@ If you are using separate jobs to create and save your cache(s) to be reused by ```yaml steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/cache/restore@v3 + - uses: actions/cache/restore@v4 id: cache with: path: path/to/dependencies @@ -64,12 +64,12 @@ In case of multi-module projects, where the built artifact of one project needs ```yaml steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Build run: /build-parent-module.sh - - uses: actions/cache/save@v3 + - uses: actions/cache/save@v4 id: cache with: path: path/to/dependencies @@ -80,9 +80,9 @@ steps: ```yaml steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/cache/restore@v3 + - uses: actions/cache/restore@v4 id: cache with: path: path/to/dependencies @@ -107,9 +107,9 @@ To fail if there is no cache hit for the primary key, leave `restore-keys` empty ```yaml steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/cache/restore@v3 + - uses: actions/cache/restore@v4 id: cache with: path: path/to/dependencies diff --git a/save/README.md b/save/README.md index 8ce56d2..ea64d71 100644 --- a/save/README.md +++ b/save/README.md @@ -23,7 +23,7 @@ If you are using separate jobs for generating common artifacts and sharing them ```yaml steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install Dependencies run: /install.sh @@ -31,7 +31,7 @@ steps: - name: Build artifacts run: /build.sh - - uses: actions/cache/save@v3 + - uses: actions/cache/save@v4 id: cache with: path: path/to/dependencies @@ -47,7 +47,7 @@ Let's say we have a restore step that computes a key at runtime. #### Restore a cache ```yaml -uses: actions/cache/restore@v3 +uses: actions/cache/restore@v4 id: restore-cache with: key: cache-${{ hashFiles('**/lockfiles') }} @@ -55,7 +55,7 @@ with: #### Case 1 - Where a user would want to reuse the key as it is ```yaml -uses: actions/cache/save@v3 +uses: actions/cache/save@v4 with: key: ${{ steps.restore-cache.outputs.cache-primary-key }} ``` @@ -63,7 +63,7 @@ with: #### Case 2 - Where the user would want to re-evaluate the key ```yaml -uses: actions/cache/save@v3 +uses: actions/cache/save@v4 with: key: npm-cache-${{hashfiles(package-lock.json)}} ``` @@ -74,13 +74,13 @@ There are instances where some flaky test cases would fail the entire workflow a ```yaml steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 . . // restore if need be . - name: Build run: /build.sh - - uses: actions/cache/save@v3 + - uses: actions/cache/save@v4 if: always() // or any other condition to invoke the save action with: path: path/to/dependencies diff --git a/tips-and-workarounds.md b/tips-and-workarounds.md index 125fa5f..5708986 100644 --- a/tips-and-workarounds.md +++ b/tips-and-workarounds.md @@ -12,7 +12,7 @@ A cache today is immutable and cannot be updated. But some use cases require the ```yaml - name: update cache on every commit - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: prime-numbers key: primes-${{ runner.os }}-${{ github.run_id }} # Can use time based key as well @@ -61,7 +61,7 @@ jobs: contents: read steps: - name: Check out code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Cleanup run: |