CI/CDをリポジトリ分割し、CircleCIの設定ファイルのメンテナンス性を向上させた話

記事タイトルとURLをコピーする

こんにちは。サーバーワークスでCloud AutomatorのSREチームで開発・運用を担当している尾崎です。
2回に渡って、Cloud AutomatorのSREチームが中心となって取り組んだアプリケーションのCI/CD改善について紹介します。
まずはCircleCIの設定ファイルのメンテナンス向上について紹介をして、別の記事でCircleCIを利用したカナリアデプロイについて紹介します。

なお、記事中で「CI」は主にアプリケーションの自動テストやコンテナイメージのビルド、「CD」はアプリケーションコード(コンテナ含む)のデプロイを意味しています。

開発チームが持っていた課題

Cloud Automatorは複数のアプリケーションから構成されており、それらアプリケーションは主にCircleCIを利用してCI/CDしています。

長く開発・運用されているアプリケーションもあり、そのアプリケーションのCircleCIの設定ファイルに対しては以下の課題がありました。

  • 設定ファイル .circleci/config.yml が巨大で全体像が見えづらい
  • 修正・変更箇所の影響範囲を把握しづらく、設定ファイルに手が付けづらい

実際、CircleCIの設定ファイルに対しての軽微な修正が原因となり、アプリケーションのデプロイに失敗するということが発生したことがありました。

課題への対策

これら2つの課題に対して、SREチームで相談し、以下の対策をしました。

  • 「CircleCIの設定ファイル .circleci/config.yml が巨大で全体像が見えづらい」の対策として、アプリケーションのリポジトリで行っていたCI/CDから、CDを別リポジトリに抜き出し、CircleCIの設定ファイルをCI用とCD用に分割する。

  • 「修正・変更箇所の影響範囲を見通せず設定ファイルに手が付けづらい」の対策として、上記のCIとCDのリポジトリを分けたうえで、CircleCIのダイナミックコンフィグを利用し、さらなる設定ファイルのスリム化を行う。

それぞれ具体的に紹介します。

アプリケーションデプロイ(CD)用のリポジトリを新設

まずはアプリケーションコードのリポジトリにあったCI/CDの設定ファイル(.circleci/config.yml)の中からアプリケーションのデプロイ(CD)だけを抜き出し、新しく作成したデプロイ用のリポジトリに置きました。

アプリケーションコードのリポジトリは自動テストとコンテナイメージのビルドまでの責任を負い、デプロイは新しく作成したデプロイ用のリポジトリに任せる方式です。

f:id:swx-ozaki:20220222114507p:plain

これにより、CircleCIの設定ファイルが分割され、CIとCDの設定が物理的に分離したことで、それぞれの設定修正や変更を従来より簡単に行えるようになりました。

CircleCIのダイナミックコンフィグを利用したデプロイ設定ファイルの分割

Cloud Automatorのアプリケーションでは動作確認環境やQA環境、本番環境など複数の環境にデプロイを行えるようにしています。
各環境へのデプロイは独立しているので、これらのデプロイ設定も分割したファイルにして、メンテナンスしやすいようにしたいという思いがありました。
そこでいろいろ調べたところ、CircleCIのダイナミックコンフィグが使えるということがわかりました。

このダイナミックコンフィグは、CircleCIのワークフローの実行の入り口が.circleci/config.ymlとなるのは変わらないのですが、そこから参照する設定ファイルを動的に選択できるという機能となっています。

イメージとしては以下のようなディレクトリ構造です。

.circleci
└── config.yml
config
├── deploy_to_production.yml
├── deploy_to_qa.yml
└── deploy_to_development.yml

.circleci/config.yml ではデプロイ先をパラメーターとして受け取り、そのパラメーターに応じてダイナミックコンフィグ機能でデプロイ設定のファイルを選択し、デプロイを実行します。

以下の例は動作確認環境にデプロイする際に実行される部分の抜粋になります。

orbs:
  continuation: "circleci/continuation@0.2.0"

jobs:
  deploy_to_development:
    parameters:
      revision:
        type: "string"
    executor: "continuation/default"
    steps:
      - "checkout"
      - continuation/continue:
          # deploy_to_development.yml に渡すパラメーターを設定
          parameters: "{ \"deploy_revision\": \"<< parameters.revision >>\" }"
          configuration_path: "config/deploy_to_development.yml"

workflows:
  deploy_to_development:
    when: "<< pipeline.parameters.development >>"
    jobs:
      - deploy_to_test:
          revision: "<< pipeline.parameters.revision >>"

このように、デプロイ環境ごとにファイルを分けることで設定変更や修正の影響範囲が小さく、設定ファイルを変更に強く保つことができるようになりました。
また、アプリケーションデプロイの見通しの悪さもかなり改善され、どういう設定でアプリケーションがデプロイされているのか把握しやすいようになりました。

まとめ

1つのリポジトリにまとめていたCircleCIの設定をCIとCDで分離することで、メンテナンスしやすくしました。
また、CircleCIのダイナミックコンフィグを利用することで、同一リポジトリ内でもCircleCIの設定ファイルを分割し、今後のメンテナンス性も担保できるようにしました。

次の記事では、今回のメンテナンス性向上施策とともに行った、CircleCIを利用したカナリアデプロイの導入について紹介します。

[更新] 後編を公開しました!

blog.serverworks.co.jp