cob-cli 2.52.0-beta-1 → 2.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cob-cli.js +0 -31
- package/lib/commands/deploy.js +26 -33
- package/lib/commands/test.js +9 -29
- package/lib/commands/updateFromServer.js +13 -149
- package/lib/task_lists/common_enviromentHandler.js +8 -14
- package/lib/task_lists/common_helpers.js +17 -96
- package/lib/task_lists/common_releaseManager.js +8 -10
- package/lib/task_lists/common_syncFiles.js +7 -10
- package/lib/task_lists/test_customUIsContinuosReload.js +7 -36
- package/lib/task_lists/test_otherFilesContiousReload.js +22 -44
- package/lib/task_lists/test_syncFile.js +4 -5
- package/lib/task_lists/test_validate.js +2 -3
- package/lib/task_lists/updateFromServer_validate.js +3 -3
- package/lib/webpack/webpack.config.js +1 -1
- package/package.json +1 -5
- package/lib/commands/cleanup.js +0 -116
- package/lib/commands/package.js +0 -20
- package/lib/commands/tagDefs.js +0 -67
- package/lib/task_lists/common_definitions.js +0 -26
- package/lib/task_lists/common_operationState.js +0 -28
- package/lib/task_lists/package_execute.js +0 -45
- package/lib/task_lists/ssh.js +0 -30
- package/lib/task_lists/tagDefs_execute.js +0 -121
- package/lib/task_lists/updateFromServer_definitions.js +0 -135
- package/lib/task_lists/updateFromServer_domains.js +0 -50
- package/lib/task_lists/updateFromServer_groups.js +0 -111
- package/lib/task_lists/updateFromServer_instances.js +0 -76
- package/lib/task_lists/updateFromServer_kibana.js +0 -88
package/bin/cob-cli.js
CHANGED
|
@@ -10,10 +10,7 @@ const init = require("../lib/commands/init");
|
|
|
10
10
|
const customize = require("../lib/commands/customize");
|
|
11
11
|
const test = require("../lib/commands/test");
|
|
12
12
|
const deploy = require("../lib/commands/deploy");
|
|
13
|
-
const cleanup = require("../lib/commands/cleanup");
|
|
14
|
-
const package = require("../lib/commands/package");
|
|
15
13
|
const updateFromServer = require("../lib/commands/updateFromServer");
|
|
16
|
-
const tagDefs = require("../lib/commands/tagDefs.js");
|
|
17
14
|
const getDefs = require("../lib/commands/getDefs");
|
|
18
15
|
const generateMermaid = require("../lib/commands/generateMermaid");
|
|
19
16
|
const { upgradeRepo } = require("../lib/commands/upgradeRepo");
|
|
@@ -76,30 +73,12 @@ program
|
|
|
76
73
|
.description('Deploy customization to the server')
|
|
77
74
|
.action( deploy );
|
|
78
75
|
|
|
79
|
-
program
|
|
80
|
-
.command('cleanup')
|
|
81
|
-
.option('-e --environment <name>', 'environment to use')
|
|
82
|
-
.option('-s --servername <servername>', 'use <servername>.cultofbits.pt (i.e. name without the FQDN)')
|
|
83
|
-
.option('-l --localOnly', 'only clean local state, skip server cleanup')
|
|
84
|
-
.option('-V --verbose', 'verbose execution of tasks', increaseVerbosity, 0)
|
|
85
|
-
.description('Clean up repository state after an interrupted test or deploy')
|
|
86
|
-
.action( cleanup );
|
|
87
|
-
|
|
88
|
-
program
|
|
89
|
-
.command('package')
|
|
90
|
-
.option('-e --environment <name>', 'environment to use')
|
|
91
|
-
.option('-V --verbose', 'verbose execution of tasks', increaseVerbosity, 0)
|
|
92
|
-
.description('Package customization for out-of-band deploying')
|
|
93
|
-
.action( package );
|
|
94
|
-
|
|
95
76
|
program
|
|
96
77
|
.command('updateFromServer')
|
|
97
78
|
.description('Updates local copy with current files on server, in case of changes made out of standard process.')
|
|
98
79
|
.option('-e --environment <name>', 'environment to use')
|
|
99
80
|
.option('-s --servername <servername>', 'use <servername>.cultofbits.pt (i.e. name without the FQDN)')
|
|
100
81
|
.option('-V --verbose', 'verbose execution of tasks', increaseVerbosity, 0)
|
|
101
|
-
.option('-c --code', 'By adding this flag you indicate that you want to bring the code and not the data')
|
|
102
|
-
.option('--cookie <path>', '')
|
|
103
82
|
.action( updateFromServer );
|
|
104
83
|
|
|
105
84
|
program
|
|
@@ -112,16 +91,6 @@ program
|
|
|
112
91
|
.option('-e --environment <name>', 'environment to use')
|
|
113
92
|
.description('Updates local copy with definitions on server')
|
|
114
93
|
.action( getDefs );
|
|
115
|
-
|
|
116
|
-
program
|
|
117
|
-
.command('tagDefs')
|
|
118
|
-
.description('Allows the user to tag un-tagged Changes in Definitions configured on exported solutions.')
|
|
119
|
-
.option('-e --environment <name>', 'environment to use')
|
|
120
|
-
.option('-s --servername <servername>', 'use <servername>.cultofbits.pt (i.e. name without the FQDN)')
|
|
121
|
-
.option('-V --verbose', 'verbose execution of tasks', increaseVerbosity, 0)
|
|
122
|
-
.option('--all', 'tag all Definitions of all exported solutions. Use with care!')
|
|
123
|
-
.option('--cookie <path>', '')
|
|
124
|
-
.action( tagDefs );
|
|
125
94
|
|
|
126
95
|
program
|
|
127
96
|
.command('generateMermaid')
|
package/lib/commands/deploy.js
CHANGED
|
@@ -4,47 +4,40 @@ const { confirmExecutionOfChanges } = require("../task_lists/common_syncFiles");
|
|
|
4
4
|
const { validateDeployConditions } = require("../task_lists/deploy_validate");
|
|
5
5
|
const { executeTasks } = require("../task_lists/deploy_execute");
|
|
6
6
|
const { checkRepoVersion } = require("../commands/upgradeRepo");
|
|
7
|
-
const { saveOperationState, clearOperationState, checkNoInterruptedRun } = require("../task_lists/common_operationState");
|
|
8
7
|
|
|
9
8
|
async function deploy(args) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
if(args.resync) args.force = true;
|
|
9
|
+
try {
|
|
10
|
+
checkRepoVersion()
|
|
11
|
+
const cmdEnv = await getCurrentCommandEnviroment(args)
|
|
12
|
+
if(args.resync) args.force = true;
|
|
15
13
|
|
|
16
|
-
|
|
14
|
+
console.log(`Checking conditions to deploy ${cmdEnv.branchStr} to ${cmdEnv.serverStr}...` );
|
|
17
15
|
|
|
18
|
-
try {
|
|
19
16
|
await validateDeployConditions(cmdEnv,args).run()
|
|
20
|
-
} catch (err) {
|
|
21
|
-
// we should clear the operation state
|
|
22
|
-
clearOperationState();
|
|
23
|
-
throw err
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
await cmdEnv.applyCurrentCommandEnvironmentChanges()
|
|
27
|
-
let changes = [];
|
|
28
|
-
try {
|
|
29
|
-
changes = await confirmExecutionOfChanges(cmdEnv)
|
|
30
|
-
} catch (err) {
|
|
31
|
-
await cmdEnv.unApplyCurrentCommandEnvironmentChanges()
|
|
32
|
-
clearOperationState()
|
|
33
|
-
throw err
|
|
34
|
-
}
|
|
35
17
|
|
|
36
|
-
|
|
37
|
-
|
|
18
|
+
await cmdEnv.applyCurrentCommandEnvironmentChanges()
|
|
19
|
+
let changes = [];
|
|
20
|
+
try {
|
|
21
|
+
changes = await confirmExecutionOfChanges(cmdEnv)
|
|
22
|
+
} catch (err) {
|
|
38
23
|
await cmdEnv.unApplyCurrentCommandEnvironmentChanges()
|
|
39
|
-
|
|
40
|
-
|
|
24
|
+
throw err
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if(changes.length == 0) {
|
|
28
|
+
if(!args.force) {
|
|
29
|
+
await cmdEnv.unApplyCurrentCommandEnvironmentChanges()
|
|
30
|
+
throw new Error("Canceled:".yellow + " nothing todo\n")
|
|
31
|
+
}
|
|
32
|
+
console.log(" Just updating deploy information.")
|
|
41
33
|
}
|
|
42
|
-
console.log(" Just updating deploy information.")
|
|
43
|
-
}
|
|
44
34
|
|
|
45
|
-
|
|
35
|
+
await executeTasks(cmdEnv, args).run();
|
|
46
36
|
|
|
47
|
-
|
|
48
|
-
|
|
37
|
+
console.log("\nDone!".green, "\nEnjoy!")
|
|
38
|
+
|
|
39
|
+
} catch(err) {
|
|
40
|
+
console.error("\n",err.message);
|
|
41
|
+
}
|
|
49
42
|
}
|
|
50
|
-
module.exports = deploy;
|
|
43
|
+
module.exports = deploy;
|
package/lib/commands/test.js
CHANGED
|
@@ -6,33 +6,19 @@ const { otherFilesContiousReload } = require("../task_lists/test_otherFilesConti
|
|
|
6
6
|
const { getCurrentCommandEnviroment } = require("../task_lists/common_enviromentHandler");
|
|
7
7
|
const { getKeypress } = require("../task_lists/common_helpers");
|
|
8
8
|
const { checkRepoVersion } = require("../commands/upgradeRepo");
|
|
9
|
-
const { saveOperationState, clearOperationState, checkNoInterruptedRun } = require("../task_lists/common_operationState");
|
|
10
9
|
|
|
11
|
-
async function test (args) {
|
|
10
|
+
async function test (args) {
|
|
12
11
|
let restoreChanges, error = "";
|
|
13
12
|
let cmdEnv
|
|
14
13
|
let spawned
|
|
15
|
-
let stateSaved = false
|
|
16
|
-
let envChangesApplied = false
|
|
17
|
-
|
|
18
|
-
let rejectOnSignal;
|
|
19
|
-
const signalPromise = new Promise((_, reject) => { rejectOnSignal = reject; });
|
|
20
|
-
const handleSignal = () => rejectOnSignal(new Error('signal'));
|
|
21
|
-
process.once('SIGTERM', handleSignal);
|
|
22
|
-
process.once('SIGHUP', handleSignal);
|
|
23
|
-
|
|
24
14
|
try {
|
|
25
15
|
checkRepoVersion()
|
|
26
16
|
console.log("Start testing… ")
|
|
27
17
|
cmdEnv = await getCurrentCommandEnviroment(args)
|
|
28
|
-
await checkNoInterruptedRun()
|
|
29
|
-
saveOperationState(cmdEnv.name, cmdEnv.servername)
|
|
30
|
-
stateSaved = true
|
|
31
18
|
|
|
32
19
|
if(!args.localOnly) {
|
|
33
|
-
await validateTestingConditions(cmdEnv, args)
|
|
20
|
+
await validateTestingConditions(cmdEnv, args)
|
|
34
21
|
await cmdEnv.applyCurrentCommandEnvironmentChanges()
|
|
35
|
-
envChangesApplied = true
|
|
36
22
|
restoreChanges = await otherFilesContiousReload(cmdEnv)
|
|
37
23
|
} else {
|
|
38
24
|
await cmdEnv.applyCurrentCommandEnvironmentChanges()
|
|
@@ -41,22 +27,16 @@ async function test (args) {
|
|
|
41
27
|
|
|
42
28
|
let key;
|
|
43
29
|
do {
|
|
44
|
-
key = await
|
|
45
|
-
if(key == "o") opn(
|
|
46
|
-
} while( key != "q" && key != "ctrl+c" )
|
|
30
|
+
key = await getKeypress()
|
|
31
|
+
if(key == "o") opn("http://localhost:8040/recordm/index.html")
|
|
32
|
+
} while( key != "q" && key != "ctrl+c" )
|
|
47
33
|
|
|
48
|
-
} catch (err) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
console.log("\n",error)
|
|
52
|
-
}
|
|
34
|
+
} catch (err) {
|
|
35
|
+
error = err.message
|
|
36
|
+
console.log("\n",error)
|
|
53
37
|
} finally {
|
|
54
|
-
process.off('SIGTERM', handleSignal);
|
|
55
|
-
process.off('SIGHUP', handleSignal);
|
|
56
|
-
try { process.stdin.setRawMode(false); } catch {}
|
|
57
38
|
restoreChanges && await restoreChanges()
|
|
58
|
-
|
|
59
|
-
if (stateSaved) clearOperationState()
|
|
39
|
+
cmdEnv && await cmdEnv.unApplyCurrentCommandEnvironmentChanges() // Repõe as configurações
|
|
60
40
|
spawned && await spawned.stop();
|
|
61
41
|
// Dá tempo aos subprocessos para morrer (acho que já não é preciso)
|
|
62
42
|
setTimeout(() => {
|
|
@@ -1,167 +1,31 @@
|
|
|
1
1
|
require('colors');
|
|
2
2
|
const { getCurrentCommandEnviroment } = require("../task_lists/common_enviromentHandler");
|
|
3
3
|
const { copyFiles } = require("../task_lists/common_syncFiles");
|
|
4
|
-
const { promptCredentials, readYamlFile } = require("../task_lists/common_helpers.js");
|
|
5
4
|
const { validateUpdateFromServerConditions } = require("../task_lists/updateFromServer_validate");
|
|
6
|
-
const { getGroupsFromServer } = require("../task_lists/updateFromServer_groups");
|
|
7
|
-
const { getDefinitionsFromServer } = require("../task_lists/updateFromServer_definitions");
|
|
8
|
-
const { getInstancesFromServer } = require("../task_lists/updateFromServer_instances");
|
|
9
|
-
const { getKibanaFromServer } = require("../task_lists/updateFromServer_kibana");
|
|
10
|
-
const { getDomainsFromServer } = require("../task_lists/updateFromServer_domains");
|
|
11
5
|
const { checkRepoVersion } = require("../commands/upgradeRepo");
|
|
12
|
-
const axios = require('axios');
|
|
13
|
-
const tough = require('tough-cookie');
|
|
14
|
-
const fs = require("fs/promises");
|
|
15
|
-
const axiosCookieJarSupport = require('axios-cookiejar-support')
|
|
16
|
-
const path = require('path')
|
|
17
|
-
const FileCookieStore = require('file-cookie-store');
|
|
18
6
|
|
|
19
7
|
async function updateFromServer(args) {
|
|
20
8
|
try {
|
|
21
9
|
checkRepoVersion()
|
|
22
10
|
const cmdEnv = await getCurrentCommandEnviroment(args)
|
|
23
11
|
|
|
24
|
-
|
|
12
|
+
await validateUpdateFromServerConditions(cmdEnv).run()
|
|
25
13
|
|
|
26
|
-
|
|
14
|
+
console.log("\nOk to proceed. Getting files from server's live directories...");
|
|
15
|
+
await cmdEnv.applyCurrentCommandEnvironmentChanges()
|
|
16
|
+
let changes = await copyFiles(cmdEnv, "serverLive", "localCopy", args)
|
|
17
|
+
await cmdEnv.unApplyCurrentCommandEnvironmentChanges()
|
|
27
18
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
let changes = await copyFiles(cmdEnv, "serverLive", "localCopy", args)
|
|
31
|
-
await cmdEnv.unApplyCurrentCommandEnvironmentChanges()
|
|
32
|
-
|
|
33
|
-
if (changes.length == 0) {
|
|
34
|
-
console.log("\nFinished.".green, "Nothing todo, no changes detected.");
|
|
35
|
-
} else {
|
|
36
|
-
console.log("\n " + changes.join("\n "));
|
|
37
|
-
console.log("\nUpdate done!".yellow, "Check", "git status".bold.blue, "and", "git diff".bold.blue, "to see the resulting differences.");
|
|
38
|
-
console.log("Notice that", "any changes since last deploy migth be lost.".underline)
|
|
39
|
-
console.log("Notice also that you will need to do a", "cob-cli deploy --force".bold.blue, "on next deploy.")
|
|
40
|
-
}
|
|
19
|
+
if(changes.length == 0) {
|
|
20
|
+
console.log("\nFinished.".green,"Nothing todo, no changes detected.");
|
|
41
21
|
} else {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const cookieJar = new tough.CookieJar()
|
|
47
|
-
axios.defaults.jar = cookieJar
|
|
48
|
-
|
|
49
|
-
if( args.cookie ) {
|
|
50
|
-
const p = path.resolve(args.cookie);
|
|
51
|
-
const cookieFile = new FileCookieStore(p, {auto_sync: false, force_parse: true});
|
|
52
|
-
try{
|
|
53
|
-
let c = await new Promise((resolve, reject) => {
|
|
54
|
-
cookieFile.findCookie(`${cmdEnv.servername}.cultofbits.com`, '/', 'cobtoken', (err, result) => {
|
|
55
|
-
if(err != null) reject(err);
|
|
56
|
-
else resolve(result)
|
|
57
|
-
})
|
|
58
|
-
});
|
|
59
|
-
if(!c){
|
|
60
|
-
throw Error( `couldn't find a cookie for ${cmdEnv.servername} in ${p}`)
|
|
61
|
-
}
|
|
62
|
-
cookieJar.setCookie(c.toString(), `https://${cmdEnv.servername}.cultofbits.com`)
|
|
63
|
-
} catch(e){
|
|
64
|
-
console.error(e)
|
|
65
|
-
return
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
} else {
|
|
69
|
-
const credentials = await promptCredentials()
|
|
70
|
-
await axios.post(`https://${cmdEnv.servername}.cultofbits.com/recordm/security/auth`, credentials, {
|
|
71
|
-
headers: {
|
|
72
|
-
"Content-Type": "application/json",
|
|
73
|
-
},
|
|
74
|
-
})
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
console.log("\n Removing existing Data")
|
|
78
|
-
try{ await fs.access("others/solutionsData") } catch { await fs.mkdir("others/solutionsData") }
|
|
79
|
-
const dataFiles = await fs.readdir("others/solutionsData");
|
|
80
|
-
for (const file of dataFiles) {
|
|
81
|
-
const filePath = path.join("others/solutionsData", file);
|
|
82
|
-
await fs.rm(filePath, {recursive: true, force: true} )
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
const solutions = await readYamlFile("solutions.yml")
|
|
86
|
-
|
|
87
|
-
for (const solution of solutions) {
|
|
88
|
-
|
|
89
|
-
console.log("\nStarting updateFromServer of solution " + solution.name)
|
|
90
|
-
|
|
91
|
-
const dataPath = `others/solutionsData/${solution.name}`
|
|
92
|
-
fs.mkdir(dataPath, { recursive: true })
|
|
93
|
-
|
|
94
|
-
if (solution.permissions) {
|
|
95
|
-
await getGroupsFromServer(
|
|
96
|
-
cmdEnv.servername,
|
|
97
|
-
solution.groups,
|
|
98
|
-
dataPath + "/permissions.json",
|
|
99
|
-
solution.name,
|
|
100
|
-
args
|
|
101
|
-
)
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
if (solution.definitions) {
|
|
105
|
-
const definitionPath = dataPath + '/definitions/'
|
|
106
|
-
fs.mkdir(definitionPath, { recursive: true })
|
|
107
|
-
const viewsPath = dataPath + '/views/'
|
|
108
|
-
fs.mkdir(viewsPath, { recursive: true })
|
|
109
|
-
await getDefinitionsFromServer(
|
|
110
|
-
cmdEnv.servername,
|
|
111
|
-
solution.definitions,
|
|
112
|
-
definitionPath,
|
|
113
|
-
viewsPath,
|
|
114
|
-
solution.name,
|
|
115
|
-
args
|
|
116
|
-
).run()
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
if (solution.instances) {
|
|
120
|
-
const instancesPath = dataPath + '/instances/'
|
|
121
|
-
fs.mkdir(instancesPath, { recursive: true })
|
|
122
|
-
await getInstancesFromServer(
|
|
123
|
-
cmdEnv.servername,
|
|
124
|
-
solution.instances,
|
|
125
|
-
instancesPath,
|
|
126
|
-
solution.name,
|
|
127
|
-
args
|
|
128
|
-
)
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
if(solution.kibana){
|
|
132
|
-
const kibanaPath = dataPath + '/kibana/'
|
|
133
|
-
fs.mkdir(kibanaPath, { recursive: true })
|
|
134
|
-
await getKibanaFromServer(
|
|
135
|
-
cmdEnv.servername,
|
|
136
|
-
solution.kibana.spaces,
|
|
137
|
-
kibanaPath,
|
|
138
|
-
solution.name,
|
|
139
|
-
args
|
|
140
|
-
)
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
if(solution.domains){
|
|
144
|
-
const domainsPath = dataPath + '/domains/'
|
|
145
|
-
fs.mkdir(domainsPath, { recursive: true })
|
|
146
|
-
await getDomainsFromServer(
|
|
147
|
-
cmdEnv.servername,
|
|
148
|
-
solution.domains.filter,
|
|
149
|
-
domainsPath,
|
|
150
|
-
solution.name,
|
|
151
|
-
args
|
|
152
|
-
)
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
await fs.writeFile('others/solutionsData/_index', solutions.map(c => c.name).join('\n'), 'utf-8')
|
|
22
|
+
console.log("\n " + changes.join("\n "));
|
|
23
|
+
console.log("\nUpdate done!".yellow,"Check","git status".bold.blue,"and","git diff".bold.blue,"to see the resulting differences.");
|
|
24
|
+
console.log("Notice that","any changes since last deploy migth be lost.".underline)
|
|
25
|
+
console.log("Notice also that you will need to do a","cob-cli deploy --force".bold.blue,"on next deploy.")
|
|
158
26
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
} catch (err) {
|
|
162
|
-
console.error("\n", err.message);
|
|
27
|
+
} catch(err) {
|
|
28
|
+
console.error("\n",err.message);
|
|
163
29
|
}
|
|
164
30
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
31
|
module.exports = updateFromServer;
|
|
@@ -5,7 +5,6 @@ const git = require('simple-git');
|
|
|
5
5
|
const fs = require('fs-extra');
|
|
6
6
|
const { getCurrentBranch } = require("./common_releaseManager");
|
|
7
7
|
const { SERVER_COB_CLI_DIRECTORY } = require("./common_helpers")
|
|
8
|
-
const { getSshArgs } = require("./common_helpers")
|
|
9
8
|
|
|
10
9
|
const SERVER_LAST_ENV_FILE = SERVER_COB_CLI_DIRECTORY + "lastDeployEnv";
|
|
11
10
|
|
|
@@ -67,7 +66,7 @@ exports.getCurrentCommandEnviroment = getCurrentCommandEnviroment;
|
|
|
67
66
|
|
|
68
67
|
/* ************************************ */
|
|
69
68
|
async function _applySpecific(environmentName) {
|
|
70
|
-
const envSpecificFiles = await fg(['**/*.ENV__'+ environmentName +'__.*'], { onlyFiles: false, dot: true });
|
|
69
|
+
const envSpecificFiles = await fg(['**/*.ENV__'+ environmentName +'__.*'], { onlyFiles: false, dot: true });
|
|
71
70
|
|
|
72
71
|
for( let envSpecificFile of envSpecificFiles ) {
|
|
73
72
|
let prodFile = envSpecificFile.replace(/\.ENV__.*__/,"")
|
|
@@ -75,7 +74,7 @@ async function _applySpecific(environmentName) {
|
|
|
75
74
|
if(!fs.existsSync(deleteFile)) {
|
|
76
75
|
if(fs.existsSync(prodFile)) {
|
|
77
76
|
let backupFile = envSpecificFile.replace(/\.ENV__.*__/,".ENV__ORIGINAL_BACKUP__")
|
|
78
|
-
await git().raw(["update-index","--assume-unchanged", prodFile])
|
|
77
|
+
await git().raw(["update-index","--assume-unchanged", prodFile])
|
|
79
78
|
fs.renameSync(prodFile, backupFile)
|
|
80
79
|
} else {
|
|
81
80
|
fs.appendFileSync('.git/info/exclude', "\n" + prodFile)
|
|
@@ -83,7 +82,7 @@ async function _applySpecific(environmentName) {
|
|
|
83
82
|
}
|
|
84
83
|
}
|
|
85
84
|
fs.renameSync(envSpecificFile, prodFile)
|
|
86
|
-
await git().raw(["update-index","--assume-unchanged", envSpecificFile])
|
|
85
|
+
await git().raw(["update-index","--assume-unchanged", envSpecificFile])
|
|
87
86
|
}
|
|
88
87
|
}
|
|
89
88
|
|
|
@@ -95,11 +94,11 @@ async function _undoSpecific(environmentName) {
|
|
|
95
94
|
let prodFile = changedFile.replace(/\.ENV__.*__/,"")
|
|
96
95
|
let originalEnvSpecificFile = changedFile.replace(/\.ENV__.*__/,'.ENV__' + environmentName + '__')
|
|
97
96
|
fs.renameSync(prodFile, originalEnvSpecificFile)
|
|
98
|
-
await git().raw(["update-index","--no-assume-unchanged", originalEnvSpecificFile])
|
|
99
|
-
|
|
97
|
+
await git().raw(["update-index","--no-assume-unchanged", originalEnvSpecificFile])
|
|
98
|
+
|
|
100
99
|
if( changedFile.indexOf("\.ENV__ORIGINAL_BACKUP__") > 0 ) {
|
|
101
100
|
fs.renameSync(changedFile, prodFile)
|
|
102
|
-
await git().raw(["update-index","--no-assume-unchanged", prodFile])
|
|
101
|
+
await git().raw(["update-index","--no-assume-unchanged", prodFile])
|
|
103
102
|
}
|
|
104
103
|
if( changedFile.indexOf("\.ENV__DELETE__") > 0 ) {
|
|
105
104
|
flagDeleteExclude = true
|
|
@@ -121,8 +120,6 @@ function _getDefaultServerForEnvironment(environmentName) {
|
|
|
121
120
|
|
|
122
121
|
/* ************************************ */
|
|
123
122
|
function _getServerSSHFQDN(servername) {
|
|
124
|
-
// return IPs as-is
|
|
125
|
-
if (servername.includes(".")) return servername;
|
|
126
123
|
return servername + ".cultofbits.pt";
|
|
127
124
|
}
|
|
128
125
|
|
|
@@ -134,19 +131,16 @@ function _getServerHTTPsFQDN(servername) {
|
|
|
134
131
|
/* ************************************ */
|
|
135
132
|
async function _getLastEnvironmentDeployed(server) {
|
|
136
133
|
try {
|
|
137
|
-
let result = await execa('ssh', [
|
|
134
|
+
let result = await execa('ssh', [server, "cat " + SERVER_LAST_ENV_FILE ]);
|
|
138
135
|
return result.stdout;
|
|
139
136
|
} catch (error) {
|
|
140
|
-
if (error.exitCode === 255) {
|
|
141
|
-
throw new Error(`SSH connection to '${server}' failed: ${error.shortMessage}`);
|
|
142
|
-
}
|
|
143
137
|
return "prod"
|
|
144
138
|
}
|
|
145
139
|
}
|
|
146
140
|
|
|
147
141
|
/* ************************************ */
|
|
148
142
|
async function _setLastEnvironmentDeployed(server, environmentName) {
|
|
149
|
-
await execa('ssh', [
|
|
143
|
+
await execa('ssh', [server, "echo '" + environmentName + "' > " + SERVER_LAST_ENV_FILE ]);
|
|
150
144
|
}
|
|
151
145
|
|
|
152
146
|
/* ************************************ */
|
|
@@ -1,43 +1,5 @@
|
|
|
1
|
-
const inquirer = require("inquirer")
|
|
2
|
-
const readline = require('readline');
|
|
3
|
-
const yaml = require('js-yaml');
|
|
4
|
-
const fs = require("fs/promises");
|
|
5
|
-
const { getSshArgs } = require("./ssh");
|
|
6
|
-
|
|
7
1
|
const SERVER_COB_CLI_DIRECTORY = "/opt/cob-cli/";
|
|
8
2
|
|
|
9
|
-
/* ************************************ */
|
|
10
|
-
function getSshArgs(server) {
|
|
11
|
-
const args = [
|
|
12
|
-
"-o", "StrictHostKeyChecking=no",
|
|
13
|
-
"-o", "PreferredAuthentications=publickey",
|
|
14
|
-
"-o", "BatchMode=yes",
|
|
15
|
-
];
|
|
16
|
-
|
|
17
|
-
if (process.env.COB_SSH_PORT) args.push("-p", process.env.COB_SSH_PORT);
|
|
18
|
-
if (process.env.COB_SSH_IDENTITY) args.push("-i", process.env.COB_SSH_IDENTITY);
|
|
19
|
-
|
|
20
|
-
const target = process.env.COB_SSH_USER ? `${process.env.COB_SSH_USER}@${server}` : server;
|
|
21
|
-
args.push(target);
|
|
22
|
-
|
|
23
|
-
return args;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/* ************************************ */
|
|
27
|
-
function getServerAddress(server) {
|
|
28
|
-
return process.env.COB_SSH_USER ? `${process.env.COB_SSH_USER}@${server}` : server;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/* ************************************ */
|
|
32
|
-
function getRsyncSsh() {
|
|
33
|
-
let cmd = "ssh -o ConnectTimeout=30 -o ServerAliveInterval=30 -o ServerAliveCountMax=30 -o StrictHostKeyChecking=no";
|
|
34
|
-
|
|
35
|
-
if (process.env.COB_SSH_IDENTITY) cmd += ` -i '${process.env.COB_SSH_IDENTITY}'`;
|
|
36
|
-
if (process.env.COB_SSH_PORT) cmd += ` -p ${process.env.COB_SSH_PORT}`;
|
|
37
|
-
|
|
38
|
-
return cmd;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
3
|
/* **************************************************************************************** */
|
|
42
4
|
async function checkWorkingCopyCleanliness(testNotDetached=true) {
|
|
43
5
|
const git = require('simple-git');
|
|
@@ -70,81 +32,40 @@ async function checkWorkingCopyCleanliness(testNotDetached=true) {
|
|
|
70
32
|
function checkConnectivity(server) {
|
|
71
33
|
const execa = require('execa');
|
|
72
34
|
return execa('ssh', [
|
|
35
|
+
"-o", "StrictHostKeyChecking=no",
|
|
36
|
+
"-o", "PreferredAuthentications=publickey",
|
|
37
|
+
"-o", "BatchMode=yes",
|
|
73
38
|
"-o", "ConnectTimeout=15",
|
|
74
|
-
|
|
39
|
+
server,
|
|
75
40
|
"test -w /etc/recordm/services/com.cultofbits.web.integration.properties && exit || exit 1"
|
|
76
41
|
])
|
|
77
42
|
}
|
|
78
43
|
|
|
79
|
-
|
|
80
44
|
/* ************************************ */
|
|
81
|
-
let readlineSetup = false
|
|
82
45
|
function getKeypress() {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
readlineSetup = true
|
|
86
|
-
}
|
|
46
|
+
const readline = require('readline');
|
|
47
|
+
|
|
87
48
|
process.stdin.setRawMode(true);
|
|
49
|
+
readline.emitKeypressEvents(process.stdin);
|
|
88
50
|
const rl = readline.createInterface({
|
|
89
51
|
input: process.stdin
|
|
90
52
|
});
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
rl.input.removeListener('keypress', listener)
|
|
100
|
-
rl.close();
|
|
101
|
-
process.stdin.setRawMode(false);
|
|
102
|
-
resolve(letter && letter.toLowerCase() || key.name);
|
|
103
|
-
}
|
|
53
|
+
return new Promise(resolve => rl.input.on("keypress", (letter,key) => {
|
|
54
|
+
if(key.name == "return") {
|
|
55
|
+
console.log("")
|
|
56
|
+
} else {
|
|
57
|
+
if(key.ctrl && key.name == 'c') letter = "ctrl+c"
|
|
58
|
+
rl.close();
|
|
59
|
+
process.stdin.setRawMode(false);
|
|
60
|
+
resolve(letter && letter.toLowerCase() || key.name);
|
|
104
61
|
}
|
|
105
|
-
|
|
106
|
-
})
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/* ************************************ */
|
|
110
|
-
async function promptCredentials() {
|
|
111
|
-
const answers = await inquirer.prompt([
|
|
112
|
-
{
|
|
113
|
-
type: 'text',
|
|
114
|
-
message: 'Enter username:',
|
|
115
|
-
name: 'username',
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
type: 'password',
|
|
119
|
-
message: 'Enter password:',
|
|
120
|
-
name: 'password',
|
|
121
|
-
mask: '*',
|
|
122
|
-
},
|
|
123
|
-
])
|
|
124
|
-
|
|
125
|
-
return answers
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
/* ************************************ */
|
|
129
|
-
async function readYamlFile(filename) {
|
|
130
|
-
try {
|
|
131
|
-
const data = await fs.readFile(filename, 'utf-8');
|
|
132
|
-
const config = yaml.load(data);
|
|
133
|
-
return config
|
|
134
|
-
} catch (error) {
|
|
135
|
-
console.error('Error reading YAML file:', error.message);
|
|
136
|
-
}
|
|
62
|
+
}))
|
|
137
63
|
}
|
|
138
64
|
|
|
139
65
|
/* ************************************ */
|
|
140
66
|
module.exports = {
|
|
141
67
|
SERVER_COB_CLI_DIRECTORY : SERVER_COB_CLI_DIRECTORY,
|
|
142
|
-
getSshArgs: getSshArgs,
|
|
143
|
-
getServerAddress: getServerAddress,
|
|
144
|
-
getRsyncSsh: getRsyncSsh,
|
|
145
68
|
checkConnectivity: checkConnectivity,
|
|
146
69
|
checkWorkingCopyCleanliness: checkWorkingCopyCleanliness,
|
|
147
|
-
getKeypress: getKeypress
|
|
148
|
-
promptCredentials: promptCredentials,
|
|
149
|
-
readYamlFile: readYamlFile
|
|
70
|
+
getKeypress: getKeypress
|
|
150
71
|
};
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
const execa = require('execa');
|
|
2
|
+
const fs = require('fs-extra');
|
|
2
3
|
const git = require('simple-git');
|
|
3
4
|
|
|
4
5
|
const SERVER_CHANGELOG = "/opt/cob-cli/DEPLOYLOG.md";
|
|
5
6
|
const LAST_SHA_FILE = "lastDeploySha"
|
|
6
|
-
const { SERVER_COB_CLI_DIRECTORY
|
|
7
|
+
const { SERVER_COB_CLI_DIRECTORY } = require("./common_helpers");
|
|
7
8
|
const SERVER_LAST_SHA_FILE = SERVER_COB_CLI_DIRECTORY + LAST_SHA_FILE;
|
|
8
9
|
|
|
9
10
|
/* ************************************ */
|
|
@@ -43,18 +44,18 @@ async function registerRelease(cmdEnv) {
|
|
|
43
44
|
const dateTimeStr = date.toISOString().slice(0,16).replace(/T/," ")
|
|
44
45
|
const deploySignature = cmdEnv.servername + "_" + dateStr
|
|
45
46
|
const newDeployText = `${dateTimeStr} ${user} [${currentSha}/${cmdEnv.currentBranch}]`
|
|
46
|
-
await execa('ssh', [
|
|
47
|
+
await execa('ssh', [cmdEnv.server, "echo $'" + newDeployText + "\n" + diffs.replace(/'/g,"\\'") + "' >> " + SERVER_CHANGELOG])
|
|
47
48
|
|
|
48
49
|
if (diffs) {
|
|
49
50
|
// Add deploy tags to repo
|
|
50
|
-
|
|
51
|
+
git().fetch(["--tags","-f"]) // Apenas para ter certeza que temos todas as tags
|
|
51
52
|
try {
|
|
52
53
|
await git().silent(true).tag([deploySignature, "-d"])
|
|
53
54
|
} catch {}
|
|
54
55
|
|
|
55
56
|
await git().addAnnotatedTag(deploySignature, newDeployText )
|
|
56
57
|
await git().push(["-f", "origin", deploySignature])
|
|
57
|
-
|
|
58
|
+
git().fetch(["--tags","-f"]) // Apenas para ter certeza que temos todas as tags
|
|
58
59
|
}
|
|
59
60
|
_setLastDeployedSha(cmdEnv.server, currentSha);
|
|
60
61
|
}
|
|
@@ -64,12 +65,9 @@ exports.registerRelease = registerRelease;
|
|
|
64
65
|
async function getLastDeployedSha(server) {
|
|
65
66
|
let result
|
|
66
67
|
try {
|
|
67
|
-
result = await execa('ssh', [
|
|
68
|
+
result = await execa('ssh', [server, "cat " + SERVER_LAST_SHA_FILE ]);
|
|
68
69
|
} catch (error) {
|
|
69
|
-
|
|
70
|
-
throw new Error(`SSH connection to '${server}' failed: ${error.shortMessage}`);
|
|
71
|
-
}
|
|
72
|
-
await execa('ssh', [...getSshArgs(server), "mkdir -p " + SERVER_COB_CLI_DIRECTORY ]);
|
|
70
|
+
await execa('ssh', [server, "mkdir -p " + SERVER_COB_CLI_DIRECTORY ]);
|
|
73
71
|
return null
|
|
74
72
|
}
|
|
75
73
|
return result.stdout;
|
|
@@ -78,7 +76,7 @@ exports.getLastDeployedSha = getLastDeployedSha;
|
|
|
78
76
|
|
|
79
77
|
/* ************************************ */
|
|
80
78
|
function _setLastDeployedSha(server, lastSha) {
|
|
81
|
-
execa('ssh', [
|
|
79
|
+
execa('ssh', [server, "echo '" + lastSha + "' > " + SERVER_LAST_SHA_FILE ]);
|
|
82
80
|
}
|
|
83
81
|
|
|
84
82
|
/* ************************************ */
|