mirror of
https://github.com/actions/cache.git
synced 2024-12-27 09:45:24 +01:00
eb78578266
* Allow for multiple line-delimited paths to cache * Add initial minimatch support * Use @actions/glob for pattern matching * Cache multiple entries using --files-from tar input remove known failing test Quote tar paths Add salt to test cache Try reading input files from manifest bump salt Run test on macos more testing Run caching tests on 3 platforms Run tests on self-hosted Apparently cant reference hosted runners by name Bump salt wait for some time after save more timing out smarter waiting Cache in tmp dir that won't be deleted Use child_process instead of actions/exec Revert tempDir hack bump salt more logging More console logging Use filepath to with cacheHttpClient Test cache restoration Revert temp dir hack debug logging clean up cache.yml testing Bump salt change debug output build actions * unit test coverage for caching multiple dirs * Ensure there's a locateable test folder at homedir * Clean up code * Version cache with all inputs * Unit test getCacheVersion * Include keys in getCacheEntry request * Clean import orders * Use fs promises in actionUtils tests * Update import order for to fix linter errors * Fix remaining linter error * Remove platform-specific test code * Add lerna example for caching multiple dirs * Lerna example updated to v2 Co-Authored-By: Josh Gross <joshmgross@github.com> Co-authored-by: Josh Gross <joshmgross@github.com>
443 lines
11 KiB
Markdown
443 lines
11 KiB
Markdown
# Examples
|
|
|
|
- [Examples](#examples)
|
|
- [C# - NuGet](#c---nuget)
|
|
- [Elixir - Mix](#elixir---mix)
|
|
- [Go - Modules](#go---modules)
|
|
- [Haskell - Cabal](#haskell---cabal)
|
|
- [Java - Gradle](#java---gradle)
|
|
- [Java - Maven](#java---maven)
|
|
- [Node - npm](#node---npm)
|
|
- [macOS and Ubuntu](#macos-and-ubuntu)
|
|
- [Windows](#windows)
|
|
- [Using multiple systems and `npm config`](#using-multiple-systems-and-npm-config)
|
|
- [Node - Yarn](#node---yarn)
|
|
- [Node - Lerna](#node---lerna)
|
|
- [OCaml/Reason - esy](#ocamlreason---esy)
|
|
- [PHP - Composer](#php---composer)
|
|
- [Python - pip](#python---pip)
|
|
- [Simple example](#simple-example)
|
|
- [Multiple OS's in a workflow](#multiple-oss-in-a-workflow)
|
|
- [Using a script to get cache location](#using-a-script-to-get-cache-location)
|
|
- [R - renv](#r---renv)
|
|
- [Simple example](#simple-example-1)
|
|
- [Multiple OS's in a workflow](#multiple-oss-in-a-workflow-1)
|
|
- [Ruby - Bundler](#ruby---bundler)
|
|
- [Rust - Cargo](#rust---cargo)
|
|
- [Scala - SBT](#scala---sbt)
|
|
- [Swift, Objective-C - Carthage](#swift-objective-c---carthage)
|
|
- [Swift, Objective-C - CocoaPods](#swift-objective-c---cocoapods)
|
|
- [Swift - Swift Package Manager](#swift---swift-package-manager)
|
|
|
|
## C# - NuGet
|
|
Using [NuGet lock files](https://docs.microsoft.com/nuget/consume-packages/package-references-in-project-files#locking-dependencies):
|
|
|
|
```yaml
|
|
- uses: actions/cache@v1
|
|
with:
|
|
path: ~/.nuget/packages
|
|
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-nuget-
|
|
```
|
|
|
|
Depending on the environment, huge packages might be pre-installed in the global cache folder.
|
|
If you do not want to include them, consider to move the cache folder like below.
|
|
>Note: This workflow does not work for projects that require files to be placed in user profile package folder
|
|
```yaml
|
|
env:
|
|
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
|
|
steps:
|
|
- uses: actions/cache@v1
|
|
with:
|
|
path: ${{ github.workspace }}/.nuget/packages
|
|
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-nuget-
|
|
```
|
|
|
|
## Elixir - Mix
|
|
```yaml
|
|
- uses: actions/cache@v1
|
|
with:
|
|
path: deps
|
|
key: ${{ runner.os }}-mix-${{ hashFiles(format('{0}{1}', github.workspace, '/mix.lock')) }}
|
|
restore-keys: |
|
|
${{ runner.os }}-mix-
|
|
```
|
|
|
|
## Go - Modules
|
|
|
|
```yaml
|
|
- uses: actions/cache@v1
|
|
with:
|
|
path: ~/go/pkg/mod
|
|
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-go-
|
|
```
|
|
|
|
## Haskell - Cabal
|
|
|
|
We cache the elements of the Cabal store separately, as the entirety of `~/.cabal` can grow very large for projects with many dependencies.
|
|
|
|
```yaml
|
|
- uses: actions/cache@v1
|
|
name: Cache ~/.cabal/packages
|
|
with:
|
|
path: ~/.cabal/packages
|
|
key: ${{ runner.os }}-${{ matrix.ghc }}-cabal-packages
|
|
- uses: actions/cache@v1
|
|
name: Cache ~/.cabal/store
|
|
with:
|
|
path: ~/.cabal/store
|
|
key: ${{ runner.os }}-${{ matrix.ghc }}-cabal-store
|
|
- uses: actions/cache@v1
|
|
name: Cache dist-newstyle
|
|
with:
|
|
path: dist-newstyle
|
|
key: ${{ runner.os }}-${{ matrix.ghc }}-dist-newstyle
|
|
```
|
|
|
|
## Java - Gradle
|
|
|
|
```yaml
|
|
- uses: actions/cache@v1
|
|
with:
|
|
path: ~/.gradle/caches
|
|
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-gradle-
|
|
```
|
|
|
|
## Java - Maven
|
|
|
|
```yaml
|
|
- uses: actions/cache@v1
|
|
with:
|
|
path: ~/.m2/repository
|
|
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-maven-
|
|
```
|
|
|
|
## Node - npm
|
|
|
|
For npm, cache files are stored in `~/.npm` on Posix, or `%AppData%/npm-cache` on Windows. See https://docs.npmjs.com/cli/cache#cache
|
|
|
|
>Note: It is not recommended to cache `node_modules`, as it can break across Node versions and won't work with `npm ci`
|
|
|
|
### macOS and Ubuntu
|
|
|
|
```yaml
|
|
- uses: actions/cache@v1
|
|
with:
|
|
path: ~/.npm
|
|
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-node-
|
|
```
|
|
|
|
### Windows
|
|
|
|
```yaml
|
|
- name: Get npm cache directory
|
|
id: npm-cache
|
|
run: |
|
|
echo "::set-output name=dir::$(npm config get cache)"
|
|
- uses: actions/cache@v1
|
|
with:
|
|
path: ${{ steps.npm-cache.outputs.dir }}
|
|
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-node-
|
|
```
|
|
|
|
### Using multiple systems and `npm config`
|
|
|
|
```yaml
|
|
- name: Get npm cache directory
|
|
id: npm-cache
|
|
run: |
|
|
echo "::set-output name=dir::$(npm config get cache)"
|
|
- uses: actions/cache@v1
|
|
with:
|
|
path: ${{ steps.npm-cache.outputs.dir }}
|
|
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-node-
|
|
```
|
|
|
|
## Node - Yarn
|
|
The yarn cache directory will depend on your operating system and version of `yarn`. See https://yarnpkg.com/lang/en/docs/cli/cache/ for more info.
|
|
|
|
```yaml
|
|
- name: Get yarn cache directory path
|
|
id: yarn-cache-dir-path
|
|
run: echo "::set-output name=dir::$(yarn cache dir)"
|
|
|
|
- uses: actions/cache@v1
|
|
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 }}
|
|
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-yarn-
|
|
```
|
|
|
|
## Node - Lerna
|
|
|
|
```yaml
|
|
- name: restore lerna
|
|
uses: actions/cache@v2
|
|
with:
|
|
path: |
|
|
node_modules
|
|
*/*/node_modules
|
|
key: ${{ runner.os }}-${{ hashFiles('yarn.lock') }}
|
|
```
|
|
|
|
## OCaml/Reason - esy
|
|
Esy allows you to export built dependencies and import pre-built dependencies.
|
|
```yaml
|
|
- name: Restore Cache
|
|
id: restore-cache
|
|
uses: actions/cache@v1
|
|
with:
|
|
path: _export
|
|
key: ${{ runner.os }}-esy-${{ hashFiles('esy.lock/index.json') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-esy-
|
|
- name: Esy install
|
|
run: 'esy install'
|
|
- name: Import Cache
|
|
run: |
|
|
esy import-dependencies _export
|
|
rm -rf _export
|
|
|
|
...(Build job)...
|
|
|
|
# Re-export dependencies if anything has changed or if it is the first time
|
|
- name: Setting dependency cache
|
|
run: |
|
|
esy export-dependencies
|
|
if: steps.restore-cache.outputs.cache-hit != 'true'
|
|
```
|
|
|
|
|
|
## PHP - Composer
|
|
|
|
```yaml
|
|
- name: Get Composer Cache Directory
|
|
id: composer-cache
|
|
run: |
|
|
echo "::set-output name=dir::$(composer config cache-files-dir)"
|
|
- uses: actions/cache@v1
|
|
with:
|
|
path: ${{ steps.composer-cache.outputs.dir }}
|
|
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-composer-
|
|
```
|
|
|
|
## Python - pip
|
|
|
|
For pip, the cache directory will vary by OS. See https://pip.pypa.io/en/stable/reference/pip_install/#caching
|
|
|
|
Locations:
|
|
- Ubuntu: `~/.cache/pip`
|
|
- Windows: `~\AppData\Local\pip\Cache`
|
|
- macOS: `~/Library/Caches/pip`
|
|
|
|
### Simple example
|
|
```yaml
|
|
- uses: actions/cache@v1
|
|
with:
|
|
path: ~/.cache/pip
|
|
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-pip-
|
|
```
|
|
|
|
Replace `~/.cache/pip` with the correct `path` if not using Ubuntu.
|
|
|
|
### Multiple OS's in a workflow
|
|
|
|
```yaml
|
|
- uses: actions/cache@v1
|
|
if: startsWith(runner.os, 'Linux')
|
|
with:
|
|
path: ~/.cache/pip
|
|
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-pip-
|
|
|
|
- uses: actions/cache@v1
|
|
if: startsWith(runner.os, 'macOS')
|
|
with:
|
|
path: ~/Library/Caches/pip
|
|
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-pip-
|
|
|
|
- uses: actions/cache@v1
|
|
if: startsWith(runner.os, 'Windows')
|
|
with:
|
|
path: ~\AppData\Local\pip\Cache
|
|
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-pip-
|
|
```
|
|
|
|
### Using a script to get cache location
|
|
|
|
> Note: This uses an internal pip API and may not always work
|
|
```yaml
|
|
- name: Get pip cache
|
|
id: pip-cache
|
|
run: |
|
|
python -c "from pip._internal.locations import USER_CACHE_DIR; print('::set-output name=dir::' + USER_CACHE_DIR)"
|
|
|
|
- uses: actions/cache@v1
|
|
with:
|
|
path: ${{ steps.pip-cache.outputs.dir }}
|
|
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-pip-
|
|
```
|
|
|
|
## R - renv
|
|
|
|
For renv, the cache directory will vary by OS. Look at https://rstudio.github.io/renv/articles/renv.html#cache
|
|
|
|
Locations:
|
|
- Ubuntu: `~/.local/share/renv`
|
|
- macOS: `~/Library/Application Support/renv`
|
|
- Windows: `%LOCALAPPDATA%/renv`
|
|
|
|
### Simple example
|
|
```yaml
|
|
- uses: actions/cache@v1
|
|
with:
|
|
path: ~/.local/share/renv
|
|
key: ${{ runner.os }}-renv-${{ hashFiles('**/renv.lock') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-renv-
|
|
```
|
|
|
|
Replace `~/.local/share/renv` with the correct `path` if not using Ubuntu.
|
|
|
|
### Multiple OS's in a workflow
|
|
|
|
```yaml
|
|
- uses: actions/cache@v1
|
|
if: startsWith(runner.os, 'Linux')
|
|
with:
|
|
path: ~/.local/share/renv
|
|
key: ${{ runner.os }}-renv-${{ hashFiles('**/renv.lock') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-renv-
|
|
|
|
- uses: actions/cache@v1
|
|
if: startsWith(runner.os, 'macOS')
|
|
with:
|
|
path: ~/Library/Application Support/renv
|
|
key: ${{ runner.os }}-renv-${{ hashFiles('**/renv.lock') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-renv-
|
|
|
|
- uses: actions/cache@v1
|
|
if: startsWith(runner.os, 'Windows')
|
|
with:
|
|
path: ~\AppData\Local\renv
|
|
key: ${{ runner.os }}-renv-${{ hashFiles('**/renv.lock') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-renv-
|
|
```
|
|
|
|
## Ruby - Bundler
|
|
|
|
```yaml
|
|
- uses: actions/cache@v1
|
|
with:
|
|
path: vendor/bundle
|
|
key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-gems-
|
|
```
|
|
When dependencies are installed later in the workflow, we must specify the same path for the bundler.
|
|
|
|
```yaml
|
|
- name: Bundle install
|
|
run: |
|
|
bundle config path vendor/bundle
|
|
bundle install --jobs 4 --retry 3
|
|
```
|
|
|
|
## Rust - Cargo
|
|
|
|
```yaml
|
|
- name: Cache cargo registry
|
|
uses: actions/cache@v1
|
|
with:
|
|
path: ~/.cargo/registry
|
|
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
|
|
- name: Cache cargo index
|
|
uses: actions/cache@v1
|
|
with:
|
|
path: ~/.cargo/git
|
|
key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }}
|
|
- name: Cache cargo build
|
|
uses: actions/cache@v1
|
|
with:
|
|
path: target
|
|
key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }}
|
|
```
|
|
|
|
## Scala - SBT
|
|
|
|
```yaml
|
|
- name: Cache SBT ivy cache
|
|
uses: actions/cache@v1
|
|
with:
|
|
path: ~/.ivy2/cache
|
|
key: ${{ runner.os }}-sbt-ivy-cache-${{ hashFiles('**/build.sbt') }}
|
|
- name: Cache SBT
|
|
uses: actions/cache@v1
|
|
with:
|
|
path: ~/.sbt
|
|
key: ${{ runner.os }}-sbt-${{ hashFiles('**/build.sbt') }}
|
|
```
|
|
|
|
## Swift, Objective-C - Carthage
|
|
|
|
```yaml
|
|
- uses: actions/cache@v1
|
|
with:
|
|
path: Carthage
|
|
key: ${{ runner.os }}-carthage-${{ hashFiles('**/Cartfile.resolved') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-carthage-
|
|
```
|
|
|
|
## Swift, Objective-C - CocoaPods
|
|
|
|
```yaml
|
|
- uses: actions/cache@v1
|
|
with:
|
|
path: Pods
|
|
key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-pods-
|
|
```
|
|
|
|
## Swift - Swift Package Manager
|
|
|
|
```yaml
|
|
- uses: actions/cache@v1
|
|
with:
|
|
path: .build
|
|
key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-spm-
|
|
```
|