@jameslnewell/buildkite-pipelines
Version:
Generate Buildkite pipelines from code.
174 lines • 6.21 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const yargs_1 = __importDefault(require("yargs"));
const resolve_1 = __importDefault(require("resolve"));
const debug_1 = __importDefault(require("debug"));
const lib_1 = require("../lib");
const isPipelineBuilder_1 = require("../lib/builders/isPipelineBuilder");
const log = (0, debug_1.default)('buildkite-pipelines');
const resolve = (id, basedir) => new Promise((resolve, reject) => (0, resolve_1.default)(id, { basedir }, (error, path) => {
if (error || !path) {
reject(error);
}
else {
resolve(path);
}
}));
(async () => {
await yargs_1.default.scriptName('buildkite-pipelines').command('$0 <file>', 'Generate a Buildkite pipeline', (yargs) => yargs
.option('require', {
type: 'string',
alias: 'r',
description: `Require a module on startup`,
})
.option('cwd', {
type: 'string',
description: `Change the working directory`,
})
.option('ignore-validation-errors', {
boolean: true,
description: 'Output the pipeline and exit cleanly when the pipeline is not valid',
})
.positional('file', {
type: 'string',
demandOption: true,
description: 'A file exporting a pipeline object',
}), async (argv) => {
const { file, require, cwd } = argv;
// redirect any stdout writes from the imported pipeline (and any
// functions it executes) to stderr so they don't get interleaved
// with the generated YAML on stdout
const originalStdoutWrite = process.stdout.write.bind(process.stdout);
process.stdout.write = process.stderr.write.bind(process.stderr);
// change the current working directory
const basedir = process.cwd();
if (cwd)
process.chdir(cwd);
// coerce the requires into an array
const requires = Array.isArray(require)
? require
: require
? [require]
: [];
// import scripts in order to setup transpilers and stuff
for (const r of requires) {
log('requiring: %s', r);
let m;
try {
m = await resolve(r, basedir);
await import(m);
}
catch (error) {
console.error();
console.error(`💥 ERROR`);
console.error();
console.error(`An error occurred whilst requiring "${r}"`);
console.error();
console.error(error);
process.exitCode = 1;
return;
}
}
// check the pipeline file is specified
if (!file) {
console.error(`No pipeline file specified`);
process.exitCode = 1;
return;
}
// import the pipeline
log('importing pipeline: %s', file);
let m;
let pipeline;
try {
m = await resolve(file, basedir);
pipeline = await import(m);
}
catch (error) {
console.error();
console.error(`💥 ERROR`);
console.error();
console.error(`An error occurred whilst executing "${file}"`);
console.error();
console.error(error);
process.exitCode = 1;
return;
}
// check for a named property
let property;
if (pipeline.pipeline) {
log('using .pipeline property');
property = '.pipeline';
pipeline = pipeline.pipeline;
// check for a default property
}
else if (pipeline.default) {
property = '.default';
log('using .default property');
pipeline = pipeline.default;
}
else {
log('using module');
property = '.default';
}
// execute the factory function if pipeline is a factory
if (typeof pipeline === 'function') {
log('executing pipeline factory');
try {
pipeline = await pipeline();
}
catch (error) {
console.error();
console.error(`💥 ERROR`);
console.error();
console.error(`An error occurred whilst executing "${file}#${property}()"`);
console.error();
console.error(error);
process.exitCode = 1;
return;
}
}
// build the pipeline if its a builder
if ((0, isPipelineBuilder_1.isPipelineBuilder)(pipeline)) {
log('building pipeline');
try {
pipeline = await pipeline.build();
}
catch (error) {
console.error();
console.error(`💥 ERROR`);
console.error();
console.error(`An error occurred whilst executing "${file}#${property}()"`);
console.error();
console.error(error);
process.exitCode = 1;
return;
}
}
// validate
log('validating pipeline');
const errors = await (0, lib_1.validate)(pipeline);
if (errors.length) {
console.error();
console.error(`👮♀️ The pipeline is not valid:`);
console.error();
for (const error of errors) {
console.error(error);
}
if (!argv.ignoreValidationErrors) {
process.exitCode = 1;
return;
}
}
log('stringifying pipeline');
const yaml = await (0, lib_1.stringify)(pipeline);
// write the generated YAML to the original stdout
originalStdoutWrite(`${yaml}\n`);
// restore stdout
process.stdout.write = originalStdoutWrite;
}).argv;
})();
//# sourceMappingURL=index.js.map