環境
- Ruby: 2.5.7
- Rails: 5.2.4
- 本番環境:AWS EC2/MySQL2/Nginx/Puma/Linux(CentOS)
前提
- Capistrano導入済み
本番環境で動かす
1. wheneverを本番環境にセッティング
- config/schedule.rb
env :PATH, ENV['PATH']
# ログファイルの出力先
set :output, 'log/cron.log'
# ジョブの実行環境の指定
set :environment, :production ★ ここ変更
# 日本時間の午前8:00にメール送信される(JSTは+9:00なので-9:00の時間を記述)
# 未読通知が3件以上たまっているユーザーにメール通知
every 1.days, at: '11:00 pm' do
runner "ScheduledProcessingMailer.check_notice_mail.deliver_now"
endb
実行環境はprodaction環境がデフォルト設定なのでset :environment, :development
を下記に変更
2. config.application.rbに追記
- config.application.rb
config.paths.add 'lib', eager_load: true
Rails5からデフォルトで本番環境時においてはautoloadが無効化されておりeager load(rails起動時にまとめて読み込む機能)が有効で、開発環境では逆にautoloadが有効でeager loadが無効になっている
ため。
こちらの記事を参考にさせていただきました。
Rails5のproduction環境でlib/配下のクラス読込みがNameErrorになるのはautoloadが無効化されたからだった
3. EC2current上で下記実行
# 定時処理の内容更新を反映
RAILS_ENV=production bundle exec whenever --update-crontab
# 無効化
RAILS_ENV=production bundle exec whenever --clear-crontab
# cronのログ確認
RAILS_ENV=production crontab -l
ちなみに開発環境ではlog/cron.logでログが確認できたが本番環境では出力されない(当たり前)
Capistranoでwheneverをセットする
1. Capfile
require 'whenever/capistrano'
2. config/deploy.rb
set :whenever_roles, ->{ :app }
3. 開発環境でcapコマンドを実行
bundle exec cap production deploy