CircleCI2.0で変数を共有したい

CircleCI2.0のrunステップは宣言するたびに新たなシェルが立ち上がるため、通常ならrunステップ間で変数の共有はできません。

1つのrunステップにずらずらとコードを書くと処理内容の見通しも悪くなるので、できるだけまとまった処理単位でrunステップを分けたり共有化したい場面も多いと思います。

BASH_ENVで変数の共有化

CircleCIの公式にもありますが、BASH_ENVに環境変数をエクスポートすることで 複数のrunステップで変数の共有をすることができます。

仕組み的にはCircleCIはbashコマンドを用いて、ステップごとにその都度 BASH_ENV の内容を読み込みしているようです。

実例

以下のようにBASH_ENVに環境変数をエクスポートする記述を追加します。

echo "export START_DATE=2019-08-01" >> $BASH_ENV
echo "export END_DATE=2019-08-31" >> $BASH_ENV
source $BASH_ENV

これで別のrunステップでもこの変数を利用することが可能になります。

ソース

実際に試したCircleCIのconfig.ymlになります。

references:
  commands:
    set_env: &set_env
      name: Set Env
      command: |
          echo "export START_DATE=2019-08-01" >> $BASH_ENV
          echo "export END_DATE=2019-08-31" >> $BASH_ENV
          source $BASH_ENV

version: 2.0

jobs:
  build:
    working_directory: ~/work
    docker:
      - image: circleci/ruby:2.6.4
    steps:
      - checkout
      - run: *set_env
      - run: |
          END_DATE_SEC=`date -d "${END_DATE}" "+%s"`
          DATE=${START_DATE}
          DATE_SEC=`date -d "${DATE}" "+%s"`
          while [ ${DATE_SEC} -le ${END_DATE_SEC} ] ; do
            echo $DATE
            DATE=`date -d "${DATE} 1 day" "+%Y-%m-%d"`
            DATE_SEC=`date -d "${DATE}" "+%s"`
          done

開始日と終了日の日付を共通にして別なrunステップでループする感じの処理です。

最後に

この書き方でCIrcleCIの設定がだいぶ見やすく書けるようになりました!