ぶちのブログ

競プロとCTFが趣味なWebエンジニアのアウトプットの場

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

おわりに

結局、シェルは最後の最後では役に立つ場合が多く、侮れないなと感じています。