Skip to content

Commit

Permalink
fix: avoid downloading package when local cache exists (#123)
Browse files Browse the repository at this point in the history
* fix: avoid downloading package when local cache exists

As mentioned in
#107,
`setup` function didn't use `find` function even though it uses
`cacheDir` to store downloaded files, which leads to redundant download.

It is not significant on GitHub-hosted runners because
`cacheDir` stores files in local file system, which is ephemeral.
However, it wastes time on self-hosted runners.

This commit adds a step to search local file system cache for sccache as
well as splitting download procedure to a dedicated function.

* fix: explicit comparison for boolean-like value
  • Loading branch information
i10416 committed Jul 18, 2024
1 parent 6ab633f commit 3405202
Showing 1 changed file with 42 additions and 25 deletions.
67 changes: 42 additions & 25 deletions src/setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ import {
downloadTool,
extractTar,
extractZip,
cacheDir
cacheDir,
find
} from '@actions/tool-cache';
import {getOctokit} from '@actions/github';

Expand All @@ -39,8 +40,45 @@ async function setup() {
}
core.info(`try to setup sccache version: ${version}`);

// Search local file system cache for sccache.
// This is useful when actions run on a self-hosted runner.
let sccacheHome = find('sccache', version);
if (sccacheHome === '') {
const sccachePath = await downloadSCCache(version);
if (sccachePath instanceof Error) {
core.setFailed(sccachePath.message);
return;
} else {
const dirname = getDirname(version);
// Cache sccache.
sccacheHome = await cacheDir(
`${sccachePath}/${dirname}`,
'sccache',
version
);
core.info(`sccache cached to: ${sccacheHome}`);
}
} else {
core.info(`find sccache at: ${sccacheHome}`);
}
// Add sccache into path.
core.addPath(`${sccacheHome}`);
// Expose the sccache path as env.
core.exportVariable('SCCACHE_PATH', `${sccacheHome}/sccache`);

// Expose the gha cache related variable to make it easier for users to
// integrate with gha support.
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
core.exportVariable(
'ACTIONS_RUNTIME_TOKEN',
process.env.ACTIONS_RUNTIME_TOKEN || ''
);
}
/**
* @param version sccache version
* @returns Path to sccache on success. Error on checksum verification failure. */
async function downloadSCCache(version: string): Promise<Error | string> {
const filename = getFilename(version);
const dirname = getDirname(version);

const downloadUrl = `https://github.com/mozilla/sccache/releases/download/${version}/${filename}`;
const sha256Url = `${downloadUrl}.sha256`;
Expand All @@ -63,8 +101,7 @@ async function setup() {

// Compare the checksums.
if (calculatedChecksum !== providedChecksum) {
core.setFailed('Checksum verification failed');
return;
return Error('Checksum verification failed');
}
core.info(`Correct checksum: ${calculatedChecksum}`);

Expand All @@ -75,27 +112,7 @@ async function setup() {
sccachePath = await extractTar(sccachePackage);
}
core.info(`sccache extracted to: ${sccachePath}`);

// Cache sccache.
const sccacheHome = await cacheDir(
`${sccachePath}/${dirname}`,
'sccache',
version
);
core.info(`sccache cached to: ${sccacheHome}`);

// Add cached sccache into path.
core.addPath(`${sccacheHome}`);
// Expose the sccache path as env.
core.exportVariable('SCCACHE_PATH', `${sccacheHome}/sccache`);

// Expose the gha cache related variable to make it easier for users to
// integrate with gha support.
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
core.exportVariable(
'ACTIONS_RUNTIME_TOKEN',
process.env.ACTIONS_RUNTIME_TOKEN || ''
);
return sccachePath;
}

function getFilename(version: string): Error | string {
Expand Down

0 comments on commit 3405202

Please sign in to comment.