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の機能や便利に使用するための情報などはキャッチアップ、共有していきたいと考えています。