railsプロジェクトをgit-pushしたときに自動的にデプロイする方法

gitはとてもスマートだから標準でいろいろなイベントをhookする機能を用意してくれているよ。
これを利用して、中央リポジトリにpushすると自動的にデプロイをするようにしたいと思う。

本番サーバは慎重にデプロイする必要があるけど、テストサーバはそのとき最新の作業分を常に確認したいからね。

環境

ローカルPC「Alice」
中央リポジトリ「Bob」
テストサーバ「Carol」

やりたいこと

AliceからBobへpushすると自動的にCarolがpullし、db:migrateを行う。場合によってはサーバのリスタートやfixtureの読み込み、その他諸々を行う。

code

hookするイベントは"post-receive"、pushされたら発生するイベントだよ。
まずはRAILS_ROOTに以下のファイルを作ろう。
deploy.rb

rake("db:migrate")

そして、Bobのhooksに"post-receive"ファイルを作ろう。中身は以下の通り
post-receiv

#!/bin/sh
(
cd /path/to/Carol && \
git --git-dir=.git pull && \
rake rails:template LOCATION=deploy.rb
)

こうしておけば、AliceからBobへpushしたときに自動的にCarolが更新されてmigrateが走るよ。
deploy.rbはrails-templateなので簡単にrailsに関する操作ができるのも便利。



参考:http://at-aka.blogspot.com/2009/05/git-push.html