2013-03-01 3 views
3

На нашем промежуточном сервере мы запускаем наше приложение Rails в производственной среде, чтобы быть как можно более похожими на наш производственный сервер. Мы используем всякий раз, когда создаем наш crontab. Тем не менее, нам нужно запустить немного другую задачу рейка для нашего создания Sitemap, чтобы он не пинговал Google и Bing.Capistrano и Whenever Stage Variables

В deploy.rb, мы имеем: set :stages, %w(production staging), но в обоих развертывания/staging.rb и развернуть/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 

Как я могу сделать эту переменную в наличии?

Update

Я был в состоянии решить эту проблему, поставив

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

в моей развертывания/staging.rb. то я имел доступ к @stage в schedule.rb

+0

Я получаю сообщение об ошибке - неопределенный метод 'Defer». Нужно ли включать что-либо другое, кроме как когда-либо/capistrano? –

+0

@VivekRao Я понял, что это решение, я разместил его как отдельный ответ ниже. – dmccabe

ответ

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" } 

, так что у вас есть acc ess в STAGE переменная среды внутри schedule.rb

+0

Проблема в том, что в нашем случае среда/RAILS_ENV всегда равна «производству». Мне нужно попасть на стадию капитанано. – Jason

+0

Я еще не пробовал это, но я думаю, что 'set: always_environment, defer {stage}' does - устанавливает ли всякий раз среду в значение 'stage'. – jvnill

+0

вы также можете попробовать мой обновленный ответ :) – jvnill

0

@jvnill имеет правильный ответ. Если вы используете конфигурацию/развертывание/для отдельных сред, вы можете сохранить ее немного аккуратно, поставив настройку на правильном этапе.

# 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

1

Метод defer не появляется на работе в более поздних версиях Capistrano (3.4.1)/если (0.9.7). Я ошибся с NoMethodError: undefined method 'defer' for main:Object. Вот что работает для меня:

deploy.rb:

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

schedule.rb:

if @environment == 'production' 
    every 15.minutes, roles: [:my_custom_role] do 
    rake 'my_rake_task' 
    end 
end 

 Смежные вопросы

  • Нет связанных вопросов^_^