cron設定をバージョン管理に含めることができるのでありがたいWheneverをOpsWorksで使ったときのメモです。
基本はデプロイフック(Chef デプロイフックの使用)を使うのですが、ポイントは
- OpsWorksアプリケーションの「Environment Variables」を引き継ぐようにする
whenever --update-cron
ではidentifierを指定する
の2点です。
1はそもそもコマンド実行に必要、2をしないとdeployの度にcrontabにどんどん追記されていってしまうことへの対策です。(デフォルトのidentifierはschedule.rbの絶対パス=リリースパスになるので実行毎に代わってしまう)
config/schedule.rb
# deploy時の環境変数を引き継ぐために書き出し ENV.each do |key, value| env key, value end job_type :runner, "cd :path && bundle exec ruby bin/rails runner -e :environment ':task' :output" every :day, :at => '04:00am' do runner 'CountingService.new(Date.yesterday).start' end
deploy/before_restart.rb
Chef::Log.info 'Running deploy/before_restart.rb' app_name = :yourappname rails_env = node[:deploy][app_name][:rails_env] # OpsWorks Railsアプリケーションの Rails environment env_hash = node[:deploy][app_name][:environment] # OpsWorks Railsアプリケーションの Environment Variables current_release = release_path # /srv/www/yourappname/releases/20150325052254/ execute 'whenever' do cwd current_release command "bundle exec whenever --update-cron #{app_name}_#{rails_env}" environment env_hash.merge(RAILS_ENV: rails_env) user 'deploy' group 'nginx' end