@mansagroup/nx-gcs-remote-cache
Version:
A Google Cloud Storage distributed cache plugin for Nx
102 lines (101 loc) • 4.51 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const storage_1 = require("@google-cloud/storage");
const tasks_runner_v2_1 = require("@nrwl/workspace/src/tasks-runner/tasks-runner-v2");
const fs_1 = require("fs");
const tar_1 = require("tar");
const tmp_promise_1 = require("tmp-promise");
const logger_1 = require("./logger");
class GCSRemoteCache {
constructor(bucketName) {
const storage = new storage_1.Storage();
this.bucket = storage.bucket(bucketName);
}
retrieve(hash, cacheDirectory) {
return __awaiter(this, void 0, void 0, function* () {
const remoteFileName = GCSRemoteCache.getRemoteFileName(hash);
const file = this.bucket.file(remoteFileName);
try {
const [exists] = yield file.exists();
if (!exists)
return true;
}
catch (err) {
logger_1.logger.warn(`Failed to check if the file already exist in the Google Cloud Storage bucket (error below). Ignoring.`);
console.error(err);
return false;
}
return (0, tmp_promise_1.withFile)((tmpFile) => __awaiter(this, void 0, void 0, function* () {
yield file.download({
destination: tmpFile.path,
});
yield fs_1.promises.mkdir(cacheDirectory, {
recursive: true,
});
yield (0, tar_1.extract)({
file: tmpFile.path,
cwd: cacheDirectory,
});
return true;
})).catch((err) => {
logger_1.logger.warn('Failed to retrieve Nx cache from Google Cloud Storage bucket (error below). Ignoring.');
console.error(err);
return false;
});
});
}
store(hash, cacheDirectory) {
return __awaiter(this, void 0, void 0, function* () {
const remoteFileName = GCSRemoteCache.getRemoteFileName(hash);
const file = this.bucket.file(remoteFileName);
try {
const [exists] = yield file.exists();
if (exists)
return true;
}
catch (err) {
logger_1.logger.warn(`Failed to check if the file already exist in the Google Cloud Storage bucket (error below). Ignoring.`);
console.error(err);
return false;
}
return (0, tmp_promise_1.withFile)((tmpFile) => __awaiter(this, void 0, void 0, function* () {
yield (0, tar_1.create)({
gzip: true,
file: tmpFile.path,
cwd: cacheDirectory,
}, [hash, `${hash}.commit`]);
yield this.bucket.upload(tmpFile.path, {
destination: remoteFileName,
});
return true;
})).catch((err) => {
logger_1.logger.warn('Failed to store Nx cache in Google Cloud Storage bucket (error below). Ignoring.');
console.error(err);
return false;
});
});
}
static getRemoteFileName(hash) {
return `${hash}.tar.gz`;
}
}
const tasksRunner = (tasks, options, context) => {
if (process.env.NX_REMOTE_CACHE_BUCKET) {
logger_1.logger.log('Using Google Cloud Storage remote cache.');
options.remoteCache = new GCSRemoteCache(process.env.NX_REMOTE_CACHE_BUCKET);
}
else {
logger_1.logger.warn('Missing NX_REMOTE_CACHE_BUCKET environment variable, skipping Google Cloud cache.');
}
return (0, tasks_runner_v2_1.tasksRunnerV2)(tasks, options, context);
};
exports.default = tasksRunner;