Как мне избежать, когда /capistrano перезаписывать задания для других сред?
У меня есть две среды, staging
а также production
на одном сервере, развернутом с помощью capistrano 3. Развертывания для каждой среды затирают друг друга, полностью заменяя задания другой среды.
- Если я разверну
staging
затем все cronjobs удаляются и заменяются заданиями, ссылающимися наstaging
путь выпуска и окружение. Всеproduction
рабочие места удалены. - Если я разверну
production
затем все cronjobs удаляются и заменяются заданиями, ссылающимися наproduction
путь выпуска и окружение. Всеstaging
рабочие места удалены. - Если я сделаю
case
заявление вschedule.rb
на@environment
и только рабочие места дляwhen 'production'
ситуация, то когдаstaging
развернут он полностью очищает cronjobs. Все рабочие места ушли.
Мне нужно добраться до любой из этих двух ситуаций:
- Есть два набора рабочих мест (один для
staging
и один дляproduction
) что каждый из них сохраняется при развертывании любой среды (поэтому в моем примере внизу будет указано два задания - одно дляstaging
релиз и один дляproduction
релиз) - Один набор рабочих мест (только для
production
), который сохраняется при развертывании любой среды (так,staging
Развертывание не должно удалять это)
Кто-нибудь может объяснить, как это делается? Я включил мою текущую конфигурацию ниже, на случай, если это будет полезно.
Версии
- Капистрано: 3.3.5
- всякий раз: 0.9.4
- ruby: 2.1.5
- рельсы: 3.2.21
Capfile
require 'whenever/capistrano'
Соответствующая строка в config/deploy/deploy.rb
set :application, 'application_name'
конфигурации / развернуть /production.rb
server '1.2.3.4', user: 'username', roles: %w{web app}
set :branch, 'master'
set :deploy_to, '/home/username/production'
set :rails_env, 'production'
set :stage, :production
set :whenever_environment, -> { fetch(:stage) }
set :whenever_identifier, -> { "#{fetch(:application)}_#{fetch(:stage)}" }
конфигурации / развернуть /staging.rb
server '1.2.3.4', user: 'username', roles: %w{web app}
set :branch, 'staging'
set :deploy_to, '/home/username/staging'
set :rails_env, 'staging'
set :stage, :staging
set :whenever_environment, -> { fetch(:stage) }
set :whenever_identifier, -> { "#{fetch(:application)}_#{fetch(:stage)}" }
конфиг /schedule.rb
set :output, '/log/cron.log'
every 10.minutes do
runner 'ModelName.method_name'
end
Полученный cronjob после staging
развертывание
# Begin Whenever generated tasks for: application_name
0,10,20,30,40,50 * * * * /bin/bash -l -c 'cd /home/username/staging/releases/20150317012814 && script/rails runner -e staging '\''ModelName.method_name'\'' >> /log/cron.log 2>&1'
# End Whenever generated tasks for: application_name
1 ответ
У вас нет каких-либо блоков комментариев, касающихся реальных заданий cron? У меня есть старое приложение Rails 3, которое использует это (и только это), и это работает. Может быть, это поможет:
config/deploy.rb:set :whenever_environment, defer { stage }
config/deploy.rb:set :whenever_identifier, defer { "#{application}_#{stage}" }
config/deploy.rb:set :whenever_command, 'bundle exec whenever'