UNPKG

@mansagroup/nx-gcs-remote-cache

Version:

A Google Cloud Storage distributed cache plugin for Nx

102 lines (101 loc) 4.51 kB
"use strict"; 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;