forked from scotch-io/starter-node-angular
-
Notifications
You must be signed in to change notification settings - Fork 0
/
deploy.js
148 lines (138 loc) · 4.06 KB
/
deploy.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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
var cmd = require('node-cmd');
var path, node_ssh, ssh, fs;
fs = require('fs');
path = require('path');
node_ssh = require('node-ssh');
ssh = new node_ssh();
// the method that starts the deployment process
function main() {
console.log('Deployment started.');
sshConnect();
}
// installs PM2
function installPM2() {
return ssh.execCommand(
'sudo npm install pm2 -g', {
cwd: '/home/ubuntu'
});
}
// transfers local project to the remote server
function transferProjectToRemote(failed, successful) {
return ssh.putDirectory(
'../riot-express-todo-list',
'/home/ubuntu/riot-express-todo-list-temp',
{
recursive: true,
concurrency: 1,
validate: function(itemPath) {
const baseName = path.basename(itemPath);
return (
baseName.substr(0, 1) !== '.' && baseName !== 'node_modules' // do not allow dot files
); // do not allow node_modules
},
tick: function(localPath, remotePath, error) {
if (error) {
failed.push(localPath);
console.log('failed.push: ' + localPath);
} else {
successful.push(localPath);
console.log('successful.push: ' + localPath);
}
}
}
);
}
// creates a temporary folder on the remote server
function createRemoteTempFolder() {
return ssh.execCommand(
'rm -rf riot-express-todo-list-temp && mkdir riot-express-todo-list-temp', {
cwd: '/home/ubuntu'
});
}
// stops mongodb and node services on the remote server
function stopRemoteServices() {
return ssh.execCommand(
'pm2 stop all && sudo service mongod stop', {
cwd: '/home/ubuntu'
});
}
// updates the project source on the server
function updateRemoteApp() {
return ssh.execCommand(
'mkdir riot-express-todo-list && cp -r riot-express-todo-list-temp/* riot-express-todo-list/ && rm -rf riot-express-todo-list-temp', {
cwd: '/home/ubuntu'
});
}
// restart mongodb and node services on the remote server
function restartRemoteServices() {
return ssh.execCommand(
'cd riot-express-todo-list && sudo service mongod start && pm2 start app.js', {
cwd: '/home/ubuntu'
});
}
// connect to the remote server
function sshConnect() {
console.log('Connecting to the server...');
ssh
.connect({
// TODO: ADD YOUR IP ADDRESS BELOW (e.g. '12.34.5.67')
host: 'ec2-3-90-155-17.compute-1.amazonaws.com',
username: 'ubuntu',
privateKey: 'hs-key.pem'
})
.then(function() {
console.log('SSH Connection established.');
console.log('Installing PM2...');
return installPM2();
})
.then(function() {
console.log('Creating `riot-express-todo-list-temp` folder.');
return createRemoteTempFolder();
})
.then(function(result) {
const failed = [];
const successful = [];
if (result.stdout) {
console.log('STDOUT: ' + result.stdout);
}
if (result.stderr) {
console.log('STDERR: ' + result.stderr);
return Promise.reject(result.stderr);
}
console.log('Transferring files to remote server...');
return transferProjectToRemote(failed, successful);
})
.then(function(status) {
if (status) {
console.log('Stopping remote services.');
return stopRemoteServices();
} else {
return Promise.reject(failed.join(', '));
}
})
.then(function(status) {
if (status) {
console.log('Updating remote app.');
return updateRemoteApp();
} else {
return Promise.reject(failed.join(', '));
}
})
.then(function(status) {
if (status) {
console.log('Restarting remote services...');
return restartRemoteServices();
} else {
return Promise.reject(failed.join(', '));
}
})
.then(function() {
console.log('DEPLOYMENT COMPLETE!');
process.exit(0);
})
.catch(e => {
console.error(e);
process.exit(1);
});
}
main();