2014年2月25日火曜日

Rails nginx unicorn環境をcapistrano3で自動デプロイ

capistrano3.1.0を使ってproduction環境の自動デプロイを設定しました。
自分が詰まったところの情報をシェアします。
誰かの助けになれば幸いです。

問題 サンプルコードを書いても動かない

capistranoはver3からコードの書き方が変わっています。
deploy.rbに
task: list do
  on roles(:all) do
    execute "ls"
  end
end
と書き、config/deploy/production.rbを設定した後で
cap production task
を入力すると、production環境におけるlsの実行結果が出力されます。

問題 shellのコマンドを実行したいのに、runが動かない

shellのコマンドを実行したい場合、runではなくexecuteを使います。
execute "ls"

問題 ローカルで変更した内容が反映されない

gitのリポジトリを設定した場合、設定したリポジトリの内容がデプロイされます。 なので、ローカルで変更した内容をリモートサーバに反映したい場合、pushしておく必要があります。 これに気づくまで、変更内容が反映されなくて困りました。

問題 capistranoを通したbundle installが出来ない Gemfileに

gem 'rvm1-capisstrano3', require: nil
を追加します。 Gemfile.lockが.gitignoreに含まれていてもbundle installが成功しません。
.gitignoreにGemfile.lockを含めたままbundle installを成功させる方法を知っている方が居らっしゃったら、教えて下さい。

エラー対応 undefined method `namespace' for main:Object (NoMethodError)

Gemfile
gem 'rvm1-capistrano3'
だけだとrails sをした時に上のエラーが出ます。下記のようにrequire: nilが必要です。
Gemfile
gem 'rvm1-capistrano3', require: nil

エラー対策 app error: undefined method `pp'

production環境にはppが無いので、ppが含まれているコードを消すか、requireでppを呼ぶか、別の方法で出力する必要があります。

エラー対策 onImage.png isn't precompiled

下記の設定をしました。
config/environment/production.rb
 config.assets.compile = true

参考
undefined method `namespace' for main:Object (NoMethodError)

0 件のコメント :