Open
Description
I've been using whenever for years, mostly under capistrano 2, without a hitch. It's been a really great experience - thank you!
I'm deploying a Rails app with capistrano 3 right now, and I'm really confused about how to get multiple environments on a single server to play well with each other. I have two environments, staging
and production
, on one server, and they keep clobbering each other.
- If I deploy
staging
, then all of the cronjobs are removed and replaced with jobs referencing thestaging
release path and environment. All of theproduction
jobs are gone. - If I deploy
production
, then all of the cronjobs are removed and replaced with jobs referencing theproduction
release path and environment. All of thestaging
jobs are gone. - If I do a
case
statement inschedule.rb
on@environment
, and only have jobs set for awhen 'production'
situation, then whenstaging
is deployed it completely clears the cronjobs. All of the jobs are gone.
I need to get to either of these two situations:
- Have two sets of jobs (one for
staging
and one forproduction
) that each persist through either environment's deploy (so, in my example at the bottom, there would be two jobs listed - one for thestaging
release and one for theproduction
release) - One set of jobs (just for
production
) that persists through either environment's deploy (so, thestaging
deploy should not remove it)
Can you explain how this is done?
I've included my current configuration, below, in case it's helpful.
Capfile
require 'whenever/capistrano'
config/deploy/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)}" }
config/deploy/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)}" }
config/schedule.rb
set :output, '/log/cron.log'
every 10.minutes do
runner 'ModelName.method_name'
end
the resulting cronjob after a staging
deploy
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'