Skip to content

Instantly share code, notes, and snippets.

@dala00
Created February 13, 2017 04:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dala00/7a586b0c47829ca1c9b879ddf67dd344 to your computer and use it in GitHub Desktop.
Save dala00/7a586b0c47829ca1c9b879ddf67dd344 to your computer and use it in GitHub Desktop.
Deploying script with sftp for Angular. 'npm run deploy' or 'npm run deploy rollback'
const Client = require('ssh2').Client;
const fs = require('fs');
const path = require('path');
const config = {
host: 'host',
port: 22,
username: 'username',
password: 'password',
};
let action;
if (process.argv.length == 2) {
action = 'deploy';
} else if (process.argv.length > 2) {
if (process.argv[2] == 'rollback') {
action = 'rollback';
}
}
if (!action) {
console.error('Called with wrong parameter "' + process.argv[2] + '"');
process.exit(1);
}
const walk = (dir, done) => {
var results = [];
fs.readdir(dir, function(err, list) {
if (err) return done(err);
var pending = list.length;
if (!pending) return done(null, results);
list.forEach(function(file) {
file = path.resolve(dir, file);
fs.stat(file, function(err, stat) {
if (stat && stat.isDirectory()) {
walk(file, function(err, res) {
results = results.concat(res);
if (!--pending) done(null, results);
});
} else {
results.push(file);
if (!--pending) done(null, results);
}
});
});
});
};
const end = (conn, err) => {
conn.end();
if (err) {
console.trace(err);
throw err;
}
}
const connect = () => {
return new Promise(resolve => {
const conn = new Client();
conn.on('ready', () => {
console.log('Client :: ready');
resolve(conn);
})
.connect(config);
});
}
const exec = (conn, command) => {
return new Promise(resolve => {
conn.exec(command, (err, stream) => {
var result = '';
stream.on('close', (code, signal) => {
resolve(result);
})
.on('data', (data) => {
result += 'STDOUT: ' + data;
})
.stderr.on('data', (data) => {
result += 'STDERR: ' + data;
});
});
});
}
const upload = (conn, localPath, remotePath) => {
return new Promise(resolve => {
conn.sftp((err, sftp) => {
if (err) end(conn, err);
console.log('Sftp :: send ' + localPath + ' > ' + remotePath);
sftp.fastPut(localPath, remotePath, {}, (err) => {
if (err) end(conn, err);
resolve();
});
})
});
}
const deploy = (conn) => {
exec(conn, 'rm -rf www/mokumoku_prepare')
.then((result) => {
console.log('Client :: Deleted prepare folder');
})
.then(() => {
return new Promise(resolve => {
walk(__dirname + '/dist', (err, files) => {
if (err) end(conn, err);
resolve(files);
});
})
})
.then((files) => {
let sent = 0;
const localBase = __dirname + '/dist/';
return new Promise(resolve => {
conn.sftp((err, sftp) => {
if (err) end(conn, err);
let promise = Promise.resolve();
files.forEach(file => {
const remotePath = file.replace(localBase, 'www/mokumoku_prepare/');
promise = promise.then(() => new Promise(resolve3 => {
let parts = remotePath.split('/');
parts.pop();
const folder = parts.join('/');
exec(conn, 'mkdir -p ' + folder).then((result) => {
resolve3();
});
}));
promise = promise.then(() => new Promise(resolve2 => {
console.log(file + ' > ' + remotePath);
sftp.fastPut(file, remotePath, {}, (err) => {
if (err) end(conn, err);
resolve2();
});
}));
});
return promise.then(() => {
resolve();
});
});
});
})
.then(() => exec(conn, 'mv www/mokumoku_front www/mokumoku_front_bak'))
.then((result) => exec(conn, 'mv www/mokumoku_prepare www/mokumoku_front'))
.then((result) => exec(conn, 'mv www/mokumoku_front_bak www/mokumoku_prepare'))
.then((result) => {
console.log('Finished');
end(conn);
});
}
const rollback = (conn) => {
exec(conn, 'mv www/mokumoku_front www/mokumoku_front_bak')
.then((result) => exec(conn, 'mv www/mokumoku_prepare www/mokumoku_front'))
.then((result) => exec(conn, 'mv www/mokumoku_front_bak www/mokumoku_prepare'))
.then((result) => {
console.log('Rollback finished');
end(conn);
});
}
connect().then((conn) => {
if (action == 'deploy') {
deploy(conn);
} else if (action == 'rollback') {
rollback(conn);
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment