CircleCI上で、.envファイルから環境変数を設定する方法
TL;DR
CircleCI上で.envファイルを読み込むには、普通にシェルスクリプトを書くしかなさそう。
cat app.env | grep -E .+=.* | while read line; do echo "export ${line}" >> $BASH_ENV; done
などとする。
はじめに
CircleCI上で、machine: trueで自前のdocker imageを使う場合と、CircleCIに用意されたdocker imageを使う場合で、微妙に環境変数の扱いが違い、ハマったのでメモ。
要件
CI上で、自前のdocker imageを使う必要がないコマンド(rubocop等)を、別jobでのCircleCIのdocker image上で実行することで並列化し、高速化する。
その際に、環境変数が違うとRailsが正しく起動しなかったりするため、同じ.envファイルを読み込んで使いまわしたい。
自前のdocker imageを使う場合(machine: trueのとき)
docker-composeファイルに書くなり、dockerコマンドの引数にenvファイルを与えてやれば良い。
CircleCIのdocker imageを使う場合
「プロジェクト内で環境変数を設定する」の場合は、CircleCIのGUI上で編集しないといけないため、管理が煩雑になってしまう。
「(ステップ|ジョブ|コンテナ)内で環境変数を設定する」の場合には、ファイルの読み込みに対応していないようです。
結局、「BASH_ENVで環境変数を定義する」しかないので、シェルスクリプトを書くことにしました。
シェルスクリプト
.envファイルはコメントアウトや空行があるので、cat app.env | grep -E .+=.*
で、実際に環境変数を定義している部分のみ取り出します。(valueが空の場合もあるので注意)
それらをexportしていきます。
cat app.env | grep -E .+=.* | while read line; do echo "export ${line}" >> $BASH_ENV; done
おわりに
結局、シェルは最後の最後では役に立つ場合が多く、侮れないなと感じています。