コードロード

エラー討伐

【Rails×Capistrano】Gemfile not found (Bundler::GemfileNotFound)

解決方法

app/config/unicorn/production.rb に下記を追記

before_exec do |server|
  ENV["BUNDLE_GEMFILE"] = File.join(File.expand_path("../../../../", __FILE__), "current", "Gemfile")
end

ローカルにて下記コマンドでunicornをSTOPしてSTARTしてあげる。

$ bundle exec cap production unicorn:stop
$ bundle exec cap production unicorn:start

原因

deployを何度もやっていると、急にGemfileが読み込まれなくなり、再起動できなくなることがある。

app/config/unicorn/production.rb にて、 preload_app true を設定している場合に起こりうるらしい。

preload_app trueとは、ほっとホットデプロイ、緩やかなデプロイとよく言われるらしい。USR2。ググればたくさん出てくる。

この時点でENV[“BUNDLE_GEMFILE”]にはRAILS_ROOT/releases/日付的なやつ/Gemfileが入ってしまうので、これをunicornプロセスが覚え続けてしまう。

そうすると、そのうちSIGUSR2がなげられても、一旦BUNDLE_GEMFILEの方にGemfileを確認してしまうので、既に存在しないGemfileを確認にいってしまう。

参考

capistrano + unicornではまった。 – blog unlearned