技術メモ

書いておぼえるブログ

【Ruby on Rails】capistranoによる自動デプロイ環境でタスクを定期実行させたい

状況  

何らかのバッチ処理を本番サーバーで定期実行させたい。capistranoによる自動デプロイのついでにバッチ処理の設定もしてしまいたい。  

前提  

方法  

capistrano  

capistranoの設定ファイルにwheneverの設定を追記する。   

deploy.rbなどに以下を加える。

set :whenever_command, "bundle exec whenever"
require "whenever/capistrano"

環境を指定するには  

set :environments "production"

とすることでRAILS_ENV=production ~相当のcronジョブが生成される。stagingで実行したいときは置き換えること。   複数の環境を設定する方法があるとおもうが、わからなかった。

whenever

そしてschedule.rbに定期実行したいジョブを加える。

every 1.day, :at => '00:00 am' do
   runner "SomeStuff.new.delay.awesome_procedure"
   rake "jobs:work"
 end

runner "SomeStuff.new.delay.awesome_procedure"は、delayed_jobsにキューを入れる。 次のrake "jobs:work"でキュー入りしたジョブを取り出す。  

キューするときに実行タイミングを引数で指定できる。    

runner "SomeStuff.new.delay(run_at: 1.hour.from_now).awewome_procedure"

デキューされた1時間後にawesome_procedureが実行されることになる。  

雑感

わかってしまえばシンプルに記述できるが、わかるまでが大変。