为什么 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
开头,映射将不再有效。
我最近注意到 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
开头,映射将不再有效。