Read more

whenever: Installing cron jobs only for a given Rails environment or Capistrano stage

Henning Koch
June 04, 2020Software engineer at makandra GmbH

We use the whenever Show archive.org snapshot gem to automatically update the crontab of the servers we deploy to. By default, whenever will update all servers with a matching role (we use the :cron role ).

Illustration UI/UX Design

UI/UX Design by makandra brand

We make sure that your target audience has the best possible experience with your digital product. You get:

  • Design tailored to your audience
  • Proven processes customized to your needs
  • An expert team of experienced designers
Read more Show archive.org snapshot

This card describes how to install some tasks only for a given Rails environment or for a given Capistrano stage ("deployment target").

Installing jobs only for a given Rails environment

In your schedule.rb you may use environment variable to access the Rails environment of the current deployment:

if environment == 'staging'
  every :day do
    # Setup job that will only run for Rails environment "staging"
  end
end

You may test the cron output like this (no changes will be made to your crontab):

bundle exec whenever --set environment=staging
bundle exec whenever --set environment=production

Installing jobs only for a given Capistrano stage

In some apps we have custom capistrano stages like this:

customer1-staging
customer1-production
customer2-staging
customer2-production  

Installing a job for only some of these stages requires a little more code.

First, in our deploy.rb we extend the default environment variables Show archive.org snapshot for the whenever command. The following will make the capistrano stage available as an environment variable named STAGE:

set :whenever_command_environment_variables, ->{ fetch(:default_env).merge(rails_env: fetch(:whenever_environment), stage: fetch(:stage)) }

You may now access ENV['STAGE'] in your schedule.rb:

if ENV['STAGE'] == 'customer1-staging'
  every :day do
    # Setup task that will only run for Capistrano stage "customer1-staging"
  end
end

You may test the cron output like this (no changes will be made to your crontab):

STAGE=customer1-staging bundle exec whenever
STAGE=customer2-staging bundle exec whenever
Posted by Henning Koch to makandra dev (2020-06-04 12:34)