jenni
Version:
CLI tool to interact with Jenkins server
92 lines (75 loc) • 2.51 kB
JavaScript
const ora = require('ora');
const { yellow } = require('kleur');
const { getCurrentBranchName } = require('../../lib/git-cmd');
const { logNetworkErrors, debug } = require('../../lib/log');
const { triggerNewBuild, getRunningBuilds } = require('../../lib/jenkins');
const { askConfirmationBeforeTriggeringNewBuild } = require('../../lib/prompt');
const { ERROR_TYPE } = require('../../lib/errors');
const reportBuildStages = require('./stage-option');
const reportBuildProgress = require('./watch-option');
const assertJobBuildable = require('./assert-job-buildable');
const spinner = ora();
// http://localhost:8080/queue/item/11/ => 11
function extractQueueItemNumber(queueUrl = '') {
return queueUrl
.split('/')
.filter(Boolean)
.pop();
}
module.exports = async function build(options = {}) {
if (options.watch && options.stage) {
console.log(
yellow(
"Invalid options usage! Can't view the build console, stages together. Retry the command with a single option."
)
);
process.exit();
}
const branchName = getCurrentBranchName();
debug(`Branch name: ${branchName}`);
await assertJobBuildable(branchName, spinner);
try {
if (!spinner.isSpinning) spinner.start();
const runningBuilds = await getRunningBuilds(branchName);
if (runningBuilds.length) {
spinner.stop();
const { confirmation } = await askConfirmationBeforeTriggeringNewBuild();
if (!confirmation) {
spinner.fail('Aborted');
process.exit();
}
spinner.start();
}
const { headers } = await triggerNewBuild(branchName);
spinner.succeed('Build successfully created');
if (options.watch) {
debug('Watch option enabled. Retrieving in progress build console');
process.stdout.write('\n');
await reportBuildProgress(
branchName,
extractQueueItemNumber(headers.location),
spinner
);
return;
}
if (options.stage) {
debug('Stage view option enabled. Retrieving in progress build stages');
process.stdout.write('\n');
spinner.start();
await reportBuildStages(
branchName,
extractQueueItemNumber(headers.location),
spinner
);
}
} catch (error) {
if (error.name === ERROR_TYPE.watchError) {
process.stdout.write('\n');
spinner.fail(error.message);
debug(error);
return;
}
spinner.fail('Failed to create the build');
logNetworkErrors(error);
}
};