为什么 Capistrano 运行 命令不同

Why does Capistrano run a command differently

我最近注意到 Capist运行o 有一些奇怪的东西。但在我解释之前,让我提供一些关于它的确切来源的信息。

作为在每次部署时更新我的​​ crontab 的一部分。我决定使用 whenever/capistrano 食谱。

但出于某种原因(我不知道,但我在 github 中看到 issue 描述相同)。每次我尝试这样做时,我都会看到以下错误。

"数据库配置没有指定适配器"

重要的一点。这里命令的样子

INFO [a558a04a] Running ~/.rvm/bin/rvm 2.2.2@thrasher do bundle exec whenever --update-crontab thrasher --set environment=production --roles=app,web,db as deploy@x.x.x.x
DEBUG [a558a04a] Command: cd /home/deploy/project-scp/thrasher/releases/20160129130817 && ~/.rvm/bin/rvm 2.2.2@thrasher do bundle exec whenever --update-crontab thrasher --set environment=production --roles=app,web,db
DEBUG [a558a04a]    scheduling frequent upload job
scheduling daily upload job
DEBUG [a558a04a]    [write] crontab file updated
INFO [a558a04a] Finished in 2.411 seconds with exit status 0 (successful).

请记下命令。

~/.rvm/bin/rvm 2.2.2@thrasher do bundle exec whenever ...

现在,为了解决这个问题。我 设置 whenever_command,一个 capist运行o 变量看起来像这样。

set :whenever_command,["RAILS_ENV=#{fetch(:stage)",:bundle,:exec,:whenever]

还有...

当我再次 运行 资本家运行o 时,我看到了这个。

Running /usr/bin/env RAILS=production bundle exec whenever --update-crontab thrasher --set environment=production --roles=app,web,db as deploy@x.x.x.x
DEBUG [b67e3351] Command: cd /home/deploy/project-scp/thrasher/releases/20160129131301 && /usr/bin/env RAILS=production bundle exec whenever --update-crontab thrasher --set environment=production --roles=app,web,db

执行的命令是

/usr/bin/env RAILS=production bundle exec whenever ...

问题:

为什么第 2 次命令看起来不是这样。

~/.rvm/bin/rvm 2.2.2@thrasher do RAILS_ENV=production bundle exec whenever

注:

Rails 4.0.4

Capistrano Version: 3.4.0 (Rake Version: 10.5.0)

Ruby ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin14]

也在使用

capistrano/rvm

更新:

按照@will_in_wi的回答。为了解决 whenever 问题,我也尝试这样做。(在 deploy.rb 文件中。)

namespace :deploy do
   ...
   ...
   before "whenever:update_crontab", "deploy:set_rails_env"

end

在没有看到您的 Capfile 的情况下,您可能需要启用 capistrano/rails 的某些子集。这就是强制设置 RAILS_ENV 的原因:https://github.com/capistrano/rails/blob/master/lib/capistrano/tasks/set_rails_env.rake

简短回答:将环境变量放在 :whenever_command 中不是正确的方法。根据 whenever/capistrano 代码,您应该使用 :whenever_command_environment_variables.

删除你的 :whenever_command 并试试这个:

set :whenever_command_environment_variables, -> { { :rails_env => fetch(:stage) } }

长答案:您正在使用 capistrano/rvm,它对 Capistrano 的 "command map" 有一些魔力,可以自动为 某些 命令添加前缀 ~/.rvm/bin/rvm...。例如,这些特定命令之一是 bundle。如果将 whenever 命令更改为不再以 :bundle 开头,映射将不再有效。