cache/restore
Sankalp Kotewar c17f4bf466
GA for granular cache (#1035)
* Add example for Haskell Stack

* Revert "Add example for Haskell Stack"

* Basic implementation

* Updated variable name

* Adding wrapper class

* Changed logs to warnings

* added debug logs

* experimenting

* Test

* test

* new try

* test

* Impl separated

* Reverted wrapper changes

* Added test cases

* Some cleanup

* Formatted document

* Fixed test cases issues

* Slight modification for test cases check

* Updated new actions' input descriptions

* Reverted custom asks implemented and added wrapper

* refactor into a generic outputter

* Readme draft for new actions

* Generated dist

* Fixed breaking test case

* Removed return type in promise

* Removed commented lines

* Calling methods from same file

* dist

* update save as well

* fix merge

* Changes for beta release

* Update dist folder

* Fixed formatting

* dist

* Add support for gzip fallback for restore of old cache on windows

* Fixed test cases

* Fixed test cases

* Added restore only and save only test cases

* Updated new actions dist files

* Removed comments

* Fixed inputs

* Renamed variables and added tests

* Fixed breaking test case

* Fixed review comments and tests

* added stateprovider changes

* Deleted stateprovider tests until added

* Added stateprovider test cases

* Fixed breaking test case

* Updated outputs of restore action

* Changes for beta release

* Update dist folder

* Add support for gzip fallback for restore of old cache on windows

* update for new beta release

* Update save/action.yml

Co-authored-by: Bishal Prasad <bishal-pdmsft@github.com>

* Update restore/action.yml

Co-authored-by: Bishal Prasad <bishal-pdmsft@github.com>

* Update restore/action.yml

Co-authored-by: Bishal Prasad <bishal-pdmsft@github.com>

* Update restore/action.yml

Co-authored-by: Bishal Prasad <bishal-pdmsft@github.com>

* Update restore/action.yml

Co-authored-by: Bishal Prasad <bishal-pdmsft@github.com>

* Added more assertions as values can't be checked

* Removed unused code

* Merged beta branch and resolved conflicts

* Added save readme

* Updates to save readme

* Renamed output

* Added cache hit info in readme

* Update restore/README.md

Co-authored-by: Bishal Prasad <bishal-pdmsft@github.com>

* Update restore/README.md

Co-authored-by: Bishal Prasad <bishal-pdmsft@github.com>

* Update restore/README.md

Co-authored-by: Bishal Prasad <bishal-pdmsft@github.com>

* Update save/README.md

Co-authored-by: Bishal Prasad <bishal-pdmsft@github.com>

* Update save/README.md

Co-authored-by: Bishal Prasad <bishal-pdmsft@github.com>

* Removed verbose statements

* Repositioned new actions introduction

* Added test case for restore state

* Addressed review comments

* nit

* nit: added language to code blocks

* Updated beta version to 3.2.0-beta.1

* Added stateprovider mock implementations

* Linting errors fixed

* Save-only warning added

* Updated return ID to -2

* Removed -2 error code

* Removed comment

* Updated cache npm lib version

* Updated license version

* Updated releases.md

* Updated readme with the new actions in what's new

Co-authored-by: Malo Bourgon <mbourgon@gmail.com>
Co-authored-by: Vipul <vsvipul@github.com>
Co-authored-by: Bishal Prasad <bishal-pdmsft@github.com>
Co-authored-by: Tanuj Kumar Mishra <tanuj077@users.noreply.github.com>
Co-authored-by: Sampark Sharma <phantsure@github.com>
2022-12-21 19:38:44 +05:30
..
README.md GA for granular cache (#1035) 2022-12-21 19:38:44 +05:30
action.yml GA for granular cache (#1035) 2022-12-21 19:38:44 +05:30

README.md

Restore action

The restore action, as the name suggest, restores a cache. It acts similar to thecache action except that it doesn't have a post step to save the cache. This action can provide you a granular control to only restore a cache without having to necessarily save it. It accepts the same set of inputs as the cache action.

Inputs

  • path - A list of files, directories, and wildcard patterns to cache and restore. See @actions/glob for supported patterns.
  • key - String used while saving cache for restoring the cache
  • restore-keys - An ordered list of prefix-matched keys to use for restoring stale cache if no cache hit occurred for key.

Outputs

  • cache-hit - A boolean value to indicate an exact match was found for the key.
  • cache-primary-key - Cache primary key passed in the input to use in subsequent steps of the workflow.
  • cache-matched-key - Key of the cache that was restored, it could either be the primary key on cache-hit or a partial/complete match of one of the restore keys.

Note cache-hit will be set to true only when 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.

Environment Variables

  • SEGMENT_DOWNLOAD_TIMEOUT_MINS - Segment download timeout (in minutes, default 60) to abort download of the segment if not completed in the defined number of minutes. Read more

Use cases

As this is a newly introduced action to give users more control in their workflows, below are some use cases where one can use this action.

Only restore cache

In case you are using another workflow to create and save your cache that can be reused by other jobs in your repository, this action will take care of your restore only needs.

steps:
  - uses: actions/checkout@v3

  - uses: actions/cache/restore@v3
    id: cache
    with:
      path: path/to/dependencies
      key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}

  - name: Install Dependencies
    if: steps.cache.outputs.cache-hit != 'true'
    run: /install.sh

  - name: Build
    run: /build.sh

  - name: Publish package to public
    run: /publish.sh

Once the cache is restored, this action won't run any post step to do post-processing like actions/cache and the rest of the workflow will run as usual.

Save intermediate private build artifacts

In case of multi-module projects, where the built artifact of one project needs to be reused in subsequent child modules, the need of rebuilding the parent module again and again with every build can be eliminated. The actions/cache or actions/cache/save action can be used to build and save the parent module artifact once, and restored multiple times while building the child modules.

Step 1 - Build the parent module and save it

steps:
  - uses: actions/checkout@v3

  - name: Build
    run: /build-parent-module.sh

  - uses: actions/cache/save@v3
    id: cache
    with:
      path: path/to/dependencies
      key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}

Step 2 - Restore the built artifact from cache using the same key and path

steps:
  - uses: actions/checkout@v3

  - uses: actions/cache/restore@v3
    id: cache
    with:
      path: path/to/dependencies
      key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}

  - name: Install Dependencies
    if: steps.cache.outputs.cache-hit != 'true'
    run: /install.sh

  - name: Build
    run: /build-child-module.sh

  - name: Publish package to public
    run: /publish.sh

Exit workflow on cache miss

You can use the output of this action to exit the workflow on cache miss. This way you can restrict your workflow to only initiate the build when cache-hit occurs, in other words, cache with exact key is found.

steps:
  - uses: actions/checkout@v3

  - uses: actions/cache/restore@v3
    id: cache
    with:
      path: path/to/dependencies
      key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}

  - name: Check cache hit
    if: steps.cache.outputs.cache-hit != 'true'
    run: exit 1

  - name: Build
    run: /build.sh

Tips

Reusing primary key and restored key in the save action

Usually you may want to use same key in both actions/cache/restoreandactions/cache/saveaction. To achieve this, useoutputs` from the restore action to reuse the same primary key (or the key of the cache that was restored).

Using restore action outputs to make save action behave just like the cache action

The outputs cache-primary-key and cache-matched-key can be used to check if the restored cache is same as the given primary key. Alternatively, the cache-hit output can also be used to check if the restored was a complete match or a partially restored cache.

Ensuring proper restores and save happen across the actions

It is very important to use the same key and path that were used by either actions/cache or actions/cache/save while saving the cache. Learn more about cache key naming and versioning here.