【Rails】GitHub Webhooks + Sinatraで自動デプロイ環境を作った
今までRailsでWebサービス開発するときには、
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.comでRails appが動いてるとして、http://deploy.example.comにGitHubから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に連絡ください。