如何/ capistrano覆盖其他环境的作业时如何保持?

时间:2015-03-17 13:22:29

标签: ruby-on-rails capistrano capistrano3 whenever whenever-capistrano

我在一台服务器上有两个环境stagingproduction,使用capistrano 3进行部署。每个环境的部署相互冲突,完全取代其他环境的作业。

  • 如果我部署staging,则会删除所有cronjobs并替换为引用staging版本路径和环境的作业。所有production个职位都已删除。
  • 如果我部署production,则会删除所有cronjobs并替换为引用production版本路径和环境的作业。所有staging个职位都已删除。
  • 如果我在case schedule.rb上执行了@environment声明,并且仅针对when 'production'情况设置了作业,则在部署staging时完全清除cronjobs。所有的工作都没了。

我需要了解以下两种情况之一:

  • 有两组作业(一个用于staging,一个用于production),每个作业都持续通过任一环境的部署(因此,在我的示例中,在底部,将列出两个作业 - 一个适用于staging版本,另一个版本适用于production版本
  • 通过任一环境的部署持续存在的一组作业(仅适用于production)(因此,staging部署不应将其删除)

谁能解释一下这是怎么做到的? 我在下面列出了我当前的配置,以防它有用。

版本

  • capistrano:3.3.5
  • 无论何时:0.9.4
  • ruby​​:2.1.5
  • rails: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

staging部署

后生成的cronjob
# 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 个答案:

答案 0 :(得分: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'