-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathssh-pipe.js
122 lines (105 loc) · 3.36 KB
/
ssh-pipe.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
const SSH = require('simple-ssh');
const colors = require('colors');
const Spinner = require('cli-spinner').Spinner;
const { repository, version, name } = require('./package.json');
class Server {
constructor({ connent, env }) {
this.connent = connent;
this.env = env;
this.report = {
passed: 0,
error: 0
}
}
get description(){
console.log("\n" + colors.bold("Doploy."))
console.log("Name:", colors.yellow(name), colors.yellow(version))
console.log("Github:", colors.yellow(repository.github))
console.log("Host:", colors.yellow(this.connent.host))
console.log("Dir:", colors.yellow(this.connent.baseDir))
}
get Report() {
let { passed, error } = this.report;
console.log("\n", colors.green(passed + " pass"))
console.log("", colors.red(error + " error\n"))
}
set(connent, env) {
this.connent = connent;
this.env = env;
}
show(cmd, { code, stdout, stderr }) {
switch (code) {
case 0:
this.report.passed += 1
console.log(colors.green('✓'), cmd)
break;
default:
this.report.error += 1
console.log(colors.red('✗'), cmd)
_out(" " + stdout, _debug)
_err(" [Code " + code + "] " + stderr)
break;
}
}
exec(cmd) {
return new Promise((res, rej) => {
const _ssh = new SSH(this.connent)
const env_keys = Object.keys(this.env);
var setenv = "";
for (var key in env_keys) {
var keyName = env_keys[key];
setenv += keyName + "=" + this.env[keyName] + " ";
}
_ssh.exec(setenv + "&&" + cmd, {
exit: (code, stdout, stderr) => {
this.show(cmd, { code, stdout, stderr });
res({ code, stdout, stderr })
}
}).start()
})
}
async start(pipelines) {
for (var key in pipelines) {
await this.steps(pipelines[key], (Number(key) + 1), async (cmd) => {
await this.exec(cmd)
})
}
this.report
}
title(step, text) {
console.log("\n" + step, colors.bold(text))
}
async steps(pipeline, index, work = async () => { }) {
var spinner = new Spinner(' %s ');
spinner.setSpinnerString('⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏');
this.title(index + ".", pipeline.title);
var start = tackTime.tack();
spinner.start();
for (var key in pipeline.step) {
await work(pipeline.step[key]);
}
spinner.stop();
var end = tackTime.tack();
const time = tackTime.diff({ start, end });
console.log(time.text);
}
}
const tackTime = {
tack: () => { return new Date().getTime() },
diff: (time) => {
const millisec = time.end - time.start;
var seconds = (millisec / 1000).toFixed(2);
var text = colors.green("(" + seconds + " s.)");
if (millisec < 1000) {
text = colors.green("(" + millisec + " ms.)");
}
return {
text,
time: {
seconds,
millisec
}
};
}
}
module.exports = Server;