- 公開日:2016年06月23日
記事概要
Railsアプリでwheneverを使ってクーロンバッチを導入する方法をまとめた記事です。
環境
- rbenv
- bundler
- rails 4.2.6
- ruby 2.3.1
- whenever 0.9.7
- capistrano 3.2.1
whenever
wheneverはrailsでcronの設定ができるライブラリです。
railsで作成したバッチの数が増えてきたら、導入を検討すると良いと思います。
素晴らしいことに、wheneverを使っても既存のcronが変更されることはありません。
wheneverで管理するcronは、wheneverで設定しているcron処理のみが対象となります。
capistranoの自動delployにも対応しているので、リリースの自動化に使うのもオススメです。
wheneverインストール
wheneverのGemを導入するためにGemfileに記述します。
# Use whenever as the cron library gem 'whenever', :require => false
gemをinstallします。
cd {project_folder} bundle install
必要なファイルをプロジェクト内で生成します。
cd {project_folder} bundle exec wheneverize . [add] writing `./config/schedule.rb' [done] wheneverized!
以上で準備は完了です。
schedule.rbにバッチの設定
wheneverのインンストール時に作成された config/schedule.rb に設定を記述します。
サンプルを用意します。用意したサンプルのバッチ処理を手動実行する場合は
cd /home/webapp/rails/current bundle exec rails runner Tasks::Log.execute
のように実行します。
currentはcapistranoを使ってdeployをすると作成されるフォルダです。
また、このバッチ処理はrailsで
lib/tasks/****.rb
に配置します。
このバッチ処理を1日1回夜の23時に実行する処理をwheneverで実現します。
その場合は、以下のように記述します。
# ログ出力先ファイルを指定 set :output, "log/cron_log.log" # ジョブ実行環境を指定 # 事故防止の為RAILS_ENVの指定が無い場合にはdevelopmentを使用する rails_env = ENV['RAILS_ENV'] || :development set :environment, rails_env every 1.day, :at => '11:00 pm' do runner "Tasks::Log.execute" end
これでバッチの設定は完了です。
capistranoの設定
wheneverをcapistranoのdeploy時に反映されるようにします。
wheneverを反映させるもっともシンプルな方法は、railsアプリをリリースしたサーバーにログインして
RAILS_ENV=development bundle exec whenever --update-crontab
とすることです。しかし、capistranoを使えば自動化できるので、ここでは自動化にします。
コマンドの打ち忘れや、実行ミスを防ぐためにもなるべく自動化をすることが望ましいです。
まずCapfileに追記します。
require 'whenever/capistrano'
config/deploy.rbにも追加します。
# whenever setting set :whenever_identifier, ->{ "#{fetch(:application)}_#{fetch(:stage)}" }
以上で準備は完了です。
capistranoの実行
上記までの設定を終えたら、いつものcapistranoコマンドでdeployが実行できます。
まずはいつものようにcheckコマンドでdeployができることを確認してください。
ここではステージングを利用します。
cd {project_folder} bundle exec cap staging deploy:check INFO [d3c1e527] Finished in 0.069 seconds with exit status 0 (successful).
checkが通ったら、deploy前に現在のcronの状態を確認しておきます。
crontab -l no crontab for vagrant
現在はcronの設定がありません。では、deployを実行してみましょう。
cd {project_folder} bundle exec cap staging deploy INFO [d3c1e527] Finished in 0.069 seconds with exit status 0 (successful).
deployに成功したら、deploy後のcronの状態を確認します。
crontab -l # Begin Whenever generated tasks for: app_staging 0 23 * * * /bin/bash -l -c 'cd /home/webapp/rails/releases/20160622052039 && bundle exec bin/rails runner -e staging '\''Tasks::Log.execute'\'' >> log/cron_log.log 2>&1'
きっちりと設定できています。
まとめ
wheneverを利用してバッチ処理を管理すると、実装ミスやリリースミスを防ぐことができます。
また、cron変更のたびにchefでプロビジョニングするよりも、管理もしやすいと思います。
以上。
0 件のコメント:
コメントを投稿