[Circle CI]コンテキスト環境変数で、ワークフローごとの環境変数の設定を簡潔にする


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のコンテキスト環境変数を作る。

  1. Circle CIのOrganization Settingsを開く
  2. Contexts -> Create Contextで2つコンテキストを作る。"master", "develop"という名前にする1
  3. 最初に示した5つの環境変数を追加し、master/develop固有の値を設定する

次に、Circle CIのビルドスクリプトを書く。masterとdevelopブランチのワークフローを分けて、ワークフロー側からjobに対して環境変数を設定する。以下、例。

.circleci/config.yml
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"が付かないものに変換する。以下、例。

.circleci/config.yml
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の見通しが悪くなること。

コンテキストのリファレンス


  1. 実運用では、もっと長いコンテキスト名を付けた方が良い。組織の全リポジトリで一意でないとNGなので。