CircleCI 2.0 環境変数の設定あれこれ

CircleCI 2.0 の環境変数設定方法と優先される設定について

CircleCI 2.0 には、環境変数の設定方法がいろいろあります。同じ環境変数を別の方法で設定した場合は、どれが優先されるのでしょうか?設定の種類と優先される環境変数についてまとめます。

メモ的な内容なので、間違っていたら指摘してもらえると助かります。

環境変数の設定方法

CircleCI 2.0 の環境変数を設定方法は、いろいろなレベルで提供されています。どのレベルで環境変数を設定すれば良いのか?同じ環境変数でもテスト、デプロイなどの実行するジョブ毎に異なる値を設定したい事はよくあります。環境変数を設定したレベルによって、上書きされるのか?されないのか?把握しておく必要があります。

まず、それらを把握する前に、環境変数の設定方法のバリエーションについて理解しておきましょう。

大きくは、以下の6つのレベルで環境変数を設定することができます。

  • Global Environment Variables
  • Project Environment Variables
  • Job Environment Variables
  • Container Environment Variables
  • Step Environment Variables
  • Bash Environment Variables

Global Environment Variables

この環境変数は各種プロジェクトで共有したい環境変数を設定します。 Settings > Contexts から設定することができます。

Project Environment Variables

Project レベルで設定する環境変数は、Build > Project > Settings で設定します。

Global 環境変数を上書きできます。

Job Environment Variables

Job レベルの環境変数は、config.yml で以下のように設定します。

version: 2.0
jobs:
build:
docker:
- image: buildpack-deps:trusty
environment:
- FOO: "bar"

Global、Project レベルの環境変数を上書きできます。

Container Environment Variables

Container レベルの環境変数は、config.yml で以下のように設定します。

version: 2.0
jobs:
build:
docker:
- image: smaant/lein-flyway:2.7.1-4.0.3
- image: circleci/postgres:9.6
# Environment variable for all commands executed in the primary container
environment:
POSTGRES_USER: conductor
POSTGRES_DB: conductor_test
Global、Project、Job レベルの環境変数を上書きできるのかと思いきや上書きできませんので注意が必要です。

Step Environment Variables

Step レベルの環境変数は、config.yml で以下のように設定します。

version: 2.0
jobs:
build:
docker:
- image: smaant/lein-flyway:2.7.1-4.0.3
steps:
- checkout
- run:
name: Run migrations
command: sql/docker-entrypoint.sh sql
# Environment variable for a single command shell
environment:
DATABASE_URL: postgres://conductor:@localhost:5432/conductor_test

Global、Project、Job、Container レベルの環境変数を上書きできます。

Bash Environment Variables

Bash レベルの環境変数は、config.yml で以下のように設定します。

steps:
- run: echo 'export PATH=/foo/bin:$PATH' >> $BASH_ENV
- run: some_program_in_foo_bin

Global、Project、Job、Container、Step レベルの環境変数を上書きできます。

まとめ

基本的には、詳細レベルで設定した環境変数が優先(上書き)されますが、上書き可能な関連をまとめると以下のような関連になります。(下になるほど詳細レベルの設定)

- Global
- Project(Global)
- Job (Global/Project)
- Container (None)
- Step (Global/Project/Job/Container)
- Bash (Global/Project/Job/Container)

Container レベルで環境変数を設定する場合は、Global / Project レベルの環境変数を上書きできないので注意しましょう。

Project レベルの環境変数設定を使って、本番環境の値を設定した場合、ビルドやテストでは、config.yml の Job のレベルで、テスト用の値を設定するのがベストかな?