Jerome
Jerome

Reputation: 6217

Cron job not being updated by whenever gem

Having a series of rake tasks that should be translated by the whenever gem into the cron file, I was wondering why the takes shows were pointing to an old release.

It cannot be asserted that whenever is active somehow, even though it is listed in the gem file (and associated lock file) and deployment refers to whenever in the deployment as follows:

tar: DEBUG [1f7d4e56]   bin/whenever: time stamp 2016-01-08 15:01:20 is 88.787104175 s in the future

update Checking bundle exec whenever -v returns the proper version. Need bundle exec there...

Capfile includes require "whenever/capistrano" after calls to bundler and rails.

require 'capistrano/bundler'
require 'capistrano/rails'
require 'whenever/capistrano'

Note: this is being tested in development mode.

Upvotes: 2

Views: 1424

Answers (3)

lugolabs
lugolabs

Reputation: 589

If you're not happy with the whenever/capistrano, you can create yourself a simple Capistrano task to update the cron jobs:

namespace :deploy do
  desc "Update crontab with whenever"
  task :update_cron do
    on roles(:app) do
      within current_path do
        execute :bundle, :exec, "whenever --update-crontab #{fetch(:application)}"
      end
    end
  end

  after :finishing, 'deploy:update_cron'
end

The task will be called when the code deployment is finished.

Upvotes: 0

Jerome
Jerome

Reputation: 6217

Functional answer. The instructions are misleading If you don't need different jobs running on different servers in your capistrano deployment, then you can safely stop reading now and everything should just work the same way it always has. Keep on reading.

The nugget is nested after this statement. Roles default to [:db]. Thus two sources of error are possible:

  1. different job_roles on different machines are not specified in schedule.rb
  2. Check your environment file. If "db" is not listed, whenever will not fire.

Upvotes: 1

Vitaly Stanchits
Vitaly Stanchits

Reputation: 688

I had the same issues with using Capistrano whenever plugin, I solved it by making custom deploy shell scripts, cap production deploy being one command of many, and then inclding cap production cron:regen; inside this script I called deploy.sh, with the command inside the deploy.rb being:

namespace :cron do
  desc "restart cron"

  task :regen do
     on roles(:app) do |host|
       rails_env = fetch(:stage)
       execute_interactively "crontab -r;bundle exec whenever --update-crontab;crontab -l;"
    end
  end
end

def execute_interactively(command)
   port = fetch(:port) || 22
   exec "ssh root@#{fetch(:ip)} -t 'cd SERVER_PATH_OF_YOUR_APP && #{command}'"
end

I use these functions for all types of different commands, since Capistrano still gives me problems with a lot of native plugins it uses.

Upvotes: 0

Related Questions