Capistrano在升级ruby版本和puma时重启错误版本的puma

Posted

技术标签:

【中文标题】Capistrano在升级ruby版本和puma时重启错误版本的puma【英文标题】:Capistrano restarts wrong version of puma when upgrading ruby version and puma 【发布时间】:2016-09-06 01:15:48 【问题描述】:

我正在升级一个使用 capistrano 部署并运行 puma 的 Rails 应用程序,从 ruby​​ 2.2.0/puma 3.2 升级到 ruby​​ 2.3.1/puma 3.4。当我部署 puma 时似乎以错误的版本重新启动。

在我部署之前,Puma 在 pid 4717 / 3.4 版下运行

vagrant@vagrant-master:/mnt/code/shared/tmp/pids$ ps -ef | grep -i puma
vagrant   4717     1  0 20:53 ?        00:00:00 puma 3.4.0 (unix:///mnt/code/shared/tmp/sockets/code-puma.sock) [20160510205039]                                                                                                                                                                                                                                                        
vagrant   4720  4717 12 20:53 ?        00:00:10 puma: cluster worker 0: 4717 [20160510205039]            

当我部署旧版本(puma 3.2 / Ruby 2.2.0)时,puma 重新启动,它现在在 pid 5466 下运行:

vagrant@vagrant-master:/mnt/code/shared/tmp/pids$ ps -ef | grep -i puma
vagrant   5466     1  0 20:56 ?        00:00:00 puma 3.4.0 (unix:///mnt/code/shared/tmp/sockets/code-puma.sock) [20160510205440]                                                                                                                                                                                                                                                        
vagrant   6154  5466  0 20:56 ?        00:00:00 puma: cluster worker 0: 5466 [20160510205440]     

我的 puma 错误日志显示它运行的是 2.3.1 而不是 2.2.0

/usr/local/rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/bundler-1.12.3/lib/bundler/spec_set.rb:95:
in `block in materialize': Could not find active_attr-0.8.5 in any of the sources (Bundler::GemNotFound)

但是,它应该已切换到 Puma 3.2/ruby 2.2.0。当我强制杀死 puma 时,它会以正确的版本(在本例中为 Puma 3.2)重新启动(通过监视器)

vagrant@vagrant-master:/mnt/code/shared/tmp/pids$ kill -9 5466

vagrant@vagrant-master:/mnt/code/shared/tmp/pids$ ps -ef | grep -i puma
vagrant  17834     1  0 21:04 ?        00:00:00 puma 3.2.0 (unix:///mnt/code/shared/tmp/sockets/code-puma.sock) [20160510205440]                                                                                                                                                                                                                                                        
vagrant  17837 17834 90 21:04 ?        00:00:01 puma: cluster worker 0: 17834 [20160510205440]   

部署日志中的相关行:

DEBUG [07f95004] Running /usr/bin/env [ -f /mnt/code/shared/tmp/pids/puma.pid ] as vagrant@vagrant-master
DEBUG [07f95004] Command: [ -f /mnt/code/shared/tmp/pids/puma.pid ]
DEBUG [07f95004] Finished in 0.007 seconds with exit status 0 (successful).

DEBUG [42d98483] Running /usr/bin/env kill -0 $( cat /mnt/code/shared/tmp/pids/puma.pid ) as vagrant@vagrant-master
DEBUG [42d98483] Command: kill -0 $( cat /mnt/code/shared/tmp/pids/puma.pid )
DEBUG [42d98483] Finished in 0.007 seconds with exit status 0 (successful).

INFO [e81875a3] Running RBENV_ROOT=/usr/local/rbenv RBENV_VERSION=2.2.0 /usr/local/rbenv/bin/rbenv exec bundle exec pumactl -S /mnt/code/shared/tmp/pids/puma.state restart as vagrant@vagrant-master
DEBUG [e81875a3] Command: cd /mnt/code/current && ( export PATH="/usr/local/rbenv/shims:/usr/local/rbenv/bin:$PATH" RBENV_ROOT="/usr/local/rbenv" RBENV_VERSION="2.2.0" RACK_ENV="vagrant" ; RBENV_ROOT=/usr/local/rbenv RBENV_VERSION=2.2.0 /usr/local/rbenv/bin/rbenv exec bundle exec pumactl -S /mnt/code/shared/tmp/pids/puma.state restart )
DEBUG [e81875a3]    Command restart sent success

这是我在 capistrano 中 puma 配置的一部分

set :puma_bind,       "unix://#shared_path/tmp/sockets/#fetch(:application)-puma.sock"
set :puma_state,      "#shared_path/tmp/pids/puma.state"
set :puma_pid,        "#shared_path/tmp/pids/puma.pid"
set :puma_preload_app, false
set :puma_prune_bundler, true

如何在不终止 puma 进程的情况下部署 ruby​​-version 和 puma-version 更改?为什么 puma 开头版本不对?

谢谢

【问题讨论】:

FWIW,运行 bundle exec cap puma:restart 或 bundle exec cap puma:phased-restart 没有帮助 - 执行这些命令后它仍然运行错误的版本。 cap puma:halt puma:start 似乎可以让 puma 重新启动,但它并非无懈可击 【参考方案1】:

检查puma.rb 配置文件是否指定puma.pidpuma.state 路径:

pidfile '/mnt/code/shared/tmp/pids/puma.pid'
state_path '/mnt/code/shared/tmp/pids/puma.state'

同时检查 deploy/production.rb 是否指定路径:

set :puma_state,      "#shared_path/tmp/pids/puma.state"
set :puma_pid,        "#shared_path/tmp/pids/puma.pid"

我遇到了类似的问题,设置后效果很好。

【讨论】:

我有这两个设置 - 通常部署重启 puma 工人就好了,但升级 ruby​​ 和 puma 没有。

以上是关于Capistrano在升级ruby版本和puma时重启错误版本的puma的主要内容,如果未能解决你的问题,请参考以下文章

Capistrano + Puma + Apache

Capistrano 3:运行自定义 shell 命令时无法识别捆绑器

ruby Capistrano部署策略支持git子模块(需要Capistrano v3.1.0或更高版本)

如何配置 capistrano 以使用我的 rvm 版本的 Ruby

升级弹性 beantalk 堆栈时,Rails 应用程序无法部署

Capistrano自动化部署工具安装详细过程