Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow opting out of caching $CARGO_HOME/bin. #216

Merged
merged 7 commits into from
Dec 10, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Allow opting out of caching CARGO_HOME/bin.
Prevents wiping the bin directory, which is harmful for
self-hosted runners.
  • Loading branch information
benjyw committed Oct 30, 2024
commit 5ed697a6894712d2854c80635bb00a2496ea307a
3 changes: 3 additions & 0 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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."
Expand Down
17 changes: 16 additions & 1 deletion dist/restore/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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 = [];
Expand Down Expand Up @@ -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));
Expand Down
31 changes: 24 additions & 7 deletions dist/save/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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 = [];
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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 ...`);
Expand Down
21 changes: 19 additions & 2 deletions src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<Workspace> = [];

Expand Down Expand Up @@ -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.

Expand All @@ -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

Expand Down Expand Up @@ -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));
Expand Down
12 changes: 7 additions & 5 deletions src/save.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down