Hi, I’m Nico Hagenburger
My pleasure is designing
clean, simple websites
and developing web applications in Ruby on Rails.

How to auto deploy Rails apps after Git push

For my most recent project, I had to share a git repository with another Rails developer. He also had to make deploys on my server. As my server has many projects, I though about having another way than giving him access via SSH for cap deploy.

I remembered Heroku automatically deploys Rails apps after commits. So here’s how you can have the same functionality with pure Git.

Configuration of SSH And Users

I’m assuming the following configuration:

Git repository
/home/git/awesome-rails-app.git
Deploy path
/var/www/awesome-rails-app
Git user
git
Deploy user
deploy
Authentication
with SSH keys

First, create a SSH key for the user git (unless you already did so) and add it for for the deploy user and vice versa:

# log in as git:
ssh-keygen -t rsa
# log in as deploy:
cat /home/git/.ssh/id_rsa.pub >> /home/deploy/authorized_keys
ssh-keygen -t rsa
# log in as git:
cat /home/deploy/.ssh/id_rsa.pub >> /home/git/authorized_keys

Installing the Git Hook

Git offers some hooks, where you can add your own code. The most interestion hook for having a deploy is “post-receive”. Just add the deploy command:

# File: /home/git/awesome-rails-app.git/hooks/post-receive
#!/bin/sh
cd /var/www/awesome-rails-app/current && cap deploy:migrations
## If Git isn’t on the same server as the application:
# ssh deploy@deploy-server.com \
#   'cd /var/www/awesome-rails-app/current && cap deploy:migrations'
## Don’t forget to add the SSH keys.

Make this file executable:

chmod +x /home/git/awesome-rails-app.git/hooks/post-receive

Finish

Now it should work:

# on your local mashine:
git push origin master

You’ll see all commands of the cap deploy:migrations process in your console.

This post was inspired by this post. After you finished the automatical deploy, there is some other interesting homework: auto test before commits, integration your bug tracker, …