There's an echo in my head

日々のメモ。

Capistranoでunicornを扱うときはBUNDLE_GEMFILEをリセットする

Capistranounicornを使ったアプリをデプロイしているとBundler::GemfileNotFoundという例外があがることがあるらしい*1

どうやらBUNDLE_GEMFILEがreleasesのある時点でのGemfileのパスを保持したままデプロイを重ねて、そのファイルがtruncateで削除されてたのが原因とのこと。

自分のところではまだ再現していないけど、次のコードをunicornの設定ファイルに追記して対応しておいた。

config/unicorn/production.rb:

current_path = "/path/to/project/current"

before_exec do |server|
  ENV['BUNDLE_GEMFILE'] = "#{current_path}/Gemfile"
end

ちなみにbefore_execに登録したブロックは新しいマスタープロセスを立ち上げる直前に呼ばれるので、そこからforkして派生するワーカにも適用される。

参考

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。