cache/src/restore.ts

120 lines
3.8 KiB
TypeScript
Raw Normal View History

2019-10-30 14:48:49 -04:00
import * as core from "@actions/core";
import * as path from "path";
2019-10-30 14:48:49 -04:00
import * as cacheHttpClient from "./cacheHttpClient";
import { Events, Inputs, State } from "./constants";
import { extractTar } from "./tar";
2019-10-30 14:48:49 -04:00
import * as utils from "./utils/actionUtils";
2019-11-12 16:48:02 -05:00
async function run(): Promise<void> {
2019-10-30 14:48:49 -04:00
try {
// Validate inputs, this can cause task failure
if (!utils.isValidEvent()) {
utils.logWarning(
`Event Validation Error: The event type ${
process.env[Events.Key]
2020-04-17 15:46:46 -04:00
} is not supported because it's not tied to a branch or tag ref.`
);
return;
}
2019-10-30 14:48:49 -04:00
const primaryKey = core.getInput(Inputs.Key, { required: true });
core.saveState(State.CacheKey, primaryKey);
const restoreKeys = core
.getInput(Inputs.RestoreKeys)
.split("\n")
.filter(x => x !== "");
2019-10-30 14:48:49 -04:00
const keys = [primaryKey, ...restoreKeys];
core.debug("Resolved Keys:");
core.debug(JSON.stringify(keys));
if (keys.length > 10) {
core.setFailed(
`Key Validation Error: Keys are limited to a maximum of 10.`
);
return;
}
for (const key of keys) {
if (key.length > 512) {
core.setFailed(
`Key Validation Error: ${key} cannot be larger than 512 characters.`
);
return;
}
const regex = /^[^,]*$/;
if (!regex.test(key)) {
core.setFailed(
`Key Validation Error: ${key} cannot contain commas.`
);
return;
}
}
const compressionMethod = await utils.getCompressionMethod();
2019-10-30 14:48:49 -04:00
try {
const cacheEntry = await cacheHttpClient.getCacheEntry(keys, {
compressionMethod: compressionMethod
});
if (!cacheEntry?.archiveLocation) {
core.info(`Cache not found for input keys: ${keys.join(", ")}`);
return;
}
const archivePath = path.join(
2019-10-30 14:48:49 -04:00
await utils.createTempDirectory(),
utils.getCacheFileName(compressionMethod)
2019-10-30 14:48:49 -04:00
);
core.debug(`Archive Path: ${archivePath}`);
// Store the cache result
utils.setCacheState(cacheEntry);
try {
// Download the cache from the cache entry
await cacheHttpClient.downloadCache(
cacheEntry.archiveLocation,
archivePath
);
2019-10-30 14:48:49 -04:00
const archiveFileSize = utils.getArchiveFileSize(archivePath);
core.info(
`Cache Size: ~${Math.round(
archiveFileSize / (1024 * 1024)
)} MB (${archiveFileSize} B)`
);
await extractTar(archivePath, compressionMethod);
} finally {
// Try to delete the archive to save space
try {
await utils.unlinkFile(archivePath);
} catch (error) {
core.debug(`Failed to delete archive: ${error}`);
}
}
2019-10-30 14:48:49 -04:00
const isExactKeyMatch = utils.isExactKeyMatch(
primaryKey,
cacheEntry
);
utils.setCacheHitOutput(isExactKeyMatch);
core.info(
`Cache restored from key: ${cacheEntry && cacheEntry.cacheKey}`
2019-10-30 14:48:49 -04:00
);
} catch (error) {
utils.logWarning(error.message);
2019-10-30 14:48:49 -04:00
utils.setCacheHitOutput(false);
}
} catch (error) {
core.setFailed(error.message);
}
}
run();
export default run;