UNPKG

3.15 kBJavaScriptView Raw
1#!/usr/bin/env node
2'use strict';
3const fs = require('fs');
4const meow = require('meow');
5const yaml = require('js-yaml');
6const updateNotifier = require('update-notifier');
7const pkg = require('../package.json');
8const interactive = require('./interactive.js');
9const capitana = require('.');
10
11const notifier = updateNotifier({pkg});
12
13const cli = meow(`
14 Usage
15 capitana [stage] [microservices] [options]
16
17 Options
18 --help Show this message and exit.
19 --full Executes all stages on the selected microservices.
20 --except Exclude [microservices] microservices from execution.
21 --all Execute program on all microservices.
22 --verbose Execute program on all microservices.
23 --break Stop execution on execution failure.
24 --interactive Executes capitana interactively.
25 --no-warnings Treats all stderr as an error and not a warning.
26 --list [variables|microservices|stages] List configured variables.
27 --listAllowed microservice Lists the stages the microservice is allowed to run through.
28 Examples
29 $ capitana deploy --all
30 executes stage 'deploy' on all microservices
31 $ capitana --full database
32 executes all stages on microservice 'database'
33`);
34
35let config;
36try {
37 config = yaml.safeLoad(fs.readFileSync('.capitanarc', 'utf8'));
38} catch (error) {
39 console.error(error);
40 console.log('No .capitanarc file found. Exiting...');
41 process.exit(1);
42}
43
44if (cli.flags.list) {
45 const listFlag = cli.flags.list;
46 switch (listFlag) {
47 case 'variables':
48 logArray(Object.keys(config.variables));
49 break;
50 case 'microservices':
51 logArray(Object.keys(config.microservices));
52 break;
53 case 'stages':
54 logArray(Object.keys(config.stages));
55 break;
56 default:
57 throw new Error(`Value "${listFlag}" for flag "list" not valid. Allowed ones are:
58 "${['variables', 'microservices', 'stages']}".`);
59 }
60
61 process.exit(0);
62}
63
64if (cli.flags.listAllowed) {
65 const microserviceName = cli.flags.listAllowed;
66 const stages = Object.keys(config.stages);
67 if (!Object.keys(config.microservices).includes(microserviceName)) {
68 console.error(`Microservice "${microserviceName}" not found.`);
69 console.error('Available microservices:');
70 logArray(Object.keys(config.microservices));
71 }
72
73 const microservice = config.microservices[microserviceName];
74 for (let i = 0; i < stages.length; i++) {
75 const stage = stages[i];
76 if (!microservice || !microservice.allowedStages || microservice.allowedStages.includes(stage)) {
77 console.log(stage);
78 }
79 }
80
81 process.exit(0);
82}
83
84function logArray(array) {
85 for (const element of array) {
86 console.log(element);
87 }
88}
89
90(async () => {
91 let {input} = cli;
92 let options = cli.flags;
93 let stages = [];
94
95 if (cli.flags.interactive) {
96 const res = await interactive(config);
97 ({
98 stages,
99 input
100 } = res);
101 options = {...options, ...res.options};
102 } else if (cli.flags.full) {
103 stages = Object.keys(config.stages);
104 } else {
105 stages = [input.shift()];
106 }
107
108 for (const stage of stages) {
109 try {
110 /* eslint-disable-next-line no-await-in-loop */
111 await capitana(stage, input, options, config);
112 } catch (error) {
113 console.error(error);
114 process.exit(1);
115 }
116 }
117
118 notifier.notify();
119})();