Multiserver Whenever
Created by Chris Powers 12/7/2010
Provides the multiserver_whenever
command for generating host-specific crontabs with role-based whenever files. This is very handy for when you need to deploy different crontabs to different staging/production servers, but still want to leverage the whenever
gem’s DSL and build tools.
Learn all about the original whenever
gem at github.com/javan/whenever.
Installation
Just install the multiserver_whenever
gem per usual:
gem install multiserver_whenever
Generating Document Structure with MultiserverWheneverize
Taking off of the whenever
gem’s wheneverize
, this gem provides the multiserver_wheneverize
command to generate the initial file structure:
cd /path/to/your_app
multiserver_wheneverize
The generated file structure looks like:
- your_app/
- config/
- whenever.yml
- whenever/
- do_not_remove.rb
- example.rb
Configuration
The config/whenever.yml
file is a hash where the keys are server hostnames and the values are arrays of “roles”.
Let’s say that I have two servers with hostnames app_server
and db_server
. I need to set app-related crontabs on app_server
, db-related crontabs on db_server
and some shared crontabs on both. To do this, I will first create three whenever files in config/whenever
:
- your_app/
- config/
- whenever.yml
- whenever/
- app.rb
- db.rb
- do_not_remove.rb
- shared.rb
The contents of each of these files is regular whenever
code (see github.com/javan/whenever).
Then in our config/whenever.yml
file we map our hostnames to the cron roles:
---
app_server:
- app
- shared
db_server:
- db
- shared
Now when you run the multiserver_whenever
command on one of your servers, it will only apply the whenever
files that are specified in your config/whenever.yml
file.
Running multiserver_whenever
If you are using the whenever rake
and runner
commands, you may need to specify a Rails environment. It defaults to using production
, but you can simply pass a different environment to the multiserver_whenever
command instead:
multiserver_whenever staging
Deployment with Capistrano
In your Capistrano deployment code, you should be able to add something like this to run multiserver_whenever
on deployment:
namespace :whenever do
desc "Update your whenever-generated crontabs"
task :update do
run "cd #{release_path}; multiserver_whenever #{rails_env}"
end
after "deploy:update", "whenever:update"
end