1 | #!/usr/bin/env node
|
2 | 'use strict';
|
3 | const fs = require('fs');
|
4 | const meow = require('meow');
|
5 | const yaml = require('js-yaml');
|
6 | const updateNotifier = require('update-notifier');
|
7 | const pkg = require('../package.json');
|
8 | const interactive = require('./interactive.js');
|
9 | const capitana = require('.');
|
10 |
|
11 | const notifier = updateNotifier({pkg});
|
12 |
|
13 | const 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 |
|
38 | let config;
|
39 | try {
|
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 |
|
52 | if (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 |
|
72 | if (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 |
|
107 | function 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 |
|
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 | })();
|