25
24

More than 3 years have passed since last update.

Railsで定期的に実行したい処理を、rakeタスクを使って実装する。(おまけ:Wheneverとの連携)

Last updated at Posted at 2020-03-08

「Railsで定期的に実行したい処理を、lib/tasks以下のディレクトリに、rakeタスクを作成して処理を記述することが多い。」という話を聞いてrakeタスク??となったので、調べました。
以下にまとめて記載します。

そもそもrakeとは

rake:Rubyで書かれたコードをタスクとして作成しておき、必要に応じて呼び出し実行する事が出来る機能です。

rakeタスク

アプリケーションを起動せず、行いたい処理をCUI(コマンドプロンプトやターミナル)から実行でき、サーバーを起動せず任意の処理を実行できます。
つまり、冒頭のコメントにある”Railsで定期的に実行したい処理”をrakeタスクを作成して処理するというのは、例えば、以下のようなときに使えます。

  • 何かしらのデータの連携
  • データベースのバックアップ
  • 定期的にデータを更新、削除する

rakeタスクの使い方

1.Rakeタスクファイルを生成

まず、処理を記載するためのrakeファイルを作成します。

ターミナル
$ rails g task ファイル名

上記コマンドを実行するとlib/tasks以下のディレクトリにファイルが生成されます。
それでは、早速処理の内容を記述していきましょう。

2.処理内容の記述

今回は例として以下の記述を入れます。
処理内容:ユーザーが入店したかどうかを管理する"enterd_flag"というカラムをfalseにする

処理内容の記述箇所
namespace:生成したファイル名を記述します。*今回、以下では[user]とします。
desc:実行する処理の説明を記述します。
task:タスクの名前を記述します。

lib/tasks/ファイル名
#モデルにアクセスする場合は :environmentの指定が必要です。
namespace :user do
  desc "ユーザーの入店情報をリセットする"
  task reset_entered_flag: :environment do
    User.update_all(entered_flag: false)
  end
end

3.処理の実行

この処理を実行するには、以下のようにターミナルでコマンド入力することで実行できます。

ターミナル
#rake [namespeceの名前]:[taskの名前]
$ rake user:reset_entered_flag

追加機能(定期的な処理を行うとき)/gem:wheneverの使用

今回のような処理を定期的に実行するときにはgem:wheneverを使うと実装できます。
wheneverはcrontab管理ライブラリです。
Crontab:UNIX系のOS(Linux,Macなど)で使えるcronを動かすためのコマンド。
Cron:UNIX系のOS(Linux、Macなど)でタイミングを指定しておき、そのタイミングになったら、このプログラムを動かしてくれるもの
詳細は、以下確認ください。
https://wa3.i-3-i.info/word11748.html

1.wheneverのインストール

gemfile
gem 'whenever', require: false
 =>bundle install

*アプリケーションから使わないgemは require: false を付けます。
例えばcapistrano、rubocop、unicorn 等、今回もアプリケーションから使用しないため、require: false をつけます。
メリット
- 読み込まないようにして起動を少しでも早くする
- 想定外の挙動を減らす

2.whenever設定ファイルschedule.rbを作成

まず、wheneverの設定するファイルを作成します。

ターミナル
$ bundle exec wheneverize
> [add] writing `./config/schedule.rb'
> [done] wheneverized! 

作成できたら、以下のように記述をしていきましょう。
実行するものは以下のいずれかを使用することで実行できます。
- command: bashコマンド実行
- rake: rakeタスク実行
- runner: Rails内のメソッド実行

- script: scriptの実行

schedule.rb(例)
# 出力先のログファイルの指定
set :output, 'log/crontab.log'
# ジョブの実行環境の指定
set :environment, :production

# 3時間毎に実行するスケジューリング
every 3.hours do
  rake 'my:rake:task'
end

3.Crontabへの設定

上記で設定した内容をCromtabに設定しましょう。

ターミナル
$ bundle exec whenever --update-crontab

以上で設定完了です。
Capistranoで本番環境にも簡単に設定できるようですので、気になる方は以下の参照ご確認の上、ご対応ください!

参照

【Ruby on Rails】Rakeタスクを使えば様々な処理が自動化出来る?(初心者向け)
https://opiyotan.hatenablog.com/entry/rails-rake-task

javan/whenever
https://github.com/javan/whenever

Wheneverは導入が超簡単なcrontab管理ライブラリGemです![Rails 4.2 x Ruby 2.3]
https://morizyun.github.io/blog/whenever-gem-rails-ruby-capistrano/index.html#Corntab%E3%81%B8%E3%81%AE%E8%A8%AD%E5%AE%9A

gemのwheneverを導入してみた
http://shiro-16.hatenablog.com/entry/2015/02/17/000715

Railsで定期的にバッチ回す「Whenever」
https://qiita.com/yumiyon/items/388fbb84450f49a6ab0d

以上となります。最後までご覧いただき、ありがとうございました!
今後も学習した事項に関してQiitaに投稿していきますので、よろしくお願いします!
記述に何か誤りなどございましたら、お手数ですが、ご連絡いただけますと幸いです。

25
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
24