为什么Capistrano以不同的方式运行命令

时间:2016-01-29 13:46:09

标签: ruby capistrano capistrano3 whenever rvm-capistrano

我最近注意到卡皮斯特拉诺有些奇怪的东西。但在我解释之前,让我先从它的确切位置出发。

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

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

"数据库配置未指定适配器"

重要的一点。这里命令的外观如何

"onNetworkAvailable()"

请注意这个命令。

crontab

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

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).

而且......

当我再次运行capistrano时,我看到了这一点。

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

执行的命令是

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

问题:

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

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 ...

~/.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)

更新

按照@will_in_wi的回答。要解决Ruby ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin14]问题,我也尝试过这样做。(在capistrano/rvm文件中。)

whenever

2 个答案:

答案 0 :(得分:3)

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

删除:whenever_command并尝试此操作:

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

答案很长:你使用的是capistrano / rvm,它与Capistrano" s"命令图"使用~/.rvm/bin/rvm...自动为某些命令添加前缀。例如,这些特定命令之一是bundle。如果将when命令更改为不再以:bundle开头,则映射将不再有效。

答案 1 :(得分:0)

如果没有看到您的Capfile,您可能需要启用某些capistrano / rails子集。这将强制设置RAILS_ENV:https://github.com/capistrano/rails/blob/master/lib/capistrano/tasks/set_rails_env.rake