Software Development

Deployment automation with ShipIt

Automatic deployment is an essential part of continuous integration (CI). But sometimes full-fledged CI tools/services — like Jenkins, Gitlab-CI, or Travis-CI — are overkill for simple or personal projects. That’s where deployment automation tools like ShipIt shines.

ShipIt is not the only automation tool. There are Capistrano (Ruby), Envoy (PHP), Fabric (Python), and, Gradle + SSH Plugin (Java). But if you are working on a node.js project, choosing ShipIt requires less software dependency as it only needs node.js. You just need to run npm install --save-dev shipit-cli shipit-deploy to install it.

Below is a sample of ShipIt script shipitfile.js to build & deploy simple vue-cli app to an Linux remote server:

module.exports = shipit => {
    require('shipit-deploy')(shipit)

    shipit.initConfig({
        // Default config for all environment
        default: {
            deployTo: '/home/user/project/dist',
            repositoryUrl: 'https://github.com/user/project.git',
        },
        // Environment-specific config
        production: {
            deployTo: '/home/user/lab',
            distDir: './dist',
            servers: 'user@server',
            build: 'npm run build',
        }
    })

    // Deploy task
    shipit.task('deploy', async () => {
        // Run "build" value for given environment (in this case "npm run build")
        await shipit.local(shipit.config.build)
        // Delete existing deployment directory
        await shipit.remote(`rm -rf ${shipit.config.deployTo}`)
        // Copy build result from local to remote directory
        await shipit.start('copy-dist')
    })

    shipit.task('copy-dist', async () => {
        await shipit.copyToRemote(
          shipit.config.distDir,
          shipit.config.deployTo,
        )
    })
}

Assuming that you have setup SSH public key authentication for user to server, you can execute deploy task on production environment by running: npx shipit production deploy.

Since we can run basically any Linux command available on the remote server, we can do almost everything we need to deploy our applications. For example, assuming there is sufficient privilege, one can utilize symbolic links to have zero-downtime deployment.

0 0 votes
Article Rating
yohanes.gultom@gmail.com

Share
Published by
yohanes.gultom@gmail.com

Recent Posts

Get Unverified SSL Certificate Expiry Date with Python

Getting verified SSL information with Python (3.x) is very easy. Code examples for it are…

3 years ago

Spring Data Couchbase 4 Multibuckets in Spring Boot 2

By default, Spring Data Couchbase implements single-bucket configuration. In this default implementation, all POJO (Plain…

3 years ago

Firebase Auth Emulator with Python

Last year, Google released Firebase Auth Emulator as a new component in Firebase Emulator. In…

4 years ago

Google OIDC token generation/validation

One of the authentication protocol that is supported by most of Google Cloud services is…

4 years ago

Fast geolocation query with PostGIS

If you need to to add a spatial information querying in your application, PostGIS is…

4 years ago

Auto speech-to-text (Indonesian) with AWS Transcribe and Python

Amazon Web Service Transcribe provides API to automatically convert an audio speech file (mp3/wav) into…

5 years ago