UNPKG

balena-cli

Version:

The official balena Command Line Interface

127 lines 4.87 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.deployLegacy = void 0; const lazy_1 = require("./lazy"); const util_1 = require("util"); const getBuilderPushEndpoint = function (baseUrl, owner, app) { const querystring = require('querystring'); const args = querystring.stringify({ owner, app }); return `https://builder.${baseUrl}/v1/push?${args}`; }; const getBuilderLogPushEndpoint = function (baseUrl, buildId, owner, app) { const querystring = require('querystring'); const args = querystring.stringify({ owner, app, buildId }); return `https://builder.${baseUrl}/v1/pushLogs?${args}`; }; const bufferImage = function (docker, imageId, bufferFile) { const streamUtils = require('./streams'); const image = docker.getImage(imageId); const sizePromise = image.inspect().then((img) => img.Size); return Promise.all([image.get(), sizePromise]).then(([imageStream, imageSize]) => streamUtils .buffer(imageStream, bufferFile) .then((bufferedStream) => { bufferedStream.length = imageSize; return bufferedStream; })); }; const showPushProgress = function (message) { const visuals = (0, lazy_1.getVisuals)(); const progressBar = new visuals.Progress(message); progressBar.update({ percentage: 0 }); return progressBar; }; const uploadToPromise = (uploadRequest, logger) => new Promise(function (resolve, reject) { uploadRequest.on('error', reject).on('data', function handleMessage(data) { let obj; data = data.toString(); logger.logDebug(`Received data: ${data}`); try { obj = JSON.parse(data); } catch (e) { logger.logError('Error parsing reply from remote side'); reject(e); return; } switch (obj.type) { case 'error': reject(new Error(`Remote error: ${obj.error}`)); break; case 'success': resolve(obj); break; case 'status': logger.logInfo(obj.message); break; default: reject(new Error(`Received unexpected reply from remote: ${data}`)); } }); }); const uploadImage = async function (imageStream, token, username, url, appName, logger) { const { default: got } = await Promise.resolve().then(() => require('got')); const progressStream = await Promise.resolve().then(() => require('progress-stream')); const zlib = await Promise.resolve().then(() => require('zlib')); const progressMessage = logger .formatMessage('info', 'Uploading') .slice(0, -1); const progressBar = showPushProgress(progressMessage); const streamWithProgress = imageStream.pipe(progressStream({ time: 500, length: imageStream.length, }, ({ percentage, eta }) => progressBar.update({ percentage: Math.min(percentage, 100), eta, }))); const uploadRequest = got.stream.post(getBuilderPushEndpoint(url, username, appName), { headers: { 'Content-Encoding': 'gzip', Authorization: `Bearer ${token}`, }, body: streamWithProgress.pipe(zlib.createGzip({ level: 6, })), throwHttpErrors: false, }); return uploadToPromise(uploadRequest, logger); }; const uploadLogs = async function (logs, token, url, buildId, username, appName) { const { default: got } = await Promise.resolve().then(() => require('got')); return got.post(getBuilderLogPushEndpoint(url, buildId, username, appName), { headers: { Authorization: `Bearer ${token}`, }, body: Buffer.from(logs), responseType: 'json', throwHttpErrors: false, }); }; const deployLegacy = async function (docker, logger, token, username, url, opts) { const tmp = require('tmp'); const tmpNameAsync = (0, util_1.promisify)(tmp.tmpName); tmp.setGracefulCleanup(); const { appName, imageName, buildLogs, shouldUploadLogs } = opts; const logs = buildLogs; const bufferFile = await tmpNameAsync(); logger.logInfo('Initializing deploy...'); const { buildId } = await bufferImage(docker, imageName, bufferFile) .then((stream) => uploadImage(stream, token, username, url, appName, logger)) .finally(() => require('fs').promises .unlink(bufferFile) .catch(() => undefined)); if (shouldUploadLogs) { logger.logInfo('Uploading logs...'); const args = await Promise.all([ logs, token, url, buildId, username, appName, ]); await uploadLogs(...args); } return buildId; }; exports.deployLegacy = deployLegacy; //# sourceMappingURL=deploy-legacy.js.map