我有两个环境,staging
并且production
,在一台服务器上,使用 capistrano 3 进行部署。每个环境的部署相互冲突,完全取代了另一个环境的工作。
- 如果我 deploy
staging
,那么所有的 cronjobs 都会被删除并替换为引用staging
发布路径和环境的作业。所有production
作业都被删除。 - 如果我 deploy
production
,那么所有的 cronjobs 都会被删除并替换为引用production
发布路径和环境的作业。所有staging
作业都被删除。 - 如果我在on中做了一个
case
声明,并且只为某种情况设置了作业,那么在部署时它会完全清除 cronjobs。所有的工作都消失了。schedule.rb
@environment
when 'production'
staging
我需要达到以下两种情况之一:
- 有两组作业(一组 for
staging
和一组 forproduction
),每组作业都通过任一环境的部署持续存在(因此,在底部的示例中,将列出两个作业 - 一个用于staging
发布,一个用于production
发布) - 通过任一环境的部署持续存在的一组作业(仅用于
production
)(因此,staging
部署不应将其删除)
谁能解释这是如何完成的?我在下面包含了我当前的配置,以防万一。
版本
- 卡皮斯特拉诺:3.3.5
- 任何时候:0.9.4
- 红宝石:2.1.5
- 导轨:3.2.21
头文件
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)}" }
配置/时间表.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