概要
- CIプラットフォーム の進化とその利点
- 複雑化 による課題と本質的な問題提起
- CIシステムとビルドシステム の境界の曖昧さ
- 理想的なCIプラットフォームへの 要件考察
- Taskcluster という先進的な事例の紹介
モダンCIプラットフォームの現状と課題
- CIプラットフォーム の進化により、開発者や企業がより頻繁かつ信頼性の高いソフトウェアをリリース可能
- GitHub Actions、 GitLab Pipelines、 Bitbucket などの集中型CIプラットフォームによるスケールメリット
- インターネット上に豊富な情報やノウハウの蓄積
- 検索すればすぐにコピペ可能なコード例の入手
- CI設定 に時間を費やすのは誰も望まない現状
- 目標は「とにかくリリースしたい」
CIシステムの複雑化
- 進化とともに 設定や機能が複雑化
- 本質的には「リモートコード実行サービス」として機能
- ソフトウェアのビルド・テスト・デプロイを目的とした設計
- GitHub Actions の例
- 組み込みテンプレートシステムと独自の式言語
- ジョブのトリガー、変数、条件付き実行、ジョブ間依存関係
- Dockerベースの実行環境や暗号化シークレット
- ステップ・アクションの豊富な標準機能
- 3rdパーティのActionsも多数存在
- 必要な機能が多く、 不要な機能の削減が難しい
- YAMLのプログラミング言語的利用に対する妥協
CIとビルドシステムの境界
- CIシステムの複雑化 =ビルドシステムとの区別が困難
- Makefile や Bazel のようなビルドシステムとの類似性
- CIはリモート・分散型、ビルドシステムはローカル・単一マシンという違いのみ
- Bazel のようなモダンビルドシステムはリモート実行・キャッシュを標準装備
- サーバーサイドのGitフックでBazelをトリガーすれば、それも一種のCIシステム
- CIとビルドシステムの高次抽象化
- どちらも「汎用計算リソース管理+専門的なビルド・デプロイ機能」
- Kubernetes やバッチジョブシステムと本質的に近い構造
CIシステムの冗長性と理想像
- 現状のCIシステムは「ビルドシステムの再発明」や「ロジックの分断」を招く
- 複雑なYAML、キャッシュや依存関係の最適化でビルドシステムと同じ問題に直面
- ビルドシステムとCIシステム、2つのDAG(有向非巡回グラフ)管理の煩雑さ
- 本来CIはビルドシステムの拡張であるべき
- ローカル開発ワークフローと統合されたCIの利便性
- ローカルでCIジョブを即時実行可能な開発体験
- UIやAPIによる集中管理・レポート機能 は必要だが、リモート実行やワーク定義はビルドシステムで十分
CIプラットフォームの抽象度と今後の方向性
- 現代のCIサービス は適切な抽象レベルを狙えていない
- GitHub Actions や GitLab CI は「製品」寄りで、柔軟なプラットフォーム性が不足
- 理想的なCIプラットフォームの要件
- API経由で任意のタスクグラフをスケジューリング可能
- YAMLやリポジトリに縛られない「リモート実行サービス」としての柔軟性
- GitLab Pipelines は親子パイプラインや動的パイプラインで一歩リード
- ただし完全なAPIベースのスケジューリングは未対応
- GitHub Actions はYAMLファイルベースに強く依存し、柔軟性に制約
プラットフォームと製品の違い
- 製品型CI :意見の強いYAML設定+Web UI+APIのセット
- プラットフォーム型CI :APIで任意の計算リソース・ワークフローを定義可能
- プラットフォームとしての進化には「YAMLレスなAPIによるタスク定義」が不可欠
Taskcluster:エンジニア向けCIプラットフォームの事例
- MozillaのTaskcluster は、汎用性の高いCIプラットフォーム
- Firefox開発のため2014-2015年に設計・実装
- 他のCIサービスとは一線を画す柔軟性とパワー
- Taskcluster の特徴
- API駆動型のタスク定義・スケジューリング
- 開発者が独自のビルド・CI・バッチシステムを構築可能な自由度
- 公式の用途にとどまらない多様な応用事例
- エンジニア本位の設計思想 と、他サービスが見習うべきアイデアの宝庫
このように、現代のCIプラットフォームは進化しつつも、 ビルドシステムとの統合や抽象度の見直し が今後の課題。 Taskcluster のような先進事例を参考に、より柔軟で開発者本位なCIの実現が期待される。