我在一台服务器上有两个环境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
部署不应将其删除)谁能解释一下这是怎么做到的? 我在下面列出了我当前的配置,以防它有用。
版本
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
部署
# 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
答案 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'