containr
Version:
Docker Build scripts for npm
132 lines (103 loc) • 3.49 kB
JavaScript
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
;