UNPKG

@nx/docker

Version:

The Nx Plugin for Docker to aid in containerizing projects.

73 lines (72 loc) 3.25 kB
"use strict"; 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, '-'); }