Capistrano и всякий раз, когда переменные стадии

На нашем промежуточном сервере мы запускаем наше приложение Rails в производственной среде, чтобы оно было как можно ближе к нашему производственному серверу. Мы используем каждый раз, чтобы создать наш crontab. Однако для генерации карты сайта нам нужно запустить немного другую задачу rake, чтобы она не пинговала 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. Я тогда имел доступ к @stage в schedule.rb

3 ответа

Не совсем уверен, что это будет работать, но стоит попробовать (из 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

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

У @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

Другие вопросы по тегам