部署 Unicorn 无缝重启时的 BUNDLE_GEMFILE 参数

saberma · 2012年05月10日 · 最后由 liuzihua 回复于 2012年05月16日 · 5628 次阅读

使用 Unicorn 实现无缝重启后,有时候会发现更新版本后的 Gem 没有生效,Rails 取的总是之前旧版本的 Gemfile.lock 文件来定位 Gem。 检查后发现是 config/boot.rb 中的 BUNDLE_GEMFILE 参数值不正确

ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)

假设现在第一次发布版本,版本目录为 2012051001,启动 Unicorn,ENV['BUNDLE_GEMFILE'] 的值为 2012051001/Gemfile 第二次发布版本,此版本更新了 haml 的版本,版本目录为 2012051002,在本地运行 cap deploy 命令无缝重启 Unicorn,这个时候 Unicorn 不会清除 ENV 中的 BUNDLE_GEMFILE 参数值,其值仍为 2012051001/Gemfile,导致 rails 在启动时使用的是旧版本的 haml

这时,可以手动把 Unicorn kill 掉,再重新启动,问题消失,但就做不到无缝重启了

Unicorn 文档有提供针对此问题的解决方法,修改 config/unicorn.conf.rb 配置文件,增加:

before_exec do |server|
  ENV["BUNDLE_GEMFILE"] = "/u/apps/#{application}/current/Gemfile"
end

搜索 "unicorn BUNDLE_GEMFILE" 发现国外也有不少人中招,主要是使用 cap 清除旧的发布目录后,提示找不到 Gemfile

我就是遇到过几次这种情况,赶紧试试看看能不能解决重启失败的问题

默默的添加收藏~

@lgn21st 表示看到你说收藏后在页面上找了半天。。终于找到喜欢,收藏 - -

需要 登录 后方可回复, 如果你还没有账号请 注册新账号