UNPKG

@atomist/sdm

Version:

Atomist Software Delivery Machine SDK

83 lines 3.77 kB
"use strict"; /* * Copyright © 2020 Atomist, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.getCacheConfig = exports.getCachePath = exports.GoogleCloudStorageGoalCacheArchiveStore = void 0; const retry_1 = require("@atomist/automation-client/lib/util/retry"); const storage_1 = require("@google-cloud/storage"); /** * Goal archive store that stores the compressed archives in a Google * Cloud Storage bucket. All failures are caught and logged. If * retrieval fails, the error is rethrown so the cache-miss listeners * will be invoked. */ class GoogleCloudStorageGoalCacheArchiveStore { async store(gi, classifier, archivePath) { return this.gcs(gi, classifier, async (storage, bucket, cachePath) => storage.bucket(bucket).upload(archivePath, { destination: cachePath, resumable: false, // avoid https://github.com/googleapis/nodejs-storage/issues/909 }), "store"); } async delete(gi, classifier) { await this.gcs(gi, classifier, async (storage, bucket, cachePath) => storage.bucket(bucket).file(cachePath).delete(), "delete"); } async retrieve(gi, classifier, targetArchivePath) { await this.gcs(gi, classifier, async (storage, bucket, cachePath) => storage.bucket(bucket).file(cachePath).download({ destination: targetArchivePath, }), "retrieve"); } async gcs(gi, classifier, op, verb) { const cacheConfig = getCacheConfig(gi); const cachePath = getCachePath(cacheConfig, classifier); const storage = new storage_1.Storage(); const objectUri = `gs://${cacheConfig.bucket}/${cachePath}`; const gerund = verb.replace(/e$/, "ing"); try { gi.progressLog.write(`${gerund} cache archive ${objectUri}`); await retry_1.doWithRetry(() => op(storage, cacheConfig.bucket, cachePath), `${verb} cache archive`); gi.progressLog.write(`${verb}d cache archive ${objectUri}`); return objectUri; } catch (e) { e.message = `Failed to ${verb} cache archive ${objectUri}: ${e.message}`; gi.progressLog.write(e.message); if (verb === "retrieve") { throw e; } } return undefined; } } exports.GoogleCloudStorageGoalCacheArchiveStore = GoogleCloudStorageGoalCacheArchiveStore; /** Construct object path for cache configuration and classifier. */ function getCachePath(cacheConfig, classifier = "default") { return [cacheConfig.path, classifier, "cache.tar.gz"].join("/"); } exports.getCachePath = getCachePath; /** * Retrieve cache configuration and populate with default values. */ function getCacheConfig(gi) { const cacheConfig = gi.configuration.sdm.cache || {}; cacheConfig.enabled = cacheConfig.enabled || false; cacheConfig.bucket = cacheConfig.bucket || `sdm-${gi.context.workspaceId}-${gi.configuration.name}-goal-cache`.toLowerCase().replace(/[^-a-z0-9]*/g, "") .replace(/--+/g, "-"); cacheConfig.path = cacheConfig.path || "goal-cache"; return cacheConfig; } exports.getCacheConfig = getCacheConfig; //# sourceMappingURL=cache.js.map