【Ruby on Rails】capistranoによる自動デプロイ環境でタスクを定期実行させたい
状況
何らかのバッチ処理を本番サーバーで定期実行させたい。capistranoによる自動デプロイのついでにバッチ処理の設定もしてしまいたい。
前提
- Ruby on Rails
- capistrano
- whenever
方法
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が実行されることになる。
雑感
わかってしまえばシンプルに記述できるが、わかるまでが大変。