Skip to content

Instantly share code, notes, and snippets.

@eisisig
Created February 2, 2016 21:08
Show Gist options
  • Save eisisig/fef9b5712b7932ddb427 to your computer and use it in GitHub Desktop.
Save eisisig/fef9b5712b7932ddb427 to your computer and use it in GitHub Desktop.

Shipit Deploy

Shipit is a pretty awesome universal automation and deployment tool written in JavaScript.

Setup your server

(this would ideally be done with automated provisioning)

  • add a deploy user with password-less ssh see this gist
  • install forever npm install -g pm2

Install shipit

  • npm install -g shipit-cli
  • in your project folder npm install shipit-cli --save-dev`
  • create a shipitfile.js file

Deploy

npm run deploy:<environment>

IMPORTANT: Make sure that you can connect via ssh and have the correct file writes to /tmp & /services

{
"scripts": {
"debug": "node-debug ./server.js",
"start": "node ./server.js",
"deploy:dev":"shipit dev deploy",
"deploy:stable":"shipit stable deploy",
"deploy:demo":"shipit demo deploy"
},
"devDependencies": {
"shipit-cli": "^1.4.1",
"shipit-deploy": "^2.1.3"
}
}
var path = require('path');
function getServiceDirectory(env) {
return `/services/${env}/example_app`;
}
module.exports = function(shipit) {
'use strict';
require('shipit-deploy')(shipit);
shipit.initConfig({
default: {
workspace: './build', //Local working directory
deployTo: '/tmp/deploy_to/example_app', //Remote working directory
repositoryUrl: '[email protected]:example/example.com.git', //This can be any Git repository
ignores: ['.git', 'node_modules', 'test'],
rsync: ['--del'],
keepReleases: 2,
key: '/home/<user>/.ssh/id_rsa'
},
dev: {
servers: 'deploy@<remote>'
},
stable: {
servers: 'deploy@<remote>'
},
demo: {
servers: 'deploy@<remote>'
}
});
shipit.task('pwd', () => {
return shipit.remote('pwd');
});
shipit.on('deployed', () => {
shipit.start('stop', 'copy','npm', 'start')
});
shipit.blTask('stop', () => {
return shipit.remote(`pm2 stop example_app_${shipit.environment} -s`).catch(err => {
console.log('Service does not exist');
return Promise.resolve();
});
});
shipit.blTask('copy', () => {
let serviceDir = getServiceDirectory(shipit.environment);
var currRelease = path.join(shipit.releasesPath, shipit.releaseDirname);
return shipit.remote(`cp -R ${currRelease} ${serviceDir}`)
});
shipit.blTask('npm', () => {
let serviceDir = getServiceDirectory(shipit.environment);
return shipit.remote(`npm --production --prefix ${serviceDir} install ${serviceDir}`)
});
shipit.blTask('start', () => {
let serviceDir = getServiceDirectory(shipit.environment);
return shipit.remote(`pm2 start ${serviceDir}/server.js --name='example_app_${shipit.environment}' -i 1`)
});
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment