4

在我们的登台服务器上,我们在生产环境中运行我们的 Rails 应用程序,以便尽可能与我们的生产服务器相似。我们使用任何时候来创建我们的 crontab。但是,我们需要为站点地图生成运行一个稍微不同的 rake 任务,这样它就不会 ping Google 和 Bing。

在 deploy.rb 中,我们有: set :stages, %w(production staging),但是在 deploy/staging.rb 和 deploy/production.rb 我们都:rails_env, "production"设置了,所以我不能使用Rails.env.

schedule.rb,我想做类似的事情:

every :day, at: '1am' do
  if @stage == 'production'
    rake 'sitemap:refresh'
  else
    rake 'sitemap:refresh:no_ping'
  end
end

如何使该变量可用?

更新

我能够通过放置来解决它

set :whenever_variables, defer { "stage=#{stage}" }

进入我的 deploy/staging.rb。然后我可以访问@stageschedule.rb

4

3 回答 3

5

不确定这是否可行,但值得一试(来自无论何时自述文件

# deploy.rb
set :whenever_environment, defer { stage }
require "whenever/capistrano"

然后在你的 schedule.rb

set :environment, ENV['RAILS_ENV']

case environment
when 'production', 'staging'
  ...
when 'production'
  ...
when 'staging'
  ...
end

更新:您也可以使用

set(:whenever_command) { "STAGE=#{stage} bundle exec whenever" }

这样您就可以访问STAGE内部的环境变量schedule.rb

于 2013-03-01T06:10:48.973 回答
1

defer方法似乎不适用于 Capistrano (3.4.1) / 无论何时 (0.9.7) 的更高版本。我遇到了一个错误NoMethodError: undefined method 'defer' for main:Object。这对我有用:

部署.rb:

set :whenever_environment, Proc.new { fetch :stage }

时间表.rb:

if @environment == 'production'
  every 15.minutes, roles: [:my_custom_role] do
    rake 'my_rake_task'
  end
end
于 2016-11-15T23:26:21.827 回答
0

@jvnill 有正确的答案。如果您将 config/deploy/ 用于单独的环境,则可以通过将设置放在适当的阶段来保持它的整洁。

# config/deploy/staging.rb
set :whenever_command, "STAGE=#{stage} bundle exec whenever"

# config/deploy/production.rb
set :whenever_command, "STAGE=production bundle exec whenever"

# config/deploy.rb
require "whenever/capistrano"

通过要求 'whenever/capistrano',您需要在 deploy:finalize_update 之后运行whenever。

https://github.com/javan/whenever/blob/master/lib/whenever/capistrano/v2/hooks.rb

于 2014-04-12T16:45:39.200 回答