『継続的デリバリー』 第13章 学習メモ
コンポーネントや依存関係の管理の概観
1.はじめに
継続的デリバリーにおける、コンポーネントや依存関係の管理についての調査記録です。
継続的デリバリーの中での、コンポーネントや依存関係の管理についての概観を記載します。
『継続的デリバリー 信頼できるソフトウェアリリースのためのビルド・テスト・デプロイメントの自動化』の第13章に対応します。
2.概要・目的
コンポーネントベースのシステムは以下の特徴を持つ。
- いくつかの部品に分割できる
- 明確に定義された振る舞いを持つ、同じAPIを持つ別のコンポーネントで代替可能
- 他のコンポーネントと最小限のやりとりをする
- カプセル化がされており、一枚岩のシステムの対極である
コンポーネントベースの設計により、以下の恩恵を得られる。
コンポーネントや依存関係を管理することで、以下の、ビルドシステムにおける3つの自由を得られる。
- デプロイメントパイプライン
- ブランチ
- コンポーネント
3.対応概要
アプリケーションをリリース可能な状態に保つための観点は以下の通り。
- メインラインでの開発
- メインラインで開発しながら常にリリース可能にするための解決策
- 新機能は完成するまで隠す
- すべての変更はインクリメンタルに行い、個々の変更をリリース可能な状態にする
- 抽象化によるブランチで、大規模な変更をコードベースに加える
- 変更の頻度が異なる部分をコンポーネント化して、アプリケーションから切り離す
4.対応詳細
(1)依存関係の管理
依存関係の管理の観点は以下の通り。
- コンポーネントとライブラリの区別
- ライブラリ:通常めったに更新されない
- コンポーネント:ソフトウェアの部品としてアプリケーションが依存しているもので、自分たち(または同一組織のチーム)が頻繁に更新する。
- ビルド時の依存関係と実行時の依存関係の区別
- ビルド時:アプリケーションをコンパイルし(必要なら)リンクするときにあらわれるもの
- 実行時:アプリケーションを実行して通常の機能を実行するときにあらわれるもの
- 依存地獄
- ライブラリの管理
- ライブラリのバージョン管理の方法と問題
- ビルドの再現性
- 自前の成果物リポジトリ
- 宣言的な依存管理の自作
(2)コンポーネント
コンポーネントの観点は以下の通り。
- コードベースをコンポーネントに分割
- コンポーネントのパイプライン化
- パイプラインの分割が解決する問題
- 並列パイプラインの方法と欠点
- パイプラインの分割が解決する問題
- インテグレーションパイプライン
- 高速フィードバック
- 各パイプラインからの可視性
- 組み合わせたときの問題
(3)依存グラフの管理
依存グラフの管理の観点は以下の通り。
- 依存関係のバージョン管理
- 無閉路有向グラフ
依存グラフの作成
- ひし形依存の問題
- 高速フィードバックのための解決策
- 依存グラフをパイプライン化
- 可視性のための解決策
- コンポーネント分割によるリリースブランチ許容の例外
- ビルドのタイミング
- コンポーネント更新の判断基準
- 新バージョンの統合作業を継続的に行い、素早いフィードバックを得る
- コンポーネント更新の判断基準
- 依存グラフへの状態の追加
- 浅い依存グラフと後方互換性による依存関係の単純化
- 循環依存
(4)バイナリの管理
バイナリの管理の観点は以下の通り。
- 成果物リポジトリ
- 再生成可能なもののみ格納し、削除を可能にする
- ハッシュの保持
- バイナリとソースの紐づけ
- インデックスファイルの追加
(5)Mavenでの依存関係の解決例
Mavenでの依存関係の解決例での観点は以下の通り。
- 依存関係のキャッシュ
- 成果物の保存
- バージョンの指定
- スコープの指定
- 依存関係の重複排除
5.影響・作用
インクリメンタルな変更とメインラインへのチェックイン、またはアプリケーション自体をコンポーネントに分割することで、素早いフィードバックを得られる。
6.おわりに
以上が、継続的デリバリーの中での、コンポーネントや依存関係の管理についての概観です。
7.参考文献
『継続的デリバリー 信頼できるソフトウェアリリースのためのビルド・テスト・デプロイメントの自動化』 第13章 コンポーネントや依存関係を管理する