5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

男坂Advent Calendar 2020

Day 12

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

Posted at

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なので。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?