##はじめに
今回が初投稿となります。
学習した内容をアウトプットしようと思いアカウントを作成したのですが、インプットに夢中になり全然アウトプットできていませんでした。。。
この投稿をきっかけに定期的にアウトプットしていきたいと思います。
初学者ですので間違い等あるかもしれません。
その際は、お手数ですがご指摘お願いします。
##環境
- Ruby 2.6.3
- Rails 5.2.4
- 本番環境 Nginx/Puma/Linux(CentOS)/AWS EC2/MySQL
※ Dockerは使っていませんので注意
##目的
- 本番環境でcounter_cacheのカウント修正を定時処理として行いたかった。(本記事ではcounter_cacheについては触れませんし、実行する処理も適当なものにしています)
##目次
- wheneverの導入
- 自動化したい処理を記述
- 設定ファイルの作成
- 自動化した処理の確認
- 設定を本番環境に変更する
- 本番環境で処理を確認する
##wheneverの導入
gem 'whenever', require: false
bundle install --path vendor/bundle
を実行。
#自動化したい処理を記述
app/lib
の配下にbatch
ディレクトリを作成し、その中に任意のファイルを作成して自動化したい処理を記述する。
ファイル名(hoge.rb
の部分)は何でもいいです。
class Batch::Hoge
def self.fuga
p "処理を実行しました"
end
end
lib
以下をロード対象とするためにconfig/application.rb
に下記2行を追加。
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分にしています。
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
##設定を本番環境に変更する
問題がないことを確認したら設定を本番環境に変更する。
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
##参考にさせていただきました
- [【Rails】whenever によるバッチ処理(runner編)]
(https://qiita.com/syukan3/items/eef3f8929ecb5d6ef6ff) - Railsのproduction環境でrunnerがエラーになる問題
- whenever GitHub
- config/schedule.rbのrequireメモ
ここまで見て頂きありがとうございました。
間違いがあった場合はご指摘頂けると嬉しいです。