2016年6月23日木曜日

【Rails4.2.6】wheneverを使ってバッチ処理をcronで管理する

  • 公開日: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に記述します。

Gemfile

# Use whenever as the cron library
gem 'whenever', :require => false

gemをinstallします。

terminal

cd {project_folder}

bundle install

必要なファイルをプロジェクト内で生成します。

terminal

cd {project_folder}

bundle exec wheneverize .
[add] writing `./config/schedule.rb'
[done] wheneverized!

以上で準備は完了です。

schedule.rbにバッチの設定

wheneverのインンストール時に作成された config/schedule.rb に設定を記述します。

サンプルを用意します。用意したサンプルのバッチ処理を手動実行する場合は

terminal

cd /home/webapp/rails/current

bundle exec rails runner Tasks::Log.execute

のように実行します。
currentはcapistranoを使ってdeployをすると作成されるフォルダです。

また、このバッチ処理はrailsで


lib/tasks/****.rb

に配置します。

このバッチ処理を1日1回夜の23時に実行する処理をwheneverで実現します。
その場合は、以下のように記述します。

{project_folder}/config/schedule.rb

# ログ出力先ファイルを指定
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に追記します。

{project_folder}/Capfile

require 'whenever/capistrano'

config/deploy.rbにも追加します。

{project_folder}/config/deploy.rb

# whenever setting
set :whenever_identifier, ->{ "#{fetch(:application)}_#{fetch(:stage)}" }

以上で準備は完了です。

capistranoの実行

上記までの設定を終えたら、いつものcapistranoコマンドでdeployが実行できます。
まずはいつものようにcheckコマンドでdeployができることを確認してください。
ここではステージングを利用します。

terminal

cd {project_folder}

bundle exec cap staging deploy:check

INFO [d3c1e527] Finished in 0.069 seconds with exit status 0 (successful).

checkが通ったら、deploy前に現在のcronの状態を確認しておきます。

terminal

crontab -l
no crontab for vagrant

現在はcronの設定がありません。では、deployを実行してみましょう。

terminal

cd {project_folder}

bundle exec cap staging deploy

INFO [d3c1e527] Finished in 0.069 seconds with exit status 0 (successful).

deployに成功したら、deploy後のcronの状態を確認します。

terminal

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でプロビジョニングするよりも、管理もしやすいと思います。

以上。

PICK UP オススメ書籍

運営サイト(railsで作成しています)


参考サイト

参考記事

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...