CircleCIのダイナミックコンフィグでできないこと

1. はじめに

イタンジ株式会社の藤崎です。現在は、物件データ基盤の開発を担当しています。

先日、私達のチームが管理している4つのプロダクトのリポジトリを、コミット履歴を保持したま1つのリポジトリに統合する作業を行いました。

それぞれのプロダクトのCI/CDにはCircleCIを利用していたため、統合後のリポジトリのCI/CDも引き続きCircleCIを利用したのですが、 各アプリケーションのディレクトリ配下に差分がある時など、状況によって実行するワークフローを制御するために、 CircleCIのダイナミックコンフィグ を使用した構成にしました。

その際、ダイナミックコンフィグについて色々と調査・検証していました。

結果的に、公式ドキュメントやブログ等でも紹介されている一般的な構成に落ち着いたのですが、 なぜそれ以外の構成が「できない」のかについて言及しているものはほとんどありませんでした。

そこで今回は「CircleCIのダイナミックコンフィグでできないこと」について書こうと思います。

注意

CircleCIやダイナミックコンフィグ自体についての説明は行いません。

ダイナミックコンフィグについては、先に下記の記事を読まれるといいかと思います。

2. CircleCIのダイナミックコンフィグでできないこと

CircleCI ダイナミックコンフィグの使用 には下記のような記述があります。

ダイナミックコンフィグ機能を使用する場合、各 config.yml ごとに使用できるワークフローは 1 つのみです。

パイプラインのセットアップステージの一部として実行できるのは、1 つのワークフローのみです。

このセットアップ ワークフローには後続のワークフローを起動するためのワンタイムトークンが割り当てられます。

このセットアップ ワークフローはカスケードしないため、後続のワークフローが独自にさらに後に続くワークフローを起動することはできません。

この文章を初めて読んだ時、正直良くわかりませんでした。

そこで、ここに記載されている3つの「できないこと」の具体例を示していきます。

config.yml ごとに使用できるワークフローは 1 つのみ

設定ファイルを下記のように配置すると、Max number of workflows exceeded.というエラーにより、ワークフローそのものが起動しません。

つまり、config.yml で使用できるワークフローは 1 つのみということです。

.circleci/
  │ config.yml
  └ continue.yml
# .circleci/config.yml
version: 2.1

setup: true

orbs:
  continuation: circleci/continuation@0.3.1

workflows:
  setup1:
    jobs:
      - continuation/continue:
          configuration_path: ./circleci/continue.yml
  setup2:
    jobs:
      - continuation/continue:
          configuration_path: ./circleci/continue.yml
# .circleci/continue.yml
version: 2.1

jobs:
  echo:
    steps:
     - echo "continue" 

workflows:
  continue_workflow:
    jobs:
      - echo

② パイプラインのセットアップステージの一部として実行できるのは、1 つのワークフローのみ

設定ファイルを下記のように配置すると、Pipeline is not in setup state.というエラーにより、continue2のjobは実行されません。

つまり、config.ymlのセットアップワークフローからは、1つのワークフローにしか処理を繋げることができない、ということです。

.circleci/
  │ config.yml
  └ continue.yml
# .circleci/config.yml
version: 2.1

setup: true

orbs:
  continuation: circleci/continuation@0.3.1

jobs:
  setup:
    executor: continuation/default
    parameters:
      config_name:
        type: string
    steps:
      - checkout
      - continuation/continue:
          configuration_path: .circleci/<< parameters.config_name >>

workflows:
  setup:
    jobs:
      - setup:
        name: continue1
        config_name: continue.yml
      - setup:
        name: continue2
        config_name: continue.yml
# .circleci/continue.yml
version: 2.1

jobs:
  echo:
    steps:
     - echo "continue" 

workflows:
  continue_workflow:
    jobs:
      - echo

③ 後続のワークフローが独自にさらに後に続くワークフローを起動することはできない

.circleci/
  │ config.yml
  │ continue1.yml
  └ continue2.yml

設定ファイルを上記のように配置しても、

config.yml -> continue1.yml -> continue2.yml

と繋げることはできません。

continue1.ymlからcontinue2.ymlに繋げる箇所で、Continuation config contains setup stanza whilst not in setup anymore.というエラーにより停止します。

つまり、「ワークフローを複数繋げることはできない」ということです。

# .circleci/config.yml
version: 2.1

setup: true

orbs:
  continuation: circleci/continuation@0.3.1

workflows:
  setup:
    jobs:
      - continuation/continue:
          configuration_path: ./circleci/continue1.yml
# .circleci/continue1.yml
version: 2.1

setup: true

orbs:
  continuation: circleci/continuation@0.3.1

workflows:
  setup:
    jobs:
      - continuation/continue:
          configuration_path: ./circleci/continue2.yml
# .circleci/continue2.yml
version: 2.1

jobs:
  echo:
    steps:
     - echo "continue" 

workflows:
  continue_workflow:
    jobs:
      - echo

3. 最後に

今回は、CircleCI ダイナミックコンフィグの使用 に記載されている「できないこと」を具体例を用いて説明しました。

ダイナミックコンフィグを理解するための一助になれば幸いです。

なお、弊社ではCI/CDのツールとしてGitHub ActionsとCircleCIの両方を使用しております。

GitHub Actionsに移行していくという流れもありますが、これまでCircleCIで作られている資産を活用したい場面もあるため、今後もCircleCIの機能や便利に使用するための情報などはキャッチアップ、共有していきたいと考えています。