From c33bc5a2329826ce7111059149cd750b4704308b Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Mon, 17 Apr 2023 18:58:11 -0700 Subject: [PATCH] new: Clean target directory before saving. (#3) --- README.md | 26 +++++++++++++++--------- package.json | 2 +- src/cargo.ts | 57 ++++++++++++++++++++++++++++++++++++---------------- src/fs.ts | 12 +++++++++++ 4 files changed, 69 insertions(+), 28 deletions(-) create mode 100644 src/fs.ts diff --git a/README.md b/README.md index 789120b..86af5ee 100644 --- a/README.md +++ b/README.md @@ -86,16 +86,22 @@ CI times. To disable caching, set the `cache` input to `false`. The following optimizations and considerations are taken into account when caching: -- The `~/.cargo/bin` directory is not cached as we manage binary installation in this action via the - `bins` input. -- The `~/.cargo/git` directory is not cached as it's not necessary for CI. When required by Cargo or - a crate, a checkout will be performed on-demand. -- The `~/.cargo/registry` directory is _cleaned_ before saving the cache. This includes removing - `src`, `.cache`, and any other unnecessary files. -- Only the `/target/debug` profile is cached, as this profile is typically used for formatting, - linting, and testing. -- The following sources are hashed for the generated cache key: `$GITHUB_JOB`, `Cargo.lock`, Rust - version, Rust commit hash, and operating system. +- `~/.cargo` + - The `/bin` directory is not cached as we manage binary installation in this action via the + `bins` input. + - The `/git` directory is not cached as it's not necessary for CI. When required by Cargo or a + crate, a checkout will be performed on-demand. + - The `/registry` directory is _cleaned_ before saving the cache. This includes removing `src`, + `.cache`, and any other unnecessary files. +- `/target/debug` + - Only the `debug` profile is cached, as this profile is typically used for formatting, linting, + and testing. + - The `/examples` and `/incremental` directories are not cached as they are not necessary for CI. + - All dep-info (`*.d`) files are removed, as they're meant for build systems and signaling + re-executions. + +The following sources are hashed for the generated cache key: `$GITHUB_JOB`, `Cargo.lock`, Rust +version, Rust commit hash, and OS. ## Compared to diff --git a/package.json b/package.json index f572974..ac60deb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@moonrepo/setup-rust", - "version": "0.3.6", + "version": "0.4.0", "description": "A GitHub action for setting up Rust and Cargo.", "main": "dist/index.js", "scripts": { diff --git a/src/cargo.ts b/src/cargo.ts index 27406a8..00ae171 100644 --- a/src/cargo.ts +++ b/src/cargo.ts @@ -6,12 +6,14 @@ import * as cache from '@actions/cache'; import * as core from '@actions/core'; import * as exec from '@actions/exec'; import * as glob from '@actions/glob'; -import * as io from '@actions/io'; import * as tc from '@actions/tool-cache'; +import { rmrf } from './fs'; import { RUST_HASH, RUST_VERSION } from './rust'; export const CARGO_HOME = process.env.CARGO_HOME ?? path.join(os.homedir(), '.cargo'); +export const WORKSPACE_ROOT = process.env.GITHUB_WORKSPACE ?? process.cwd(); + export const CACHE_ENABLED = core.getBooleanInput('cache') || cache.isFeatureAvailable(); export async function downloadAndInstallBinstall(binDir: string) { @@ -87,12 +89,12 @@ export function getCachePaths(): string[] { // ~/.cargo/registry path.join(CARGO_HOME, 'registry'), // /workspace/target/debug - path.join(process.env.GITHUB_WORKSPACE ?? process.cwd(), 'target/debug'), + path.join(WORKSPACE_ROOT, 'target/debug'), ]; } export function getCachePrefixes(): string[] { - return [`setup-rustcargo-v0-${process.platform}`, 'setup-rustcargo-v0']; + return [`setup-rustcargo-v1-${process.platform}`, 'setup-rustcargo-v1']; } export async function getPrimaryCacheKey() { @@ -122,7 +124,7 @@ export async function getPrimaryCacheKey() { } export async function cleanCargoRegistry() { - core.info('Cleaning cache before saving'); + core.info('Cleaning ~/.cargo before saving'); const registryDir = path.join(CARGO_HOME, 'registry'); @@ -133,25 +135,46 @@ export async function cleanCargoRegistry() { const indexDir = path.join(registryDir, 'index'); if (fs.existsSync(indexDir)) { - for (const index of fs.readdirSync(indexDir)) { - if (fs.existsSync(path.join(indexDir, index, '.git'))) { - const dir = path.join(indexDir, index, '.cache'); - - core.debug(`Deleting ${dir}`); - - try { - // eslint-disable-next-line no-await-in-loop - await io.rmRF(dir); - } catch (error: unknown) { - core.warning(`Failed to delete ${dir}: ${error}`); + await Promise.all( + fs.readdirSync(indexDir).map(async (index) => { + if (fs.existsSync(path.join(indexDir, index, '.git'))) { + await rmrf(path.join(indexDir, index, '.cache')); } - } - } + }), + ); } // .cargo/registry/cache - Do nothing? } +// https://doc.rust-lang.org/cargo/guide/build-cache.html +export async function cleanTargetProfile() { + core.info('Cleaning target/debug before saving'); + + const targetDir = path.join(WORKSPACE_ROOT, 'target/debug'); + + // target/debug/{examples,incremental} - Not required in CI + core.info('Removing examples and incremental directories'); + + await Promise.all( + ['examples', 'incremental'].map(async (dirName) => { + const dir = path.join(targetDir, dirName); + + if (fs.existsSync(dir)) { + await rmrf(dir); + } + }), + ); + + // target/debug/**/*.d - Not required in CI? + core.info('Removing dep-info files (*.d)'); + + const globber = await glob.create(path.join(targetDir, '**/*.d')); + const files = await globber.glob(); + + await Promise.all(files.map(rmrf)); +} + export async function saveCache() { if (!CACHE_ENABLED) { return; diff --git a/src/fs.ts b/src/fs.ts new file mode 100644 index 0000000..31454d2 --- /dev/null +++ b/src/fs.ts @@ -0,0 +1,12 @@ +import * as core from '@actions/core'; +import * as io from '@actions/io'; + +export async function rmrf(dir: string) { + core.debug(`Deleting ${dir}`); + + try { + await io.rmRF(dir); + } catch (error: unknown) { + core.warning(`Failed to delete ${dir}: ${error}`); + } +}