@nx/docker
Version:
73 lines (72 loc) • 3.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.handleDockerVersion = handleDockerVersion;
const child_process_1 = require("child_process");
const fs_1 = require("fs");
const path_1 = require("path");
const enquirer_1 = require("enquirer");
const version_pattern_utils_1 = require("./version-pattern-utils");
const DEFAULT_VERSION_SCHEMES = {
production: '{currentDate|YYMM.DD}.{shortCommitSha}',
hotfix: '{currentDate|YYMM.DD}.{shortCommitSha}-hotfix',
};
async function handleDockerVersion(projectGraphNode, finalConfigForProject) {
const availableVersionSchemes = finalConfigForProject.dockerOptions.versionSchemes ??
DEFAULT_VERSION_SCHEMES;
const versionScheme = await promptForNewVersion(availableVersionSchemes, projectGraphNode.name);
const newVersion = calculateNewVersion(projectGraphNode.name, versionScheme, availableVersionSchemes);
const logs = updateProjectVersion(newVersion, projectGraphNode.data.root, finalConfigForProject.dockerOptions.repositoryName, finalConfigForProject.dockerOptions.registryUrl);
return {
newVersion,
logs,
};
}
async function promptForNewVersion(versionSchemes, projectName) {
const { versionScheme } = await (0, enquirer_1.prompt)({
name: 'versionScheme',
type: 'select',
message: `What type of release would you like to make for project "${projectName}"?`,
choices: Object.keys(versionSchemes).map((vs) => ({
name: vs,
message: vs,
value: vs,
hint: (0, version_pattern_utils_1.interpolateVersionPattern)(versionSchemes[vs], { projectName }),
})),
});
return versionScheme;
}
function calculateNewVersion(projectName, versionScheme, versionSchemes) {
if (!(versionScheme in versionSchemes)) {
throw new Error(`Could not find version scheme '${versionScheme}'. Available options are: ${Object.keys(versionSchemes).join(', ')}.`);
}
return (0, version_pattern_utils_1.interpolateVersionPattern)(versionSchemes[versionScheme], {
projectName,
});
}
function updateProjectVersion(newVersion, projectRoot, repositoryName, registry) {
const isDryRun = process.env.NX_DRY_RUN && process.env.NX_DRY_RUN !== 'false';
const imageRef = getDefaultImageReference(projectRoot);
const newImageRef = getImageReference(projectRoot, repositoryName, registry);
const fullImageRef = `${newImageRef}:${newVersion}`;
if (!isDryRun) {
(0, child_process_1.execSync)(`docker tag ${imageRef} ${fullImageRef}`);
}
const logs = [`Image ${imageRef} tagged with ${fullImageRef}.`];
if (isDryRun) {
logs.push(`No changes were applied as --dry-run is enabled.`);
}
else {
(0, fs_1.writeFileSync)((0, path_1.join)(projectRoot, '.docker-version'), fullImageRef);
}
return logs;
}
function getImageReference(projectRoot, repositoryName, registry) {
let imageRef = repositoryName ?? getDefaultImageReference(projectRoot);
if (registry) {
imageRef = `${registry}/${imageRef}`;
}
return imageRef;
}
function getDefaultImageReference(projectRoot) {
return projectRoot.replace(/^[\\/]/, '').replace(/[\\/\s]+/g, '-');
}