在我们的登台服务器上,我们在生产环境中运行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。然后,我可以访问schedule.rb中的@stage
答案 0 :(得分:5)
不确定这是否有效但值得一试(来自whenever readme)
# 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
环境变量
答案 1 :(得分:1)
NoMethodError: undefined method 'defer' for main:Object
方法似乎不适用于Capistrano(3.4.1)/ when(0.9.7)的更高版本。我在set :whenever_environment, Proc.new { fetch :stage }
遇到了错误。这对我有用:
deploy.rb:
if @environment == 'production'
every 15.minutes, roles: [:my_custom_role] do
rake 'my_rake_task'
end
end
schedule.rb:
@Value("${registry.retrieveserviceurl:'http://localhost:8090/registry/rest/retrieveServiceInfo'}")
String registryRetrieveServicesUrl;
@Value("${registry.errorserviceurl:'http://localhost:8090/registry/rest/notifyError'}")
String registryErrorUrl;
答案 2 :(得分: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"
要求'每当/ capistrano,'你负责在部署后运行:finalize_update。
https://github.com/javan/whenever/blob/master/lib/whenever/capistrano/v2/hooks.rb