From 581312be20743c5ab2ac8552538146f139661810 Mon Sep 17 00:00:00 2001 From: Aiqiao Yan Date: Tue, 26 May 2020 12:45:38 -0400 Subject: [PATCH 1/2] Update readme and examples to use v2 --- README.md | 67 +++++++++++++++++++++++++--- examples.md | 124 +++++++++++++++++++++++++--------------------------- 2 files changed, 120 insertions(+), 71 deletions(-) diff --git a/README.md b/README.md index 6e93a87..3433950 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,58 @@ This action allows caching dependencies and build outputs to improve workflow ex See ["Caching dependencies to speed up workflows"](https://help.github.com/github/automating-your-workflow-with-github-actions/caching-dependencies-to-speed-up-workflows). +## What's New in V2 + +* Added support for caching multiple paths, + +```yaml +- name: Cache multiple relative paths + uses: actions/cache@v2 + with: + path: | + node_modules + dist + key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }} +``` +```yaml +- name: Cache multiple absolute paths + uses: actions/cache@v2 + with: + path: | + ~/cache + /path/to/dependencies + key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }} +``` + +[glob patterns](https://github.com/actions/toolkit/tree/master/packages/glob), + +```yaml +- name: Cache using glob patterns + uses: actions/cache@v2 + with: + path: | + **/*.ts + **/node_modules + key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }} +``` + +and single file caches. + +```yaml +- name: Cache single file + uses: actions/cache@v2 + with: + path: cache.tar + key: ${{ runner.os }} +``` + +* Increased perfomance and improved cache sizes using `zstd` compression +> Note this feature is off for Windows runner that are using `bsdtar` (e.g., windows-latest hosted runner) due to a bug in ziping large random files with `bsdtar` +* Allowed caching for all events with a ref +> See [events that trigger workflow](https://help.github.com/en/actions/reference/events-that-trigger-workflows) for info on which events do not have a `GITHUB_REF` +* Released the [`@actions/cache`](https://github.com/actions/toolkit/tree/master/packages/cache) npm package to allow other actions to utilize caching +* Added a best-effort cleanup step to delete the archive after extraction to reduce storage space + ## Usage ### Pre-requisites @@ -15,7 +67,8 @@ Create a workflow `.yml` file in your repositories `.github/workflows` directory ### Inputs -* `path` - A directory to store and save the cache +* `path` - Directories to store and save the cache. Supports pattern matching, multipath and single file cache +> See [`@actions/glob`](https://github.com/actions/toolkit/tree/master/packages/glob) for supported patterns. * `key` - An explicit key for restoring and saving the cache * `restore-keys` - An ordered list of keys to use for restoring the cache if no cache hit occurred for key @@ -46,7 +99,7 @@ jobs: - name: Cache Primes id: cache-primes - uses: actions/cache@v1 + uses: actions/cache@v2 with: path: prime-numbers key: ${{ runner.os }}-primes @@ -93,9 +146,11 @@ A cache key can include any of the contexts, functions, literals, and operators For example, using the [`hashFiles`](https://help.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#hashfiles) function allows you to create a new cache when dependencies change. ```yaml - - uses: actions/cache@v1 + - uses: actions/cache@v2 with: - path: path/to/dependencies + path: | + path/to/dependencies + some/other/dependencies key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }} ``` @@ -109,7 +164,7 @@ Additionally, you can use arbitrary command output in a cache key, such as a dat echo "::set-output name=date::$(/bin/date -u "+%Y%m%d")" shell: bash - - uses: actions/cache@v1 + - uses: actions/cache@v2 with: path: path/to/dependencies key: ${{ runner.os }}-${{ steps.get-date.outputs.date }}-${{ hashFiles('**/lockfiles') }} @@ -130,7 +185,7 @@ Example: steps: - uses: actions/checkout@v2 - - uses: actions/cache@v1 + - uses: actions/cache@v2 id: cache with: path: path/to/dependencies diff --git a/examples.md b/examples.md index ce31929..3666cd8 100644 --- a/examples.md +++ b/examples.md @@ -35,7 +35,7 @@ Using [NuGet lock files](https://docs.microsoft.com/nuget/consume-packages/package-references-in-project-files#locking-dependencies): ```yaml -- uses: actions/cache@v1 +- uses: actions/cache@v2 with: path: ~/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} @@ -50,7 +50,7 @@ If you do not want to include them, consider to move the cache folder like below env: NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages steps: - - uses: actions/cache@v1 + - uses: actions/cache@v2 with: path: ${{ github.workspace }}/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} @@ -58,12 +58,24 @@ steps: ${{ runner.os }}-nuget- ``` +With `actions/cache@v2` you can now exclude unwanted packages with [exclude pattern](https://github.com/actions/toolkit/tree/master/packages/glob#exclude-patterns) +```yaml +- uses: actions/cache@v2 + with: + path: | + ~/.nuget/packages + !~/.nuget/packages/unwanted + key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} + restore-keys: | + ${{ runner.os }}-nuget- +``` + ## D - DUB ### POSIX ```yaml -- uses: actions/cache@v1 +- uses: actions/cache@v2 with: path: ~/.dub key: ${{ runner.os }}-dub-${{ hashFiles('**/dub.json') }} @@ -74,7 +86,7 @@ steps: ### Windows ```yaml -- uses: actions/cache@v1 +- uses: actions/cache@v2 with: path: ~\AppData\Local\dub key: ${{ runner.os }}-dub-${{ hashFiles('**/dub.json') }} @@ -84,7 +96,7 @@ steps: ## Elixir - Mix ```yaml -- uses: actions/cache@v1 +- uses: actions/cache@v2 with: path: deps key: ${{ runner.os }}-mix-${{ hashFiles(format('{0}{1}', github.workspace, '/mix.lock')) }} @@ -95,7 +107,7 @@ steps: ## Go - Modules ```yaml -- uses: actions/cache@v1 +- uses: actions/cache@v2 with: path: ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} @@ -108,27 +120,20 @@ steps: 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 +- uses: actions/cache@v2 + name: Cache ~/.cabal/packages, ~/.cabal/store and dist-newstyle 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 + path: | + ~/.cabal/packages + ~/.cabal/store + dist-newstyle + key: ${{ runner.os }}-${{ matrix.ghc }} ``` ## Java - Gradle ```yaml -- uses: actions/cache@v1 +- uses: actions/cache@v2 with: path: ~/.gradle/caches key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }} @@ -139,7 +144,7 @@ We cache the elements of the Cabal store separately, as the entirety of `~/.caba ## Java - Maven ```yaml -- uses: actions/cache@v1 +- uses: actions/cache@v2 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} @@ -156,7 +161,7 @@ For npm, cache files are stored in `~/.npm` on Posix, or `%AppData%/npm-cache` o ### macOS and Ubuntu ```yaml -- uses: actions/cache@v1 +- uses: actions/cache@v2 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} @@ -171,7 +176,7 @@ For npm, cache files are stored in `~/.npm` on Posix, or `%AppData%/npm-cache` o id: npm-cache run: | echo "::set-output name=dir::$(npm config get cache)" -- uses: actions/cache@v1 +- uses: actions/cache@v2 with: path: ${{ steps.npm-cache.outputs.dir }} key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} @@ -186,7 +191,7 @@ For npm, cache files are stored in `~/.npm` on Posix, or `%AppData%/npm-cache` o id: npm-cache run: | echo "::set-output name=dir::$(npm config get cache)" -- uses: actions/cache@v1 +- uses: actions/cache@v2 with: path: ${{ steps.npm-cache.outputs.dir }} key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} @@ -196,10 +201,9 @@ For npm, cache files are stored in `~/.npm` on Posix, or `%AppData%/npm-cache` o ## Node - Lerna ->Note this example uses the new multi-paths feature and is only available at `master` ```yaml - name: restore lerna - uses: actions/cache@master + uses: actions/cache@v2 with: path: | node_modules @@ -215,7 +219,7 @@ The yarn cache directory will depend on your operating system and version of `ya id: yarn-cache-dir-path run: echo "::set-output name=dir::$(yarn cache dir)" -- uses: actions/cache@v1 +- uses: actions/cache@v2 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 }} @@ -229,7 +233,7 @@ Esy allows you to export built dependencies and import pre-built dependencies. ```yaml - name: Restore Cache id: restore-cache - uses: actions/cache@v1 + uses: actions/cache@v2 with: path: _export key: ${{ runner.os }}-esy-${{ hashFiles('esy.lock/index.json') }} @@ -259,7 +263,7 @@ Esy allows you to export built dependencies and import pre-built dependencies. id: composer-cache run: | echo "::set-output name=dir::$(composer config cache-files-dir)" -- uses: actions/cache@v1 +- uses: actions/cache@v2 with: path: ${{ steps.composer-cache.outputs.dir }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} @@ -278,7 +282,7 @@ Locations: ### Simple example ```yaml -- uses: actions/cache@v1 +- uses: actions/cache@v2 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} @@ -291,7 +295,7 @@ Replace `~/.cache/pip` with the correct `path` if not using Ubuntu. ### Multiple OS's in a workflow ```yaml -- uses: actions/cache@v1 +- uses: actions/cache@v2 if: startsWith(runner.os, 'Linux') with: path: ~/.cache/pip @@ -299,7 +303,7 @@ Replace `~/.cache/pip` with the correct `path` if not using Ubuntu. restore-keys: | ${{ runner.os }}-pip- -- uses: actions/cache@v1 +- uses: actions/cache@v2 if: startsWith(runner.os, 'macOS') with: path: ~/Library/Caches/pip @@ -307,7 +311,7 @@ Replace `~/.cache/pip` with the correct `path` if not using Ubuntu. restore-keys: | ${{ runner.os }}-pip- -- uses: actions/cache@v1 +- uses: actions/cache@v2 if: startsWith(runner.os, 'Windows') with: path: ~\AppData\Local\pip\Cache @@ -326,7 +330,7 @@ Replace `~/.cache/pip` with the correct `path` if not using Ubuntu. echo "::set-output name=dir::$(pip cache dir)" - name: pip cache - uses: actions/cache@v1 + uses: actions/cache@v2 with: path: ${{ steps.pip-cache.outputs.dir }} key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} @@ -343,7 +347,7 @@ Replace `~/.cache/pip` with the correct `path` if not using Ubuntu. run: | python -c "from pip._internal.locations import USER_CACHE_DIR; print('::set-output name=dir::' + USER_CACHE_DIR)" -- uses: actions/cache@v1 +- uses: actions/cache@v2 with: path: ${{ steps.pip-cache.outputs.dir }} key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} @@ -362,7 +366,7 @@ Locations: ### Simple example ```yaml -- uses: actions/cache@v1 +- uses: actions/cache@v2 with: path: ~/.local/share/renv key: ${{ runner.os }}-renv-${{ hashFiles('**/renv.lock') }} @@ -375,7 +379,7 @@ Replace `~/.local/share/renv` with the correct `path` if not using Ubuntu. ### Multiple OS's in a workflow ```yaml -- uses: actions/cache@v1 +- uses: actions/cache@v2 if: startsWith(runner.os, 'Linux') with: path: ~/.local/share/renv @@ -383,7 +387,7 @@ Replace `~/.local/share/renv` with the correct `path` if not using Ubuntu. restore-keys: | ${{ runner.os }}-renv- -- uses: actions/cache@v1 +- uses: actions/cache@v2 if: startsWith(runner.os, 'macOS') with: path: ~/Library/Application Support/renv @@ -391,7 +395,7 @@ Replace `~/.local/share/renv` with the correct `path` if not using Ubuntu. restore-keys: | ${{ runner.os }}-renv- -- uses: actions/cache@v1 +- uses: actions/cache@v2 if: startsWith(runner.os, 'Windows') with: path: ~\AppData\Local\renv @@ -403,7 +407,7 @@ Replace `~/.local/share/renv` with the correct `path` if not using Ubuntu. ## Ruby - Bundler ```yaml -- uses: actions/cache@v1 +- uses: actions/cache@v2 with: path: vendor/bundle key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }} @@ -422,42 +426,32 @@ When dependencies are installed later in the workflow, we must specify the same ## 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 +- name: Cache cargo + uses: actions/cache@v2 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') }} + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-${{ 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 + uses: actions/cache@v2 with: - path: ~/.sbt + path: | + ~/.ivy2/cache + ~/.sbt key: ${{ runner.os }}-sbt-${{ hashFiles('**/build.sbt') }} ``` ## Swift, Objective-C - Carthage ```yaml -- uses: actions/cache@v1 +- uses: actions/cache@v2 with: path: Carthage key: ${{ runner.os }}-carthage-${{ hashFiles('**/Cartfile.resolved') }} @@ -468,7 +462,7 @@ When dependencies are installed later in the workflow, we must specify the same ## Swift, Objective-C - CocoaPods ```yaml -- uses: actions/cache@v1 +- uses: actions/cache@v2 with: path: Pods key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }} @@ -479,7 +473,7 @@ When dependencies are installed later in the workflow, we must specify the same ## Swift - Swift Package Manager ```yaml -- uses: actions/cache@v1 +- uses: actions/cache@v2 with: path: .build key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }} From e6c708b5ce6d0601f321c6dbb373c563b4d15318 Mon Sep 17 00:00:00 2001 From: Aiqiao Yan Date: Tue, 26 May 2020 14:58:07 -0400 Subject: [PATCH 2/2] React to feedback --- README.md | 49 +++++++++---------------------------------------- action.yml | 2 +- examples.md | 29 ++++++++++++++--------------- 3 files changed, 24 insertions(+), 56 deletions(-) diff --git a/README.md b/README.md index 3433950..a0180c3 100644 --- a/README.md +++ b/README.md @@ -8,58 +8,28 @@ This action allows caching dependencies and build outputs to improve workflow ex See ["Caching dependencies to speed up workflows"](https://help.github.com/github/automating-your-workflow-with-github-actions/caching-dependencies-to-speed-up-workflows). -## What's New in V2 +## What's New -* Added support for caching multiple paths, +* Added support for multiple paths, [glob patterns](https://github.com/actions/toolkit/tree/master/packages/glob), and single file caches. ```yaml -- name: Cache multiple relative paths - uses: actions/cache@v2 - with: - path: | - node_modules - dist - key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }} -``` -```yaml -- name: Cache multiple absolute paths +- name: Cache multiple paths uses: actions/cache@v2 with: path: | ~/cache - /path/to/dependencies - key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }} -``` - -[glob patterns](https://github.com/actions/toolkit/tree/master/packages/glob), - -```yaml -- name: Cache using glob patterns - uses: actions/cache@v2 - with: - path: | - **/*.ts + !~/cache/exclude **/node_modules key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }} ``` -and single file caches. - -```yaml -- name: Cache single file - uses: actions/cache@v2 - with: - path: cache.tar - key: ${{ runner.os }} -``` - -* Increased perfomance and improved cache sizes using `zstd` compression -> Note this feature is off for Windows runner that are using `bsdtar` (e.g., windows-latest hosted runner) due to a bug in ziping large random files with `bsdtar` -* Allowed caching for all events with a ref -> See [events that trigger workflow](https://help.github.com/en/actions/reference/events-that-trigger-workflows) for info on which events do not have a `GITHUB_REF` +* Increased performance and improved cache sizes using `zstd` compression for Linux and macOS runners +* Allowed caching for all events with a ref. See [events that trigger workflow](https://help.github.com/en/actions/reference/events-that-trigger-workflows) for info on which events do not have a `GITHUB_REF` * Released the [`@actions/cache`](https://github.com/actions/toolkit/tree/master/packages/cache) npm package to allow other actions to utilize caching * Added a best-effort cleanup step to delete the archive after extraction to reduce storage space +Refer [here](https://github.com/actions/cache/blob/v1/README.md) for previous versions + ## Usage ### Pre-requisites @@ -67,8 +37,7 @@ Create a workflow `.yml` file in your repositories `.github/workflows` directory ### Inputs -* `path` - Directories to store and save the cache. Supports pattern matching, multipath and single file cache -> See [`@actions/glob`](https://github.com/actions/toolkit/tree/master/packages/glob) for supported patterns. +* `path` - A list of files, directories, and wildcard patterns to cache and restore. See [`@actions/glob`](https://github.com/actions/toolkit/tree/master/packages/glob) for supported patterns. * `key` - An explicit key for restoring and saving the cache * `restore-keys` - An ordered list of keys to use for restoring the cache if no cache hit occurred for key diff --git a/action.yml b/action.yml index 1a320f9..e50c38b 100644 --- a/action.yml +++ b/action.yml @@ -3,7 +3,7 @@ description: 'Cache artifacts like dependencies and build outputs to improve wor author: 'GitHub' inputs: path: - description: 'A directory to store and save the cache' + description: 'A list of files, directories, and wildcard patterns to cache and restore' required: true key: description: 'An explicit key for restoring and saving the cache' diff --git a/examples.md b/examples.md index 3666cd8..ec662bb 100644 --- a/examples.md +++ b/examples.md @@ -44,7 +44,19 @@ 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. -If you do not want to include them, consider to move the cache folder like below. +With `actions/cache@v2` you can now exclude unwanted packages with [exclude pattern](https://github.com/actions/toolkit/tree/master/packages/glob#exclude-patterns) +```yaml +- uses: actions/cache@v2 + with: + path: | + ~/.nuget/packages + !~/.nuget/packages/unwanted + key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} + restore-keys: | + ${{ runner.os }}-nuget- +``` + +Or you could 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: @@ -58,18 +70,6 @@ steps: ${{ runner.os }}-nuget- ``` -With `actions/cache@v2` you can now exclude unwanted packages with [exclude pattern](https://github.com/actions/toolkit/tree/master/packages/glob#exclude-patterns) -```yaml -- uses: actions/cache@v2 - with: - path: | - ~/.nuget/packages - !~/.nuget/packages/unwanted - key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} - restore-keys: | - ${{ runner.os }}-nuget- -``` - ## D - DUB ### POSIX @@ -426,8 +426,7 @@ When dependencies are installed later in the workflow, we must specify the same ## Rust - Cargo ```yaml -- name: Cache cargo - uses: actions/cache@v2 +- uses: actions/cache@v2 with: path: | ~/.cargo/registry