Как мне избежать, когда /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'
Другие вопросы по тегам