A GitHub Action that implements smart caching for rust/cargo projects
Go to file
Arpad Borsos 83aad8d470 rebuild
2021-01-28 18:42:00 +01:00
.github initial commit 2020-09-26 23:48:29 +02:00
dist rebuild 2021-01-28 18:42:00 +01:00
src Add support for the cache-hit output 2021-01-28 18:39:18 +01:00
.gitignore initial commit 2020-09-26 23:48:29 +02:00
action.yml Add support for the cache-hit output 2021-01-28 18:39:18 +01:00
CHANGELOG.md support working-directory input, cleanup 2020-12-07 23:56:50 +01:00
package-lock.json update deps 2021-01-28 18:08:24 +01:00
package.json update deps 2021-01-28 18:08:24 +01:00
README.md document cache-hit output 2021-01-28 18:40:43 +01:00
tsconfig.json update dependencies and rebuild 2020-11-07 10:22:23 +01:00

Rust Cache Action

A GitHub Action that implements smart caching for rust/cargo projects with sensible defaults.

Example usage

# selecting a toolchain either by action or manual `rustup` calls should happen
# before the plugin, as it uses the current rustc version as its cache key
- uses: actions-rs/toolchain@v1
  with:
    profile: minimal
    toolchain: stable

- uses: Swatinem/rust-cache@v1

Inputs

: key
An optional key that is added to the automatic cache key.

sharedKey An additional key that is stable over multiple jobs.

working-directory The working directory the action operates in, is case the cargo project is not located in the repo root.

Outputs

: cache-hit

This is a boolean flag that will be set to true when there was an exact cache hit.

Cache Effectiveness

This action only caches the dependencies of a crate, so is more effective if the dependency / own code ratio is higher.

It is also most effective for repositories with a Cargo.lock file. Library repositories with only a Cargo.toml file have limited benefits, as cargo will always use the most up-to-date dependency versions, which may not be cached.

Usage with Stable Rust is most effective, as a cache is tied to the Rust version. Using it with Nightly Rust is less effective as it will throw away the cache every day.

Versioning

I use the v1 branch similar to master development, so if you want to have a more stable experience, please use a fixed revision or tag.

Cache Details

The cache currently caches the following directories:

  • ~/.cargo/registry/index
  • ~/.cargo/registry/cache
  • ~/.cargo/git
  • ./target

This cache is automatically keyed by:

  • the github job,
  • the rustc release / host / hash, and
  • a hash of the Cargo.lock / Cargo.toml files.

An additional input key can be provided if the builtin keys are not sufficient.

Before persisting, the cache is cleaned of intermediate artifacts and anything that is not a workspace dependency. In particular, no caching of workspace crates will be done. For this reason, this action will automatically set CARGO_INCREMENTAL=0 to disable incremental compilation.

The action will try to restore from a previous Cargo.lock version as well, so lockfile updates should only re-build changed dependencies.

Additionally, the action automatically works around cargo#8603 / actions/cache#403 which would otherwise corrupt the cache on macOS builds.