@process-engine/ci_tools
Version:
CI tools for process-engine.io
115 lines (114 loc) • 5.17 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.printHelp = exports.getShortDoc = exports.run = void 0;
const yargsParser = require("yargs-parser");
const fs_1 = require("fs");
const chalk = require("chalk");
const git_1 = require("../git/git");
const tag_1 = require("../npm/tag");
const package_version_1 = require("../versions/package_version");
const printMultiLineString_1 = require("../cli/printMultiLineString");
const setup_git_and_npm_connections_1 = require("./internal/setup-git-and-npm-connections");
const shell_1 = require("../cli/shell");
const retry_run_1 = require("../versions/retry_run");
const parse_version_1 = require("../versions/parse_version");
const COMMAND_NAME = 'publish-npm-package';
const BADGE = `[${COMMAND_NAME}]\t`;
const DEFAULT_MODE = 'node';
const DOC = `
Publishes the current package to npm.
Does not complain if re-run (providing idempotency for CI).
`;
// DOC: see above
async function run(...args) {
const argv = yargsParser(args, { default: { mode: DEFAULT_MODE } });
const isDryRun = argv.dry === true;
const createTagFromBranchName = argv.createTagFromBranchName === true;
const mode = argv.mode;
const packageName = getPackageName();
const packageVersion = await (0, package_version_1.getPackageVersion)(mode);
const npmPublishShellCommand = getNpmPublishShellCommand(createTagFromBranchName, isDryRun, packageVersion);
(0, setup_git_and_npm_connections_1.setupNpm)();
const npmPublishShellCommandOutput = annotatedSh(npmPublishShellCommand);
const lines = npmPublishShellCommandOutput.trim().split('\n');
const expectedMessage = `+ ${packageName}@${packageVersion}`;
const publishCommandSuccessful = lines[lines.length - 1] === expectedMessage;
if (publishCommandSuccessful) {
await ensureVersionIsAvailable(packageName, packageVersion, isDryRun);
}
else {
const isAlreadyPublished = npmPublishShellCommandOutput.match(/You cannot publish over the previously published versions/gi) != null;
if (isAlreadyPublished) {
console.log(chalk.yellow(`${BADGE}This package version was already published: '${packageVersion}'.`));
}
if (await (0, retry_run_1.isRedundantRunTriggeredBySystemUserPush)(mode)) {
console.error(chalk.yellowBright(`${BADGE}Nothing to do here!`));
process.exit(0);
}
}
return publishCommandSuccessful;
}
exports.run = run;
function getShortDoc() {
return DOC.trim().split('\n')[0];
}
exports.getShortDoc = getShortDoc;
function printHelp() {
console.log(`Usage: ci_tools ${COMMAND_NAME} [--create-tag-from-branch-name] [--dry]`);
console.log('');
console.log(DOC.trim());
}
exports.printHelp = printHelp;
function getNpmPublishShellCommand(useBranchForTag, isDryRun, packageVersion) {
const dryRun = isDryRun ? '--dry-run ' : '';
const gitBranch = (0, git_1.getGitBranch)();
const parsedVersion = (0, parse_version_1.parseVersion)(packageVersion);
const branchName = gitBranch || (0, git_1.mapReleaseChannelNameToBranch)(parsedVersion.releaseChannelName);
const npmTag = (0, tag_1.getNpmTag)(branchName);
const tag = useBranchForTag && npmTag ? `--tag ${npmTag} ` : '';
return `npm publish ${dryRun}${tag}`.trim();
}
function annotatedSh(cmd) {
console.log(`${BADGE}|>>> ${cmd}`);
const output = (0, shell_1.sh)(cmd);
(0, printMultiLineString_1.printMultiLineString)(output, `${BADGE}| `);
return output;
}
function getPackageName() {
const content = (0, fs_1.readFileSync)('package.json').toString();
const json = JSON.parse(content);
return json.name;
}
async function ensureVersionIsAvailable(packageName, packageVersion, isDryRun = false) {
if (isDryRun) {
console.log(chalk.green(`${BADGE}Successfully published version '${packageVersion}'.`));
return;
}
const viewCommand = `npm view ${packageName} versions --json`;
let packageVersionFound = false;
// TODO: It is certainly debatable on what the best settings would be here.
// For now, a window of 30 minutes is granted, before the publishing is regarded as failure.
const maxNumberOfRetries = 3600;
const timeoutBetweenRetriesInMs = 500;
let currentTry = 0;
while (packageVersionFound === false && currentTry < maxNumberOfRetries) {
const versions = (0, shell_1.sh)(viewCommand);
packageVersionFound = versions.includes(packageVersion);
if (packageVersionFound) {
break;
}
else {
console.log(chalk.yellow(`${BADGE}Version '${packageVersion}' not found. Retrying in ${timeoutBetweenRetriesInMs}ms...`));
currentTry++;
await new Promise((resolve) => setTimeout(resolve, timeoutBetweenRetriesInMs));
}
}
if (packageVersionFound) {
console.log(chalk.green(`${BADGE}Successfully published version '${packageVersion}'.`));
}
else {
console.error(chalk.red(`${BADGE}Version '${packageVersion}' is not reported by 'npm view'.`));
process.exit(1);
}
}
//# sourceMappingURL=publish-npm-package.js.map
;