UNPKG

3.93 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 --all Execute program on all microservices.
19 --break Stop execution on execution failure.
20 --config filePath Specifies a different config file to use
21 --except microservices Exclude microservices from execution.
22 --full Executes all stages on the selected microservices.
23 --help Show this message and exit.
24 --interactive Executes capitana interactively.
25 --list [ "variables" | "microservices" | "stages"] List configured variables.
26 --listAllowed [ microservice | stage ] Lists the stages a microservice is allowed
27 to run through or the microservices allowed to run through a stage.
28 --no-spinner Disables spinner. Useful for non-unicode terminals.
29 --no-warnings Treats all stderr as an error and not a warning.
30 --verbose Execute program on all microservices.
31 Examples
32 $ capitana deploy --all
33 executes stage 'deploy' on all microservices
34 $ capitana --full database
35 executes all stages on microservice 'database'
36`);
37
38let config;
39try {
40 let configFileName = '.capitanarc';
41 if (cli.flags.config) {
42 configFileName = cli.flags.config;
43 }
44
45 config = yaml.safeLoad(fs.readFileSync(configFileName, 'utf8'));
46} catch (error) {
47 console.error(error);
48 console.log('No valid configuration file found. Exiting...');
49 process.exit(1);
50}
51
52if (cli.flags.list) {
53 const listFlag = cli.flags.list;
54 switch (listFlag) {
55 case 'variables':
56 logArray(Object.keys(config.variables));
57 break;
58 case 'microservices':
59 logArray(Object.keys(config.microservices));
60 break;
61 case 'stages':
62 logArray(Object.keys(config.stages));
63 break;
64 default:
65 throw new Error(`Value "${listFlag}" for flag "list" not valid. Allowed ones are:
66 "${['variables', 'microservices', 'stages']}".`);
67 }
68
69 process.exit(0);
70}
71
72if (cli.flags.listAllowed) {
73 const targetName = cli.flags.listAllowed;
74 const stages = Object.keys(config.stages);
75 const microservices = Object.keys(config.microservices);
76 if (!microservices.includes(targetName) && !stages.includes(targetName)) {
77 console.error(`Microservice or stage "${targetName}" not found.`);
78 console.error('Available microservices:');
79 logArray(microservices);
80 console.error();
81 console.error('Available stages:');
82 logArray(stages);
83 }
84
85 if (microservices.includes(targetName)) {
86 const microservice = config.microservices[targetName];
87 for (let i = 0; i < stages.length; i++) {
88 const stage = stages[i];
89 if (!microservice || !microservice.allowedStages || microservice.allowedStages.includes(stage)) {
90 console.log(stage);
91 }
92 }
93 }
94
95 if (stages.includes(targetName)) {
96 for (let i = 0; i < microservices.length; i++) {
97 const microservice = config.microservices[microservices[i]];
98 if (!microservice || !microservice.allowedStages || microservice.allowedStages.includes(targetName)) {
99 console.log(microservices[i]);
100 }
101 }
102 }
103
104 process.exit(0);
105}
106
107function logArray(array) {
108 for (const element of array) {
109 console.log(element);
110 }
111}
112
113(async () => {
114 let {input} = cli;
115 let options = cli.flags;
116 let stages = [];
117
118 if (cli.flags.interactive) {
119 const res = await interactive(config);
120 ({
121 stages,
122 input
123 } = res);
124 options = {...options, ...res.options};
125 } else if (cli.flags.full) {
126 stages = Object.keys(config.stages);
127 } else {
128 stages = [input.shift()];
129 }
130
131 for (const stage of stages) {
132 try {
133 /* eslint-disable-next-line no-await-in-loop */
134 await capitana(stage, input, options, config);
135 } catch (error) {
136 console.error(error);
137 process.exit(1);
138 }
139 }
140
141 notifier.notify();
142})();