LoginSignup
11
11

More than 3 years have passed since last update.

【Rails】gem wheneverによる本番環境のバッチ処理

Last updated at Posted at 2021-02-15

はじめに

今回が初投稿となります。
学習した内容をアウトプットしようと思いアカウントを作成したのですが、インプットに夢中になり全然アウトプットできていませんでした。。。
この投稿をきっかけに定期的にアウトプットしていきたいと思います。
初学者ですので間違い等あるかもしれません。
その際は、お手数ですがご指摘お願いします。

環境

  • Ruby 2.6.3
  • Rails 5.2.4
  • 本番環境 Nginx/Puma/Linux(CentOS)/AWS EC2/MySQL
    ※ Dockerは使っていませんので注意

目的

  • 本番環境でcounter_cacheのカウント修正を定時処理として行いたかった。(本記事ではcounter_cacheについては触れませんし、実行する処理も適当なものにしています)

目次

  • wheneverの導入
  • 自動化したい処理を記述
  • 設定ファイルの作成
  • 自動化した処理の確認
  • 設定を本番環境に変更する
  • 本番環境で処理を確認する

wheneverの導入

Gemfile
gem 'whenever', require: false

bundle install --path vendor/bundleを実行。

自動化したい処理を記述

app/libの配下にbatchディレクトリを作成し、その中に任意のファイルを作成して自動化したい処理を記述する。
ファイル名(hoge.rbの部分)は何でもいいです。

lib/batch/hoge.rb
class Batch::Hoge
  def self.fuga
    p "処理を実行しました"
  end
end

lib以下をロード対象とするためにconfig/application.rbに下記2行を追加。

config/application.rb

class Application < Rails::Application
  config.autoload_paths += Dir["#{config.root}/lib"]  # 追加
  config.eager_load_paths += Dir["#{config.root}/lib/**/"]  # 追加
end

実行されるか確認。

$ bundle exec rails runner Batch::Hoge.fuga
Running via Spring preloader in process [プロセスID]
"処理を実行しました"

設定ファイルの作成

bundle exec wheneverize .で設定ファイルを作成。

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

作成されたconfig/schedule.rbに設定を記述。
まずは開発環境で処理が実行されるか確認するためにdevelopmentを指定し、実行頻度を1分にしています。

config/schedule.rb
require File.expand_path(File.dirname(__FILE__) + "/environment")  # rootパス取得
set :environment, :development  # 実行環境の指定
set :output, "#{Rails.root}/log/cron.log"  # ログファイルの出力先
set :runner_command, "rails runner"

every 1.minute do
  runner "Batch::Hoge.fuga"
end

自動化した処理の確認

# 設定内容が問題ないか確認
bundle exec whenever
# crontabに反映する
$ bundle exec whenever --update-crontab
# crontabに反映した内容の確認
$ crontab  -l
# crontabに反映した内容を削除
$ bundle exec whenever --clear-crontab

設定を本番環境に変更する

問題がないことを確認したら設定を本番環境に変更する。

config/schedule.rb
require File.expand_path(File.dirname(__FILE__) + "/environment")
set :environment, :production  # 本番環境に変更
set :output, "#{Rails.root}/log/cron.log"
set :runner_command, "rails runner"

every 1.minute do
  runner "Batch::Hoge.fuga"
end

本番環境で処理を確認する

# 設定内容が問題ないか確認
$ RAILS_ENV=production bundle exec whenever
# crontabに反映する
$ RAILS_ENV=production bundle exec whenever --update-crontab
# crontabに反映した内容の確認
$ RAILS_ENV=production crontab  -l
# crontabに反映した内容を削除
$ RAILS_ENV=production bundle exec whenever --clear-crontab

参考にさせていただきました

ここまで見て頂きありがとうございました。
間違いがあった場合はご指摘頂けると嬉しいです。

11
11
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
11
11