Automated deployments with git-flow, heroku_san & CircleCI

Here’s a simple workflow that I like to use to quickly get automated deployments working on any RoR project running on Heroku.

git-flow

First we need to establish a good git branching process and for that I always use git-flow.

If you are not familiar with it, I highly recommend reading A successful Git branching model which explains what it’s all about.

Basically it’s just a command line wrapper for several git commands. For example, this git-flow command git flow feature start cool_stuff will create a new branch called feature/cool_stuff, based on your develop branch and switch to it.

It’s super easy to use. It establishes best-practices out the door and helps you leverage the power of git.

heroku_san

Now once you have that setup, we can move on to setting up heroku_san. It makes maintaining multiple environments (staging, production, demo) a breeze by providing a simple set of rake tasks.

Install the gem

group :development do
    gem 'heroku_san'
end

and run the rake command

rails generate heroku_san

which will generate a /config/heroku.yml. You can tweak this according to your needs. In our case:

production:
  app: liveapp
  stack: cedar
  config:
    RACK_ENV: production
    RAILS_ENV: production
    BUNDLE_WITHOUT: "development:test"

staging:
  app: stagingapp
  stack: cedar
  config:
    RACK_ENV: staging
    RAILS_ENV: staging
    BUNDLE_WITHOUT: "development:test"

Now you could run rake staging deploy at anytime to deploy your code to the stagingapp on Heroku but we want to automate that.

CircleCI

That brings us to the last part. Here you could swap CircleCI with any other CI server such as Jenkins, Codeship, Travis, Semaphore, etc they should all work similarly.

In this case, go ahead and sign-up for CircleCI and add your project to it. After that, follow this guide to deploy to Heroku.

Once you’ve set that up, create a circle.yml file at the root of your project so it knows what to do when you push your code:

## Customize deployment commands
deployment:
  production:
    branch: master
    commands:
      - bundle exec rake production deploy
  staging:
    branch: develop
    commands:
      - bundle exec rake staging deploy

We are basically telling it to run heroku_san deploy tasks once your test suite passes.

In Action

So now that we’ve got it all dialed in, we can either push to develop or master and the code will be deployed to the correct app on Heroku.

Pushing to staging:

git push origin develop

That’s all it takes and your app will automatically be deployed to your stagingapp on Heroku. It will recognize that we pushed to the develop branch based on our configuration in the circle.yml.

OR

Pushing to production:

git flow release start 1.0.0
git flow release finish 1.0.0
git push origin master develop --tags

In this case, git-flow will create a release branch/tag which will be merged into master and pushed to GitHub. CI will listen in on that and immediately trigger a production deploy since we pushed to master.

If you have any questions or comments, please post them below. If you liked this post, you can share it with your followers or follow me on Twitter!