capistrano-extとcapistrano-unicornを使ってRailsアプリをデプロイする

capistrano-extとcapistrano-unicornを使ってRailsアプリをデプロイした時にハマったので、メモがわりに。 参考にしたのは下記サイト

やりたかったこと

  1. Rails3.2xで開発しているアプリをnginx+unicornで動かす
  2. 本番環境としてデプロイされていたアプリをステージング環境としてデプロイし直す

前提条件

  1. nginxはインストール済み
  2. unicornもインストール済み
  3. bundle exec cap . コマンド実行済み
  4. Railsで開発しているアプリは本番環境としてデプロイ済み

以下、作業内容と起きたこと

  1. capistrano-extとcapistrano-unicornをインストール Gemfileに下記を追記して(developmentグループに入れておくと良い)bundle installコマンド実行
    gem 'capistrano-ext'
    gem 'capistrano-unicorn'
  2. /conf/deploy.rbに本番環境とステージング環境の共通のデプロイ設定を記述
  3. /conf/deploy/staging.rbと/conf/deploy.production.rbにそれぞれ環境個別のデプロイ設定を記述
  4. /conf/unicorn/staging.rbと/conf/unicorn/production.rbに環境個別のunicornの設定を記述
  5. Capfileに下記を追加
    load 'config/deploy'
  6.  下記コマンドを実行
    bundle exec cap staging deploy
  7.  capistrano-unicornをインストールしてるのでunicornの起動も自動的にコントロールされるのだが、unicorn:stop, unicorn:startタスクが実行されるのではなくunicorn:reloadタスクが実行されるので、psコマンドでunicornのプロセスを確認すると下記のようになっている。
    unicorn master -c /path/to/current/config/unicorn/staging.rb -E production -D
  8. staging環境用の設定ファイル読んでるけどコマンドラインオプション-Eでproductionを指定しているのでRAILS_ENV=production でRailsアプリが動いていることに。。。ブラウザで動作確認したら本番環境のDB見に行ってるじゃないですかー!やだー!!
  9. /conf/deploy/staging.rbに下記を追加
    set :deploy_env, 'staging'
    set :unicorn_env, 'staging'
    set :rails_env, 'staging'
    set :app_env, 'staging'
  10. bundle exec cap staging deploy 実行後、確実にunicornを再起動させるため、下記を実行。
    bundle exec cap unicorn:stop
    bundle exec cap unicorn:start
  11. psコマンドでunicornのプロセスを確認すると
    unicorn master -c /path/to/current/config/unicorn/staging.rb -E staging -D
  12. ブラウザで動作確認するとちゃんとステージング環境のDB見に行ってるね!メデタシメデタシ!!