Universal automation and deployment tool ⛵️
npm install --save-dev shipit-cli
npm install --save-dev shipit-deploy
Shipit is an automation engine and a deployment tool.
Shipit provides a good alternative to Capistrano or other build tools. It is easy to deploy or to automate simple tasks on your remote servers.
Features:
- Write your task using JavaScript
- Task flow based on orchestrator
- Login and interactive SSH commands
- Easily extendable
- Create a
shipitfile.js
at the root of your project
// shipitfile.js
module.exports = shipit => {
// Load shipit-deploy tasks
require('shipit-deploy')(shipit)
shipit.initConfig({
default: {
deployTo: '/var/apps/super-project',
repositoryUrl: 'https://github.com/user/super-project.git',
},
staging: {
servers: 'deploy@staging.super-project.com',
},
})
}
-
Run deploy command using npx:
npx shipit staging deploy
-
You can rollback using
npx shipit staging rollback
Add a custom task in your shipitfile.js
and run copyToRemote
.
// shipitfile.js
module.exports = shipit => {
/* ... */
shipit.task('copyConfig', async () => {
await shipit.copyToRemote(
'config.json',
'/var/apps/super-project/config.json',
)
})
}
You can add custom event and listen to events.
shipit.task('build', function() {
// ...
shipit.emit('built')
})
shipit.on('built', function() {
shipit.start('start-server')
})
Shipit emits the init
event once initialized, before any tasks are run.
Instead of using a shipitfile.js
, use shipitfile.babel.js
:
// shipitfile.babel.js
export default shipit => {
shipit.initConfig({
/* ... */
})
}
You can overwrite all default variables defined as part of the default
object:
module.exports = shipit => {
shipit.initConfig({
default: {
branch: 'dev',
},
staging: {
servers: 'staging.myproject.com',
workspace: '/home/vagrant/website'
},
production: {
servers: [{
host: 'app1.myproject.com',
user: 'john',
}, {
host: 'app2.myproject.com',
user: 'rob',
}],
branch: 'production',
workspace: '/var/www/website'
}
});
...
shipit.task('pwd', function () {
return shipit.remote('pwd');
});
...
};
If you can't call shipit.initConfig(...)
right away because
you need to get data asynchronously to do so, you can return
a promise from the module:
module.exports = async shipit => {
const servers = await getServers()
shipit.initConfig({
production: {
servers: servers,
// ...
},
})
}
Usage: shipit <environment> <tasks...>
Options:
-V, --version output the version number
--shipitfile <file> Specify a custom shipitfile to use
--require <files...> Script required before launching Shipit
--tasks List available tasks
--environments List available environments
-h, --help output usage information
Type: Array<String>
List of files excluded in copyFromRemote
or copyToRemote
methods.
Type: String
Path to SSH key.
Type: String
or Array<String>
The server can use the shorthand syntax or an object:
user@host
: user and hostuser@host:4000
: user, host and port{ user, host, port, extraSshOptions }
: an object
Type: String
Allows you to ‘become’ another user, different from the user that logged into the machine (remote user).
Type: Boolean
, default to false
Delete release when a rollback is done.
Type: String
Directory where the code will be deployed on remote servers.
Type: Number
Number of releases kept on remote servers.
Type: String
Repository URL to clone, must be defined using https
or git+ssh
format.
Type: Boolean
, default true
Clone only the last commit of the repository.
Type: String
If shallowClone
is set to false
, this directory will be used to clone the repository before deploying it.
Type: Number
, default 0
SSH verbosity level to use when connecting to remote servers. 0 (none), 1 (-v), 2 (-vv), 3 (-vvv).
Create a new Shipit task. If a promise is returned task will wait for completion.
shipit.task('hello', async () => {
await shipit.remote('echo "hello on remote"')
await shipit.local('echo "hello from local"')
})
Create a new Shipit task that will block other tasks during its execution. If a promise is returned other task will wait before start.
shipit.blTask('hello', async () => {
await shipit.remote('echo "hello on remote"')
await shipit.local('echo "hello from local"')
})
Run Shipit tasks.
shipit.start('task')
shipit.start('task1', 'task2')
shipit.start(['task1', 'task2'])
Run a command locally and streams the result. See ssh-pool#exec.
shipit
.local('ls -lah', {
cwd: '/tmp/deploy/workspace',
})
.then(({ stdout }) => console.log(stdout))
.catch(({ stderr }) => console.error(stderr))
Run a command remotely and streams the result. See ssh-pool#connection.run.
shipit
.remote('ls -lah')
.then(([server1Result, server2Result]) => {
console.log(server1Result.stdout)
console.log(server2Result.stdout)
})
.catch(error => {
console.error(error.stderr)
})
Make a remote copy from a local path to a remote path. See ssh-pool#connection.copyToRemote.
shipit.copyToRemote('/tmp/workspace', '/opt/web/myapp')
Make a remote copy from a remote path to a local path. See ssh-pool#connection.copyFromRemote.
shipit.copyFromRemote('/opt/web/myapp', '/tmp/workspace')
Log using Shipit, same API as console.log
.
shipit.log('hello %s', 'world')
- shipit-shared
- shipit-db
- shipit-assets
- shipit-ssh
- shipit-utils
- shipit-npm
- shipit-aws
- shipit-captain
- shipit-bower
- shipit-composer
- shipit-bastion
- shipit-yaml
- shipit-conditional
MIT