2017年4月20日木曜日

rbenvとbundlerがcronで動かない時の対処法

rbenvとbundlerはRubyでの作業には必須のツールです。しかしいざ本番環境に移行しcronで使おうとすると動かなくて困る事があります。 rbenvをcronで使う方法は色々ありますが、bash -lcで以下のように実行するのが自然です。
* * * * * user /bin/bash -lc 'cd /path/to/program-dir && ruby program.rb'

設定が適切ならこれで問題なく動くのですが、以下のように怒られる事があります。
  1. bundlerでgemをインストールしたはずなのにライブラリが見つからない
  2. bundlerでgemをインストールしたはずなのにバージョンが違うと言われる

これはbundlerでgemの保存場所を指定していない場合に起きやすい問題です。 bundlerは保存場所を何も指定しないとgemをシステムに保存しますが、cronから呼び出す際には保存場所が指定されていないと読み出しに失敗したり、バージョン不整合が起きます。 この問題はbundlerの実行時に--pathオプションを付ける事で解決します。
bundle install --path vendor/bundle

bundlerの保存場所を明示するとその設定は.bundle/configに記憶されるため、cronで実行した際にも読み出し位置が明確になります。エラーも消えるはずです。bundle installする際は、忘れずに--pathオプションを付けましょう。

0 件のコメント: