UNPKG

containr

Version:

Docker Build scripts for npm

132 lines (103 loc) 3.49 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.getNpmLayer = exports.getNpmLayerHash = undefined; var _assign = require('babel-runtime/core-js/object/assign'); var _assign2 = _interopRequireDefault(_assign); var _keys = require('babel-runtime/core-js/object/keys'); var _keys2 = _interopRequireDefault(_keys); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _shelljs = require('shelljs'); var _crypto = require('crypto'); var _crypto2 = _interopRequireDefault(_crypto); var _docker = require('./docker'); var _docker2 = _interopRequireDefault(_docker); var _templating = require('./templating'); var _templating2 = _interopRequireDefault(_templating); var _logger = require('./logger'); var _logger2 = _interopRequireDefault(_logger); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * */ const getNpmLayerHash = exports.getNpmLayerHash = pkgList => _crypto2.default.createHash('sha256').update(pkgList).digest('hex'); /** * Used to iterate object keys * * @param {any} obj */ function* entries(obj) { for (let key of (0, _keys2.default)(obj)) { yield [key, obj[key]]; } } /** * flattenNpmDependancies * * takes an object with keys of package names and values of versions * from npm package.json and flattens it into a single string of format * * name:version:name:version .. etc. */ const flattenNpmDependancies = pkgList => { let pkgVersionString = ''; for (const [name, val] of entries(pkgList)) { pkgVersionString += `${name}:${val}:`; } return pkgVersionString; }; /** * getNpmDependancies */ const getNpmDependancies = (pkg, dev = false) => { return (0, _assign2.default)({}, pkg.dependencies ? pkg.dependencies : {}, pkg.devDependencies && dev ? pkg.devDependencies : {}); }; /** * getNpmLayerImageName * * take a list of packages and return a short hash name */ const getNpmLayerImageName = (baseImg, pkg) => { const baseImgClean = baseImg.replace(/\/|:/g, '-'); const depsList = getNpmDependancies(pkg); const depsListFlat = flattenNpmDependancies(depsList); _logger2.default.debug('depsListFlat', depsListFlat); const depsListHash = getNpmLayerHash(depsListFlat); _logger2.default.debug('depsListHash', depsListHash); const shortHash = depsListHash.substr(-12); return `npmlayer/${baseImgClean}:${shortHash}`; }; /** * getNpmLayer */ const getNpmLayer = exports.getNpmLayer = (baseImg = 'mhart/alpine-node', pkg) => { const npmLayerImageName = getNpmLayerImageName(baseImg, pkg); _logger2.default.info(`package layer npm: ${npmLayerImageName}`); if (_docker2.default.imageExists(npmLayerImageName)) { _logger2.default.verbose(`npm layer image found: ${npmLayerImageName}`); return npmLayerImageName; } else { _logger2.default.verbose('npm layer not found building'); } // we need to build the image; const dockerFile = _templating2.default.renderFile('Dockerfile.npm-layer.ejs', { pkg, containr: { baseImg } }); const npmContainer = _docker2.default.buildImage({ dockerfile: dockerFile, name: npmLayerImageName }); if (npmContainer.success) { const { name, version, hash } = npmContainer; _logger2.default.info(`new npm layer image built ${name}:${version} => ${hash}`); } else { _logger2.default.error(`${npmContainer.message}`); } return npmContainer.name; }; //# sourceMappingURL=layer.js.map