肥大化したCIのymlの改善に使えるツール

CI の yml について

CircleCI、GitLabCI を業務レベルの規模で使っているとある程度のボリュームになってしまい、可読性が落ちてしまいます。 その中で CIyml を改善できる方法を大きくふたつ見つけたので紹介します。

CircleCI config pack

CircleCI 公式 Docs では下記のように紹介されています。

設定ファイルのパッケージ化

CLI の circleci config pack コマンド (上記の circleci orb pack とは異なる) を使用すると、複数のファイルをまとめて 1 つの YAML ファイルを作成できます。 pack コマンドには、ディレクトリ ツリー内の複数ファイルにまたがる YAML ドキュメントを解析する FYAML が実装されています。 これは、容量の大きな Orb のソース コードを分割している場合に特に利便性が高く、Orb の YAML 構成のカスタム編成を行うことができます。 circleci config pack は、ディレクトリ構造とファイルの内容に基づいて、ファイル システム ツリーを 1 つの YAML ファイルに変換します。 pack コマンドを使用するときのファイルの名前や編成に応じて、最終的にどのような orb.yml が出力されるかが決まります。

上記でも述べておりますが、ディレクトリ構造に基づいてとあるように一定の制約があります。 実際に分割する際は各層をフォルダ名として取り扱う必要があります。(commands,workflows,jobs など)

その他デメリットとしてはアンカー、エイリアスを使用してる箇所については分割ができないという点です。*自分はこちらの理由で使用を断念しました。

なので、commands,workflows,jobs といった至る所でアンカー、エイリアスを使用してる場合は中途半端な分割管理になってしまうかと思います。

GitHub の方でも issue として切られています。

Support anchors and aliases across YAML files in decomposed orbs

yq

yq は YAML を操作できるコマンドラインツールで、特定キーワードから部分的に表示したり、差分、結合などなど行うことができるツールです。

こちらの場合、ディレクトリ構成の縛りもなくなりかつアンカー、エイリアスを使用してる箇所は そのまま貼り付ければ問題なく動作するので、いい感じにできます。 そして変更完了時はyq eaコマンドで分割した yml をマージして完成。

yq ea '. as $item ireduce ({}; . * $item )' path/to/*.yml

まとめ

個人的には両方使ってみてどちらも良かったので、アンカー、エイリアス使ってるか、使ってないか次第だと思います。