Create cache file.

This commit is contained in:
Miles Johnson 2023-11-17 09:51:54 -08:00
parent 131628d94f
commit d87f327046
5 changed files with 94 additions and 68 deletions

View file

@ -1,3 +1,7 @@
# 1.1.0
- Updated dependencies.
# 1.0.3 # 1.0.3
- Include `GITHUB_WORKFLOW` in cache key. - Include `GITHUB_WORKFLOW` in cache key.

View file

@ -9,6 +9,8 @@ inputs:
cache: cache:
description: 'Toggle caching of ~/.cargo/registry and /target/<cache-target> directories.' description: 'Toggle caching of ~/.cargo/registry and /target/<cache-target> directories.'
default: true default: true
cache-base:
description: 'Base branch or ref to save cache. Other branches and refs will restore from this base.'
cache-target: cache-target:
description: 'Name of the target profile to cache.' description: 'Name of the target profile to cache.'
default: 'debug' default: 'debug'

View file

@ -5,7 +5,8 @@ import * as core from '@actions/core';
import * as exec from '@actions/exec'; import * as exec from '@actions/exec';
import * as io from '@actions/io'; import * as io from '@actions/io';
import * as tc from '@actions/tool-cache'; import * as tc from '@actions/tool-cache';
import { CARGO_HOME, installBins, restoreCache } from './src/cargo'; import { CARGO_HOME } from './src/cache';
import { installBins, restoreCache } from './src/cargo';
import { installToolchain } from './src/rust'; import { installToolchain } from './src/rust';
export async function installRustup() { export async function installRustup() {

74
src/cache.ts Normal file
View file

@ -0,0 +1,74 @@
import crypto from 'node:crypto';
import os from 'node:os';
import path from 'node:path';
import * as cache from '@actions/cache';
import * as core from '@actions/core';
import * as glob from '@actions/glob';
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 function isCacheEnabled(): boolean {
return core.getBooleanInput('cache') && cache.isFeatureAvailable();
}
export function isUsingBaseWarmupStrategy(): boolean {
return false;
}
export function getCacheTarget(): string {
return core.getInput('cache-target') || 'debug';
}
export function getCachePaths(): string[] {
return [
// ~/.cargo/registry
path.join(CARGO_HOME, 'registry'),
// /workspace/target/debug
path.join(WORKSPACE_ROOT, 'target', getCacheTarget()),
];
}
export function getCachePrefixes(): string[] {
return [`setup-rustcargo-v1-${process.platform}`, 'setup-rustcargo-v1'];
}
export async function getPrimaryCacheKey() {
const hasher = crypto.createHash('sha1');
core.info('Generating cache key');
core.debug(`Hashing Rust version = ${RUST_VERSION}`);
hasher.update(RUST_VERSION);
core.debug(`Hashing Rust commit hash = ${RUST_HASH}`);
hasher.update(RUST_HASH);
const lockHash = await glob.hashFiles('Cargo.lock');
core.debug(`Hashing Cargo.lock = ${lockHash}`);
hasher.update(lockHash);
const cacheTarget = getCacheTarget();
core.debug(`Hashing target profile = ${cacheTarget}`);
hasher.update(cacheTarget);
const workflow = process.env.GITHUB_WORKFLOW;
if (workflow) {
core.debug(`Hashing GITHUB_WORKFLOW = ${workflow}`);
hasher.update(workflow);
}
const job = process.env.GITHUB_JOB;
if (job) {
core.debug(`Hashing GITHUB_JOB = ${job}`);
hasher.update(job);
}
return `${getCachePrefixes()[0]}-${hasher.digest('hex')}`;
}

View file

@ -1,6 +1,4 @@
import crypto from 'node:crypto';
import fs from 'node:fs'; import fs from 'node:fs';
import os from 'node:os';
import path from 'node:path'; import path from 'node:path';
import { family } from 'detect-libc'; import { family } from 'detect-libc';
import * as cache from '@actions/cache'; import * as cache from '@actions/cache';
@ -8,14 +6,16 @@ import * as core from '@actions/core';
import * as exec from '@actions/exec'; import * as exec from '@actions/exec';
import * as glob from '@actions/glob'; import * as glob from '@actions/glob';
import * as tc from '@actions/tool-cache'; import * as tc from '@actions/tool-cache';
import {
CARGO_HOME,
getCachePaths,
getCachePrefixes,
getCacheTarget,
getPrimaryCacheKey,
isCacheEnabled,
WORKSPACE_ROOT,
} from './cache';
import { rmrf } from './fs'; 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) { export async function downloadAndInstallBinstall(binDir: string) {
core.info('cargo-binstall does not exist, attempting to install'); core.info('cargo-binstall does not exist, attempting to install');
@ -79,7 +79,7 @@ export async function installBins() {
.map((bin) => bin.trim()) .map((bin) => bin.trim())
.filter(Boolean); .filter(Boolean);
if (CACHE_ENABLED) { if (isCacheEnabled()) {
bins.push('cargo-cache'); bins.push('cargo-cache');
} }
@ -98,61 +98,6 @@ export async function installBins() {
await exec.exec('cargo', ['binstall', '--no-confirm', '--log-level', 'info', ...bins]); await exec.exec('cargo', ['binstall', '--no-confirm', '--log-level', 'info', ...bins]);
} }
export function getCacheTarget(): string {
return core.getInput('cache-target') || 'debug';
}
export function getCachePaths(): string[] {
return [
// ~/.cargo/registry
path.join(CARGO_HOME, 'registry'),
// /workspace/target/debug
path.join(WORKSPACE_ROOT, 'target', getCacheTarget()),
];
}
export function getCachePrefixes(): string[] {
return [`setup-rustcargo-v1-${process.platform}`, 'setup-rustcargo-v1'];
}
export async function getPrimaryCacheKey() {
const hasher = crypto.createHash('sha1');
core.info('Generating cache key');
core.debug(`Hashing Rust version = ${RUST_VERSION}`);
hasher.update(RUST_VERSION);
core.debug(`Hashing Rust commit hash = ${RUST_HASH}`);
hasher.update(RUST_HASH);
const lockHash = await glob.hashFiles('Cargo.lock');
core.debug(`Hashing Cargo.lock = ${lockHash}`);
hasher.update(lockHash);
const cacheTarget = getCacheTarget();
core.debug(`Hashing target profile = ${cacheTarget}`);
hasher.update(cacheTarget);
const workflow = process.env.GITHUB_WORKFLOW;
if (workflow) {
core.debug(`Hashing GITHUB_WORKFLOW = ${workflow}`);
hasher.update(workflow);
}
const job = process.env.GITHUB_JOB;
if (job) {
core.debug(`Hashing GITHUB_JOB = ${job}`);
hasher.update(job);
}
return `${getCachePrefixes()[0]}-${hasher.digest('hex')}`;
}
export async function cleanCargoRegistry() { export async function cleanCargoRegistry() {
core.info('Cleaning ~/.cargo before saving'); core.info('Cleaning ~/.cargo before saving');
@ -208,7 +153,7 @@ export async function cleanTargetProfile() {
} }
export async function saveCache() { export async function saveCache() {
if (!CACHE_ENABLED) { if (!isCacheEnabled()) {
return; return;
} }
@ -229,7 +174,7 @@ export async function saveCache() {
} }
export async function restoreCache() { export async function restoreCache() {
if (!CACHE_ENABLED) { if (!isCacheEnabled()) {
return; return;
} }