Circle CIにはコンテキスト環境変数というものがある。基本的には、複数プロジェクト(=リポジトリ)で共通の環境変数を定義するときに使うが、ワークフローごと(≒ブランチごと)の環境変数の設定を簡潔にすることにも使える。以下、ケーススタディ形式で説明する。
状況設定
- developとmasterのpushに対してCircle CIのビルド実行
- developとmasterのビルド処理は全く同じで、ビルドパラメータだけが異なる
- ビルドパラメータは秘密にしたい情報も含まれているので、Circle CIの環境変数として定義する
- 以下の5つの環境変数があり、developとmasterで値は別にする
- BUILD_TYPE
- KEY_STORE
- KEYSTORE_PASSWORD
- KEY_STORE_ALIAS
- KEY_STORE_ALIAS_PASSWORD
コンテキスト環境変数を使って、ワークフローごとの環境変数を設定する場合
まず、Circle CIのコンテキスト環境変数を作る。
- Circle CIのOrganization Settingsを開く
- Contexts -> Create Contextで2つコンテキストを作る。"master", "develop"という名前にする1
- 最初に示した5つの環境変数を追加し、master/develop固有の値を設定する
次に、Circle CIのビルドスクリプトを書く。masterとdevelopブランチのワークフローを分けて、ワークフロー側からjobに対して環境変数を設定する。以下、例。
version: 2.1
jobs:
build:
executor: foobar
steps:
- setup
- build # この処理で環境変数を参照する
- post_steps
workflows:
version: 2
internal_release:
jobs:
- build:
context: develop
filters:
branches:
only:
- develop
release:
jobs:
- build:
context: master
filters:
branches:
only:
- master
この方法の良いところは、ワークフローごとで環境変数名を同じにできること。それゆえ、環境変数名による分岐処理をなくすことができる。
コンテキスト環境変数を使わないで、ワークフローごとの環境変数を設定する場合
まず、Circle CIのProject Settingsの環境変数として、ビルドパラメータを定義する。この場合、masterとdevelopで同じ名前にすることはできないので、developブランチのビルド向けの環境変数名の末尾には"_DEV"を付けるようにする。
次に、Circle CIのビルドスクリプトを書く。環境変数CIRCLE_BRANCHをチェックし、"develop"であれば名前に"_DEV"が付いた環境変数を、"_DEV"が付かないものに変換する。以下、例。
version: 2.1
jobs:
build:
executor: foobar
steps:
- setup
- run:
name: "Setup Env Vars"
command: |
if [ "$CIRCLE_BRANCH" = "develop" ]; then
echo 'export BUILD_TYPE=Debug' >> $BASH_ENV
echo 'export KEY_STORE=KEY_STORE_DEV' >> $BASH_ENV
echo 'export KEY_STORE_PASSWORD=KEY_STORE_PASSWORD_DEV' >> $BASH_ENV
echo 'export KEY_STORE_ALIAS=KEY_STORE_ALIAS_DEV' >> $BASH_ENV
echo 'export KEY_STORE_ALIAS_PASSWORD=KEY_STORE_ALIAS_PASSWORD_DEV' >> $BASH_ENV
fi
- build # この処理で環境変数を参照する
- post_steps
workflows:
version: 2
build:
jobs:
- build:
filters:
branches:
only:
- develop
- master
この書き方の問題点は、config.ymlの見通しが悪くなること。
コンテキストのリファレンス
-
実運用では、もっと長いコンテキスト名を付けた方が良い。組織の全リポジトリで一意でないとNGなので。 ↩