自分にやさしく学ぶプログラミング

プログラミング学習記録、備忘録

メモ:Rails で whenever を使うときのschedule.rbの記述

概要

Railsアプリで定期的にrakeタスクを実行するみたいなことをしたくて、wheneverを入れてcronを設定したんですが、wheneverのREADMEの最初の例とか、wheneverize直後のサンプルそのままだと意図通りに実行されませんでした。
schedule.rbに適宜設定を追加すればいいのですが、いつも何を設定すればいいのか忘れてしまう(かつ、設定すべき内容は環境によって多分異なる)ので、備忘録として書き留めておきます。

参考URL

本記事の内容は、下記の記事の内容の複合みたいな感じです。

schedule.rbのサンプル

# Railsモジュールのメソッド使うために必須
require File.expand_path(File.dirname(__FILE__) + '/environment') 

# 使用したいjob_typeに、PATHの設定とrbenvの初期化の記述を入れておかないと、bundleコマンドが見つからなかったり、`Bundler::RubyVersionMismatch`が発生したりする
job_type :rake, "export PATH=\"$HOME/.rbenv/bin:$PATH\"; eval \"$(rbenv init -)\"; cd :path && RAILS_ENV=:environment bundle exec rake :task :output"

# rakeタスク内で日本語を扱う場合(?)、これがないと`encoding::UndefinedConversionError`が発生する
env 'LANG', 'ja_JP.UTF-8'

# デフォルトだとbashが呼ばれるので適宜変えとく
set :job_template, "/bin/zsh -c ':job'"

# デフォルトはproduction環境固定なので、少なくとも開発時はこれ必要
set :environment, Rails.env

# output指定しないとログが見れない
set :output, "#{Rails.root}/log/cron_tab.log"

every 10.minutes do
  rake 'hoge:fuga'
end

みたいな感じにすると意図通りタスクが実行されました🙌