diff --git a/action.yml b/action.yml index e000f77..e36be58 100644 --- a/action.yml +++ b/action.yml @@ -40,6 +40,9 @@ inputs: description: "Determines which provider to use for caching. Options are github or buildjet, defaults to github." required: false default: "github" + cache-bin: + description: "A boolean value indicating whether to cache ${CARGO_HOME}/bin (default: true)" + required: false outputs: cache-hit: description: "A boolean value that indicates an exact match was found." diff --git a/dist/restore/index.js b/dist/restore/index.js index aaa23a8..dfa51d6 100644 --- a/dist/restore/index.js +++ b/dist/restore/index.js @@ -88227,6 +88227,8 @@ class CacheConfig { this.cacheKey = ""; /** The secondary (restore) key that only contains the prefix and environment */ this.restoreKey = ""; + /** Whether to cache CARGO_HOME/.bin */ + this.cacheBin = true; /** The workspace configurations */ this.workspaces = []; /** The cargo binaries present during main step */ @@ -88299,6 +88301,7 @@ class CacheConfig { // Construct the lockfiles portion of the key: // This considers all the files found via globbing for various manifests // and lockfiles. + self.cacheBin = lib_core.getInput("cache-bin").toLowerCase() == "true"; // Constructs the workspace config and paths to restore: // The workspaces are given using a `$workspace -> $target` syntax. const workspaces = []; @@ -88393,7 +88396,19 @@ class CacheConfig { self.keyFiles = sort_and_uniq(keyFiles); key += `-${lockHash}`; self.cacheKey = key; - self.cachePaths = [config_CARGO_HOME]; + // The original action (https://github.com/Swatinem/rust-cache) cached the entire CARGO_HOME, + // but cleaned out CARGO_HOME/bin of all binaries that weren't built by the CI run itself. + // This had the unfortunate side-effect of nuking rustup/cargo/rustc etc from self-hosted runners. + // (This is usually not a problem on hosted runners, since you get a fresh container on each run). + // So we edit this action to not cache bin/, and to bypass cleaning that directory out. + // TODO: Create an upstream patch for this, controlled by an option. + self.cachePaths = [ + external_path_default().join(config_CARGO_HOME, "registry"), + external_path_default().join(config_CARGO_HOME, "git"), + ]; + if (self.cacheBin) { + self.cachePaths = [external_path_default().join(config_CARGO_HOME, "bin"), ...self.cachePaths]; + } const cacheTargets = lib_core.getInput("cache-targets").toLowerCase() || "true"; if (cacheTargets === "true") { self.cachePaths.push(...workspaces.map((ws) => ws.target)); diff --git a/dist/save/index.js b/dist/save/index.js index 046bfae..7332ee8 100644 --- a/dist/save/index.js +++ b/dist/save/index.js @@ -88227,6 +88227,8 @@ class CacheConfig { this.cacheKey = ""; /** The secondary (restore) key that only contains the prefix and environment */ this.restoreKey = ""; + /** Whether to cache CARGO_HOME/.bin */ + this.cacheBin = true; /** The workspace configurations */ this.workspaces = []; /** The cargo binaries present during main step */ @@ -88299,6 +88301,7 @@ class CacheConfig { // Construct the lockfiles portion of the key: // This considers all the files found via globbing for various manifests // and lockfiles. + self.cacheBin = core.getInput("cache-bin").toLowerCase() == "true"; // Constructs the workspace config and paths to restore: // The workspaces are given using a `$workspace -> $target` syntax. const workspaces = []; @@ -88393,7 +88396,19 @@ class CacheConfig { self.keyFiles = sort_and_uniq(keyFiles); key += `-${lockHash}`; self.cacheKey = key; - self.cachePaths = [CARGO_HOME]; + // The original action (https://github.com/Swatinem/rust-cache) cached the entire CARGO_HOME, + // but cleaned out CARGO_HOME/bin of all binaries that weren't built by the CI run itself. + // This had the unfortunate side-effect of nuking rustup/cargo/rustc etc from self-hosted runners. + // (This is usually not a problem on hosted runners, since you get a fresh container on each run). + // So we edit this action to not cache bin/, and to bypass cleaning that directory out. + // TODO: Create an upstream patch for this, controlled by an option. + self.cachePaths = [ + external_path_default().join(CARGO_HOME, "registry"), + external_path_default().join(CARGO_HOME, "git"), + ]; + if (self.cacheBin) { + self.cachePaths = [external_path_default().join(CARGO_HOME, "bin"), ...self.cachePaths]; + } const cacheTargets = core.getInput("cache-targets").toLowerCase() || "true"; if (cacheTargets === "true") { self.cachePaths.push(...workspaces.map((ws) => ws.target)); @@ -88855,12 +88870,14 @@ async function run() { catch (e) { core.debug(`${e.stack}`); } - try { - core.info(`... Cleaning cargo/bin ...`); - await cleanBin(config.cargoBins); - } - catch (e) { - core.debug(`${e.stack}`); + if (config.cacheBin) { + try { + core.info(`... Cleaning cargo/bin ...`); + await cleanBin(config.cargoBins); + } + catch (e) { + core.debug(`${e.stack}`); + } } try { core.info(`... Cleaning cargo git cache ...`); diff --git a/src/config.ts b/src/config.ts index 15ca1cf..832cbf3 100644 --- a/src/config.ts +++ b/src/config.ts @@ -25,6 +25,9 @@ export class CacheConfig { /** The secondary (restore) key that only contains the prefix and environment */ public restoreKey = ""; + /** Whether to cache CARGO_HOME/.bin */ + public cacheBin: boolean = true; + /** The workspace configurations */ public workspaces: Array = []; @@ -116,6 +119,8 @@ export class CacheConfig { // This considers all the files found via globbing for various manifests // and lockfiles. + self.cacheBin = core.getInput("cache-bin").toLowerCase() == "true"; + // Constructs the workspace config and paths to restore: // The workspaces are given using a `$workspace -> $target` syntax. @@ -128,7 +133,7 @@ export class CacheConfig { workspaces.push(new Workspace(root, target)); } self.workspaces = workspaces; - + let keyFiles = await globFiles(".cargo/config.toml\nrust-toolchain\nrust-toolchain.toml"); const parsedKeyFiles = []; // keyFiles that are parsed, pre-processed and hashed @@ -234,7 +239,19 @@ export class CacheConfig { key += `-${lockHash}`; self.cacheKey = key; - self.cachePaths = [CARGO_HOME]; + // The original action (https://github.com/Swatinem/rust-cache) cached the entire CARGO_HOME, + // but cleaned out CARGO_HOME/bin of all binaries that weren't built by the CI run itself. + // This had the unfortunate side-effect of nuking rustup/cargo/rustc etc from self-hosted runners. + // (This is usually not a problem on hosted runners, since you get a fresh container on each run). + // So we edit this action to not cache bin/, and to bypass cleaning that directory out. + // TODO: Create an upstream patch for this, controlled by an option. + self.cachePaths = [ + path.join(CARGO_HOME, "registry"), + path.join(CARGO_HOME, "git"), + ]; + if (self.cacheBin) { + self.cachePaths = [path.join(CARGO_HOME, "bin"), ...self.cachePaths]; + } const cacheTargets = core.getInput("cache-targets").toLowerCase() || "true"; if (cacheTargets === "true") { self.cachePaths.push(...workspaces.map((ws) => ws.target)); diff --git a/src/save.ts b/src/save.ts index ed338bb..a62019e 100644 --- a/src/save.ts +++ b/src/save.ts @@ -56,11 +56,13 @@ async function run() { core.debug(`${(e as any).stack}`); } - try { - core.info(`... Cleaning cargo/bin ...`); - await cleanBin(config.cargoBins); - } catch (e) { - core.debug(`${(e as any).stack}`); + if (config.cacheBin) { + try { + core.info(`... Cleaning cargo/bin ...`); + await cleanBin(config.cargoBins); + } catch (e) { + core.debug(`${(e as any).stack}`); + } } try {