しょ〜うぃん広場

おもにTech系なブログ、ときどき個人的なブログ

【Rails】GitHub Webhooks + Sinatraで自動デプロイ環境を作った

今までRailsWebサービス開発するときには、
1. ローカルで開発
2. GitHubにPush
3. サーバーにSSH
4. サーバーでGitHubからPull
5. Apacheの再起動

とかかなり原始的な方法をやってたんだけど、さすがに面倒に感じてきたので 3~5の手順を自動化しようと思って、やってみた。

Railsでデプロイ自動化といえばCapistranoが定石っぽいけど、 なんか設定めんどくさそうだし、バージョン管理しようとすると $ git push $ cap deploy とか2つコマンド実行しないといけなさそうだし、 Capistrano複数個のサーバーにデプロイできるけど、 そんな機能はぼくにとってオーバースペックだし… ってな感じで、Capistranoはパス。

最近は「GitHub 時代のデプロイ戦略」に書かれているみたいに、CIを使うのがナウいらしいけど、個人でそこまでやるのは… ってな感じで、CIはパス。

まぁ若いうちはできあいのものに頼るなってのもあるし(適当) WebHookしてみたい!って憧れもあったので、今回はGitHub Webhooks + Sinatraという形で作ってみた。

 

ここから本題

作成したコードはGitHubにおいてあるので、適当にcloneして、適宜書き換えてください。 GitHub: Automatic-Deploy-Tool-for-Rails

今回はhttp://example.comRails appが動いてるとして、http://deploy.example.comGitHubからPOSTリクエストを投げてもらうことにしました。 Apatcheの場合は/etc/httpd/conf/httpd.confをこんなふうにすればいいと思います。 Passengerの方の設定は変更の必要はありませんでした。

<virtualhost *:80>
 servername example.com
 serveralias www.example.com
 documentroot /var/www/example/public
 railsbaseuri /
 <directory /var/www/example/public>
   allowoverride all
   order allow,deny
   allow from all
   options -multiviews
 </directory>
</virtualhost>
 
<virtualhost *:80>
 servername deploy.example.com
 serveralias deploy.example.com
 documentroot /var/www/deploy/public
 RackEnv production
 <directory /var/www/deploy/public> 
   allowoverride all
   order allow,deny
   allow from all
   options -multiviews
 </directory>
</virtualhost>

/var/www/deployのところにAutomatic-Deploy-Tool-for-Railsを配置します。

$ cd /var/www/
$ git clone https://github.com/showwin/Automatic-Deploy-Tool-for-Rails.git
$ mv Automatic-Deploy-Tool-for-Rails deploy
$ cd deploy/
$ echo '<Rails-app path> <root-user password>' >> pathpass.txt
$ touch log.txt

[Rails-app path]はデプロイしたいディレクトリのパス、今回だと/var/www/exampleになります。 [root-user password]はApacheを再起動する際($ sudo service httpd restart)に使うものです。

 

最後にGitHub WebHooksの設定。 管理したいレポジトリのページに行って、 画面右側メニューの「Settings」→「Webhooks & Services」→「Add Webhook」 でPOSTリクエストを送りたいURLを指定できます。 今回であればhttp://deploy.example.comを指定します。

以上!

完成

これでGitHubにPushすると以下の4つのコマンドを行ってくれます。

$ git pull origin master
$ rake assets:precompile RAILS_ENV=production
$ rake db:migrate RAILS_ENV=production
$ sudo service httpd restart

かんたんだな〜 (いろいろハマってこれ作るのに4時間かかったけど…)


なんか手順書き忘れてる気がしないでもないので、うまくいかなかったら @showwinに連絡ください。