タケユー・ウェブ日報

Ruby on Rails や Flutter といったWeb・モバイルアプリ技術を武器にお客様のビジネス立ち上げを支援する、タケユー・ウェブ株式会社の技術ブログです。

OpsWorks + Whenever

cron設定をバージョン管理に含めることができるのでありがたいWheneverをOpsWorksで使ったときのメモです。

基本はデプロイフック(Chef デプロイフックの使用)を使うのですが、ポイントは

  1. OpsWorksアプリケーションの「Environment Variables」を引き継ぐようにする
  2. 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