Foreman で環境変数を設定しよう

Foreman 使っていますか? Foreman はプロセスの実行を一元化する為のツールです。詳しくは http://blog.daviddollar.org/2011/05/06/introducing-foreman.html を見てください。

Heroku を使っている人ならもうおなじみのツールだと思います。Cedar Stack ではアプリケーションの起動に Foreman を使うようになっていますので https://devcenter.heroku.com/articles/procfile

問題

Heroku を使っていると少し面倒なことがあります。それは 設定(ファイル) です。開発環境と本番環境で設定が違う場合、その部分を設定ファイルに切り出して、開発用の値と本番用の値を管理すると思います。もしくは、Heroku では DB の URL 等は環境変数で与えられるので、開発環境は設定ファイルから、本番環境は環境変数からと、設定値の取得先を変えているのではないでしょうか。

また、設定ファイルは git には登録したくないので、git に登録するファイルと、開発環境で実際に使うファイルを分けたり。本番は環境変数からだけど、開発環境では設定ファイルからなので、開発環境の為だけにファイル読み込みの処理を書いたりしていませんか。

でもそれって面倒臭いですよね。

解決

Foreman では設定ファイルから環境変数を設定できるようになっています。設定ファイルはデフォルトでは ".env" になっていますが、起動時のオプションで指定できるようになっています。設定ファイルには 'KEY=VALUE' の形で値を記述します。ソースを見ると「/\A([A-Za-z_0-9]+)=(.*)\z/」という正規表現が使われていて、それにマッチしない行は無視されるようです。

テスト

簡単なスクリプトを書いてテストしてみましょう。test_foreman.rb と .evn を用意します。内容は以下の様になります。

% cat test_foreman.rb
p ENV['ORAORA']
% cat .env
ORAORA=MUDAMUDA

では、まず Foreman を使わずに実行します。

% ruby test_foreman.rb
nil

nil が表示されました。次に Foreman 経由で実行します。

% foreman run ruby test_foreman.rb
"MUDAMUDA"

nil ではなく .env に書いた値が表示されました。

まとめ

これから Heroku のアプリケーションを作る場合、設定値は全て環境変数に設定するのが楽になるのではないかと思いました。

開発環境は Foreman 経由で設定された ENVの値 から。本番環境(Heroku) ではあらかじめ設定されている ENV の値と、 heroku config:add コマンドから登録した ENV の値で。