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