その他
    ホーム 技術発信 DoRuby 【Rails】wheneverで出力されるコマンドで環境変数を使用する場合【whenever】
    【Rails】wheneverで出力されるコマンドで環境変数を使用する場合【whenever】
     

    【Rails】wheneverで出力されるコマンドで環境変数を使用する場合【whenever】

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    wheneverで環境変数を使いたくなった時に方法を模索していたのでメモ。

    環境変数を使用したい場合、通常は下記のように記述するかと思います。
    ※例:バッチを動かした後にあるディレクトリをrsyncで同期をとる
    schedule.rb:

    every 1.day, at: '0:00 am' do
      command("cd :path && :environment_variable=:environment bin/rake batch:batch_name && rsync -a -e \"ssh -p $PORT\" /path/aaa/ user_name@$IP:/path/aaa/ ")
    end
    

    この記述だとcronに出力は下記になります。
    出力結果:

    0 0 * * * bash -l -c 'cd /home/user_name/app && RAILS_ENV=production bin/rake batch:batch_name && rsync -a -e \"ssh -p $PORT\" /path/aaa/ user_name@$IP:/path/aaa/'
    

    これで問題ないのでは?と思いますがコマンドが「”」で囲まれているため環境変数が展開されません。
    環境変数を展開するにはコマンド「””」で囲む必要があります。

    コマンドを「””」で囲むためにwheneverにjob_templateの設定が必要になります。job_templateではコマンドの形を設定できます。

    set :job_template, "bash -l -c \":job\""
    

    上記を設定すればコマンドの出力が「””」で囲まれます。
    schedule.rb:

    set :job_template, "bash -l -c \":job\""
    
    every 1.day, at: '0:00 am' do
      command("cd :path && :environment_variable=:environment bin/rake batch:batch_name && rsync -a -e \"ssh -p $PORT\" /path/aaa/ user_name@$IP:/path/aaa/ ")
    end
    

    出力結果:

    0 0 * * * bash -l -c "cd /home/user_name/app && RAILS_ENV=production bin/rake batch:batch_name && rsync -a -e \"ssh -p $PORT\" /path/aaa/ user_name@$IP:/path/aaa/"
    

    これで環境変数が展開され想定通りのコマンドになるかと思います。