From 104f95683b8ab46f4588c0a9e0875ca826338e9d Mon Sep 17 00:00:00 2001 From: todgru Date: Fri, 26 Jan 2024 14:08:22 -0800 Subject: [PATCH 1/9] update documentation to use @v4 --- README.md | 10 ++--- caching-strategies.md | 42 ++++++++++---------- examples.md | 86 ++++++++++++++++++++--------------------- restore/README.md | 16 ++++---- save/README.md | 14 +++---- tips-and-workarounds.md | 4 +- 6 files changed, 86 insertions(+), 86 deletions(-) diff --git a/README.md b/README.md index d1d2aef..3da1ae0 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Cache Primes id: cache-primes @@ -122,7 +122,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Restore cached Primes id: cache-primes-restore @@ -229,7 +229,7 @@ Example: ```yaml steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/cache@v4 id: cache @@ -259,7 +259,7 @@ jobs: build-linux: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Cache Primes id: cache-primes @@ -286,7 +286,7 @@ jobs: build-windows: runs-on: windows-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Cache Primes id: cache-primes 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 1bcde91..2bd2231 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') }} @@ -517,7 +517,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') }} @@ -535,7 +535,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') }} @@ -562,7 +562,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') }} @@ -588,7 +588,7 @@ whenever possible: ## Rust - Cargo ```yaml -- uses: actions/cache@v3 +- uses: actions/cache@v4 with: path: | ~/.cargo/bin/ @@ -603,7 +603,7 @@ whenever possible: ```yaml - name: Cache SBT - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.ivy2/cache @@ -614,7 +614,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') }} @@ -625,7 +625,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') }} @@ -636,7 +636,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') }} @@ -651,7 +651,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') }} @@ -667,7 +667,7 @@ steps: ```yaml - name: Cache Bazel - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.cache/bazel @@ -681,7 +681,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: | From 57b8e405f0f6efe89131ba09709ce4bc33291a51 Mon Sep 17 00:00:00 2001 From: Soubhik Kumar Mitra <59209034+x612skm@users.noreply.github.com> Date: Tue, 6 Aug 2024 19:56:54 +0530 Subject: [PATCH 2/9] Clarify that the `restore-keys` input is a string in the docs (#1434) * Fix Description for restore-keys at Readme As previously the restore-keys were defined as an ordered lists which is wrong as per the issue description where the actual format is a multi-line string with one key per line. * Added a space between the sentence of restore-keys description While at the PR review it's been identified there's a need for a space between the sentence ``` An ordered multiline string listing the prefix-matched keys,that are used for restoring stale cache if no cache hit occurred for key. ``` where it's written as "prefix-matched keys,that are" this commit will address the review comment and introduce a space between "prefix-matched keys, that are" and change the sentence to ``` An ordered multiline string listing the prefix-matched keys, that are used for restoring stale cache if no cache hit occurred for key. ``` * Change restore-keys description at cache/restore/action.yml and cache/action.yml --- README.md | 2 +- action.yml | 2 +- restore/action.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3da1ae0..9da9474 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ If you are using a `self-hosted` Windows runner, `GNU tar` and `zstd` are requir * `key` - An explicit key for a cache entry. See [creating a cache key](#creating-a-cache-key). * `path` - A list of files, directories, and wildcard patterns to cache and restore. See [`@actions/glob`](https://github.com/actions/toolkit/tree/main/packages/glob) for supported patterns. -* `restore-keys` - An ordered list of prefix-matched keys to use for restoring stale cache if no cache hit occurred for key. +* `restore-keys` - An ordered multiline string listing the prefix-matched keys, that are used for restoring stale cache if no cache hit occurred for key. * `enableCrossOsArchive` - An optional boolean when enabled, allows Windows runners to save or restore caches that can be restored or saved respectively on other platforms. Default: `false` * `fail-on-cache-miss` - Fail the workflow if cache entry is not found. Default: `false` * `lookup-only` - If true, only checks if cache entry exists and skips download. Does not change save cache behavior. Default: `false` diff --git a/action.yml b/action.yml index 0125281..14f247f 100644 --- a/action.yml +++ b/action.yml @@ -9,7 +9,7 @@ inputs: description: 'An explicit key for restoring and saving the cache' required: true restore-keys: - description: 'An ordered list of keys to use for restoring stale cache if no cache hit occurred for key. Note `cache-hit` returns false in this case.' + description: 'An ordered multiline string listing the prefix-matched keys, that are used for restoring stale cache if no cache hit occurred for key. Note `cache-hit` returns false in this case.' required: false upload-chunk-size: description: 'The chunk size used to split up large files during upload, in bytes' diff --git a/restore/action.yml b/restore/action.yml index 194669f..3c5e5ae 100644 --- a/restore/action.yml +++ b/restore/action.yml @@ -9,7 +9,7 @@ inputs: description: 'An explicit key for restoring the cache' required: true restore-keys: - description: 'An ordered list of keys to use for restoring stale cache if no cache hit occurred for key. Note `cache-hit` returns false in this case.' + description: 'An ordered multiline string listing the prefix-matched keys, that are used for restoring stale cache if no cache hit occurred for key. Note `cache-hit` returns false in this case.' required: false enableCrossOsArchive: description: 'An optional boolean when enabled, allows windows runners to restore caches that were saved on other platforms' From 45b7be0774ee094895ecce56182ca96e60b360c9 Mon Sep 17 00:00:00 2001 From: Joel Ambass Date: Thu, 3 Oct 2024 08:51:30 +0200 Subject: [PATCH 3/9] Add workflow file for publishing releases to immutable action package This workflow file publishes new action releases to the immutable action package of the same name as this repo. This is part of the Immutable Actions project which is not yet fully released to the public. First party actions like this one are part of our initial testing of this feature. --- .../workflows/publish-immutable-actions.yml | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/publish-immutable-actions.yml diff --git a/.github/workflows/publish-immutable-actions.yml b/.github/workflows/publish-immutable-actions.yml new file mode 100644 index 0000000..87c0207 --- /dev/null +++ b/.github/workflows/publish-immutable-actions.yml @@ -0,0 +1,20 @@ +name: 'Publish Immutable Action Version' + +on: + release: + types: [published] + +jobs: + publish: + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write + packages: write + + steps: + - name: Checking out + uses: actions/checkout@v4 + - name: Publish + id: publish + uses: actions/publish-immutable-action@0.0.3 From c74ca4022c9c3055a63985d9a25f9a7cc1ffc5d2 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Thu, 3 Oct 2024 14:37:55 -0400 Subject: [PATCH 4/9] Deprecate `save-always` input (#1452) The `save-always` input added in v4 is not working as intended due to `post-if` expressions not supporting the input context. To avoid breaking users who have already added this input to their workflows, it is being deprecated now and will be removed in the next major version (v5). See https://github.com/actions/cache/issues/1315 for more details. --- README.md | 1 - action.yml | 8 +++++-- caching-strategies.md | 19 +--------------- save/README.md | 52 ++++++++++++++++++++++++++++++++----------- 4 files changed, 46 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 9da9474..7544efd 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,6 @@ See ["Caching dependencies to speed up workflows"](https://docs.github.com/en/ac ### v4 * Updated to node 20 -* Added a `save-always` flag to save the cache even if a prior step fails ### v3 diff --git a/action.yml b/action.yml index 14f247f..7af7458 100644 --- a/action.yml +++ b/action.yml @@ -29,7 +29,11 @@ inputs: save-always: description: 'Run the post step to save the cache even if another step before fails' default: 'false' - required: false + required: false + deprecationMessage: | + save-always does not work as intended and will be removed in a future release. + A separate `actions/cache/restore` step should be used instead. + See https://github.com/actions/cache/tree/main/save#always-save-cache for more details. outputs: cache-hit: description: 'A boolean value to indicate an exact match was found for the primary key' @@ -37,7 +41,7 @@ runs: using: 'node20' main: 'dist/restore/index.js' post: 'dist/save/index.js' - post-if: "success() || github.event.inputs.save-always" + post-if: "success()" branding: icon: 'archive' color: 'gray-dark' diff --git a/caching-strategies.md b/caching-strategies.md index 48cb676..94e5ae7 100644 --- a/caching-strategies.md +++ b/caching-strategies.md @@ -243,24 +243,7 @@ with: ### Saving cache even if the build fails -There can be cases where a cache should be saved even if the build job fails. For example, a job can fail due to flaky tests but the caches can still be re-used. You can use `actions/cache/save` action to save the cache by using `if: always()` condition. - -Similarly, `actions/cache/save` action can be conditionally used based on the output of the previous steps. This way you get more control on when to save the cache. - -```yaml -steps: - - uses: actions/checkout@v4 - . - . // restore if need be - . - - name: Build - run: /build.sh - - uses: actions/cache/save@v4 - if: always() // or any other condition to invoke the save action - with: - path: path/to/dependencies - key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }} -``` +See [Always save cache](./save/README.md#always-save-cache). ### Saving cache once and reusing in multiple workflows diff --git a/save/README.md b/save/README.md index ea64d71..e986626 100644 --- a/save/README.md +++ b/save/README.md @@ -70,19 +70,45 @@ with: ### Always save cache -There are instances where some flaky test cases would fail the entire workflow and users would get frustrated because the builds would run for hours and the cache couldn't be saved as the workflow failed in between. For such use-cases, users now have the ability to use the `actions/cache/save` action to save the cache by using an `if: always()` condition. This way the cache will always be saved if generated, or a warning will be generated that nothing is found on the cache path. Users can also use the `if` condition to only execute the `actions/cache/save` action depending on the output of previous steps. This way they get more control of when to save the cache. +There are instances where some flaky test cases would fail the entire workflow and users would get frustrated because the builds would run for hours and the cache couldn't be saved as the workflow failed in between. +For such use-cases, users now have the ability to use the `actions/cache/save` action to save the cache by using an [`always()`](https://docs.github.com/actions/writing-workflows/choosing-what-your-workflow-does/expressions#always) condition. +This way the cache will always be saved if generated, or a warning will be generated that nothing is found on the cache path. Users can also use the `if` condition to only execute the `actions/cache/save` action depending on the output of previous steps. This way they get more control of when to save the cache. + +To avoid saving a cache that already exists, the `cache-hit` output from a restore step should be checked. + +The `cache-primary-key` output from the restore step should also be used to ensure +the cache key does not change during the build if it's calculated based on file contents. ```yaml -steps: - - uses: actions/checkout@v4 - . - . // restore if need be - . - - name: Build - run: /build.sh - - uses: actions/cache/save@v4 - if: always() // or any other condition to invoke the save action - with: - path: path/to/dependencies - key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }} +name: Always Caching Primes + +on: push + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Restore cached Primes + id: cache-primes-restore + uses: actions/cache/restore@v4 + with: + key: ${{ runner.os }}-primes + path: | + path/to/dependencies + some/other/dependencies + + # Intermediate workflow steps + + - name: Always Save Primes + id: cache-primes-save + if: always() && steps.cache-primes-restore.outputs.cache-hit != 'true' + uses: actions/cache/save@v4 + with: + key: ${{ steps.cache-primes-restore.outputs.cache-primary-key }} + path: | + path/to/dependencies + some/other/dependencies ``` From cf7a75e7b9330700f4a055e401fe624394469d0f Mon Sep 17 00:00:00 2001 From: mackey0225 Date: Fri, 4 Oct 2024 03:56:27 +0900 Subject: [PATCH 5/9] Fix typo: depening -> depending (#1462) Co-authored-by: Josh Gross --- caching-strategies.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/caching-strategies.md b/caching-strategies.md index 94e5ae7..86ae37c 100644 --- a/caching-strategies.md +++ b/caching-strategies.md @@ -81,7 +81,7 @@ On similar lines, commit sha can be used to create a very specialized and short key: cache-${{ github.sha }} ``` -### Using multiple factors while forming a key depening on the need +### Using multiple factors while forming a key depending on the need Cache key can be formed by combination of more than one metadata, evaluated info. From 2cdf405574d6ef1f33a1d12acccd3ae82f47b3f2 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Fri, 4 Oct 2024 17:00:33 -0400 Subject: [PATCH 7/9] Prepare `4.1.0` release (#1464) --- RELEASES.md | 4 ++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index e70823e..d576703 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,5 +1,9 @@ # Releases +### 4.1.0 +- Ensure `cache-hit` output is set when a cache is missed - [#1404](https://github.com/actions/cache/pull/1404) +- Deprecate `save-always` input - [#1452](https://github.com/actions/cache/pull/1452) + ### 4.0.2 - Fixed restore `fail-on-cache-miss` not working. diff --git a/package-lock.json b/package-lock.json index a232507..73f4e6a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cache", - "version": "4.0.2", + "version": "4.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "cache", - "version": "4.0.2", + "version": "4.1.0", "license": "MIT", "dependencies": { "@actions/cache": "^3.2.3", diff --git a/package.json b/package.json index 7468af5..08ba312 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cache", - "version": "4.0.2", + "version": "4.1.0", "private": true, "description": "Cache dependencies and build outputs", "main": "dist/restore/index.js", From 3624ceb22c1c5a301c8db4169662070a689d9ea8 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Tue, 8 Oct 2024 13:08:22 -0400 Subject: [PATCH 8/9] Restore original behavior of `cache-hit` output (#1467) * Restore original behavior of `cache-hit` output * Bump version to 4.1.1 --- README.md | 6 +++--- RELEASES.md | 3 +++ __tests__/restore.test.ts | 2 +- __tests__/restoreOnly.test.ts | 3 +-- dist/restore-only/index.js | 3 ++- dist/restore/index.js | 3 ++- package-lock.json | 4 ++-- package.json | 2 +- src/restoreImpl.ts | 4 +++- 9 files changed, 18 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 7544efd..c58a135 100644 --- a/README.md +++ b/README.md @@ -64,9 +64,9 @@ If you are using a `self-hosted` Windows runner, `GNU tar` and `zstd` are requir ### Outputs -* `cache-hit` - A boolean value to indicate an exact match was found for the key. - - > **Note** `cache-hit` will only be set to `true` when a cache hit occurs for the exact `key` match. For a partial key match via `restore-keys` or a cache miss, it will be set to `false`. +* `cache-hit` - A string value to indicate an exact match was found for the key. + * If there's a cache hit, this will be 'true' or 'false' to indicate if there's an exact match for `key`. + * If there's a cache miss, this will be an empty string. See [Skipping steps based on cache-hit](#skipping-steps-based-on-cache-hit) for info on using this output diff --git a/RELEASES.md b/RELEASES.md index d576703..b490d02 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,5 +1,8 @@ # Releases +### 4.1.1 +- Restore original behavior of `cache-hit` output - [#1467](https://github.com/actions/cache/pull/1467) + ### 4.1.0 - Ensure `cache-hit` output is set when a cache is missed - [#1404](https://github.com/actions/cache/pull/1404) - Deprecate `save-always` input - [#1452](https://github.com/actions/cache/pull/1452) diff --git a/__tests__/restore.test.ts b/__tests__/restore.test.ts index 9b066eb..250f7ef 100644 --- a/__tests__/restore.test.ts +++ b/__tests__/restore.test.ts @@ -260,7 +260,7 @@ test("Fail restore when fail on cache miss is enabled and primary + restore keys ); expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key); - expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1); + expect(setCacheHitOutputMock).toHaveBeenCalledTimes(0); expect(failedMock).toHaveBeenCalledWith( `Failed to restore cache entry. Exiting as fail-on-cache-miss is set. Input key: ${key}` diff --git a/__tests__/restoreOnly.test.ts b/__tests__/restoreOnly.test.ts index 840307d..81e5bca 100644 --- a/__tests__/restoreOnly.test.ts +++ b/__tests__/restoreOnly.test.ts @@ -86,8 +86,7 @@ test("restore with no cache found", async () => { ); expect(outputMock).toHaveBeenCalledWith("cache-primary-key", key); - expect(outputMock).toHaveBeenCalledWith("cache-hit", "false"); - expect(outputMock).toHaveBeenCalledTimes(2); + expect(outputMock).toHaveBeenCalledTimes(1); expect(failedMock).toHaveBeenCalledTimes(0); expect(infoMock).toHaveBeenCalledWith( diff --git a/dist/restore-only/index.js b/dist/restore-only/index.js index d2f3631..14e97b1 100644 --- a/dist/restore-only/index.js +++ b/dist/restore-only/index.js @@ -59415,7 +59415,8 @@ function restoreImpl(stateProvider, earlyExit) { const lookupOnly = utils.getInputAsBool(constants_1.Inputs.LookupOnly); const cacheKey = yield cache.restoreCache(cachePaths, primaryKey, restoreKeys, { lookupOnly: lookupOnly }, enableCrossOsArchive); if (!cacheKey) { - core.setOutput(constants_1.Outputs.CacheHit, false.toString()); + // `cache-hit` is intentionally not set to `false` here to preserve existing behavior + // See https://github.com/actions/cache/issues/1466 if (failOnCacheMiss) { throw new Error(`Failed to restore cache entry. Exiting as fail-on-cache-miss is set. Input key: ${primaryKey}`); } diff --git a/dist/restore/index.js b/dist/restore/index.js index 842eaa6..29b70b2 100644 --- a/dist/restore/index.js +++ b/dist/restore/index.js @@ -59415,7 +59415,8 @@ function restoreImpl(stateProvider, earlyExit) { const lookupOnly = utils.getInputAsBool(constants_1.Inputs.LookupOnly); const cacheKey = yield cache.restoreCache(cachePaths, primaryKey, restoreKeys, { lookupOnly: lookupOnly }, enableCrossOsArchive); if (!cacheKey) { - core.setOutput(constants_1.Outputs.CacheHit, false.toString()); + // `cache-hit` is intentionally not set to `false` here to preserve existing behavior + // See https://github.com/actions/cache/issues/1466 if (failOnCacheMiss) { throw new Error(`Failed to restore cache entry. Exiting as fail-on-cache-miss is set. Input key: ${primaryKey}`); } diff --git a/package-lock.json b/package-lock.json index 73f4e6a..fb36255 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cache", - "version": "4.1.0", + "version": "4.1.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "cache", - "version": "4.1.0", + "version": "4.1.1", "license": "MIT", "dependencies": { "@actions/cache": "^3.2.3", diff --git a/package.json b/package.json index 08ba312..ce050e5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cache", - "version": "4.1.0", + "version": "4.1.1", "private": true, "description": "Cache dependencies and build outputs", "main": "dist/restore/index.js", diff --git a/src/restoreImpl.ts b/src/restoreImpl.ts index bb302ac..54bef49 100644 --- a/src/restoreImpl.ts +++ b/src/restoreImpl.ts @@ -51,7 +51,9 @@ export async function restoreImpl( ); if (!cacheKey) { - core.setOutput(Outputs.CacheHit, false.toString()); + // `cache-hit` is intentionally not set to `false` here to preserve existing behavior + // See https://github.com/actions/cache/issues/1466 + if (failOnCacheMiss) { throw new Error( `Failed to restore cache entry. Exiting as fail-on-cache-miss is set. Input key: ${primaryKey}` From 8469c94c6a180dfb41a1bd7e1b46ac557ea124f1 Mon Sep 17 00:00:00 2001 From: "Jan T. Sott" Date: Tue, 8 Oct 2024 21:53:09 +0200 Subject: [PATCH 9/9] Add Bun example (#1456) * Add Bun example * Fix Bun Windows example --- README.md | 1 + examples.md | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/README.md b/README.md index c58a135..eb4713d 100644 --- a/README.md +++ b/README.md @@ -157,6 +157,7 @@ Every programming language and framework has its own way of caching. See [Examples](examples.md) for a list of `actions/cache` implementations for use with: +* [Bun](./examples.md#bun) * [C# - NuGet](./examples.md#c---nuget) * [Clojure - Lein Deps](./examples.md#clojure---lein-deps) * [D - DUB](./examples.md#d---dub) diff --git a/examples.md b/examples.md index d47780b..ac78be2 100644 --- a/examples.md +++ b/examples.md @@ -1,5 +1,6 @@ # Examples +- [Bun](#bun) - [C# - NuGet](#c---nuget) - [Clojure - Lein Deps](#clojure---lein-deps) - [D - DUB](#d---dub) @@ -41,6 +42,26 @@ - [Swift - Mint](#swift---mint) - [* - Bazel](#---bazel) +## Bun + +```yaml +- uses: actions/cache@v4 + with: + path: | + ~/.bun/install/cache + key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lockb') }} +``` + +### Windows + +```yaml +- uses: actions/cache@v4 + with: + path: | + ~\.bun + key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lockb') }} +``` + ## C# - NuGet Using [NuGet lock files](https://docs.microsoft.com/nuget/consume-packages/package-references-in-project-files#locking-dependencies):