『継続的デリバリー』 第13章 学習メモ

コンポーネントや依存関係の管理の概観

1.はじめに

継続的デリバリーにおける、コンポーネントや依存関係の管理についての調査記録です。
継続的デリバリーの中での、コンポーネントや依存関係の管理についての概観を記載します。
『継続的デリバリー 信頼できるソフトウェアリリースのためのビルド・テスト・デプロイメントの自動化』の第13章に対応します。

2.概要・目的

コンポーネントベースのシステムは以下の特徴を持つ。

コンポーネントベースの設計により、以下の恩恵を得られる。

  • 再利用されたり、疎結合のような適切なアーキテクチャ上の性質を得られる
  • 大規模な開発チームでの共同作業の効率化

コンポーネントや依存関係を管理することで、以下の、ビルドシステムにおける3つの自由を得られる。

3.対応概要

アプリケーションをリリース可能な状態に保つための観点は以下の通り。

  • メインラインでの開発
  • メインラインで開発しながら常にリリース可能にするための解決策
    • 新機能は完成するまで隠す
    • すべての変更はインクリメンタルに行い、個々の変更をリリース可能な状態にする
    • 抽象化によるブランチで、大規模な変更をコードベースに加える
    • 変更の頻度が異なる部分をコンポーネントして、アプリケーションから切り離す

4.対応詳細

(1)依存関係の管理

依存関係の管理の観点は以下の通り。

  • コンポーネントとライブラリの区別
    • ライブラリ:通常めったに更新されない
    • コンポーネント:ソフトウェアの部品としてアプリケーションが依存しているもので、自分たち(または同一組織のチーム)が頻繁に更新する。
  • ビルド時の依存関係と実行時の依存関係の区別
    • ビルド時:アプリケーションをコンパイルし(必要なら)リンクするときにあらわれるもの
    • 実行時:アプリケーションを実行して通常の機能を実行するときにあらわれるもの
  • 依存地獄
    • .NETでのアセンブリLinuxでの命名規約による解決
      • 洗練された依存管理ツールとしてのDebianパッケージ管理ツール
    • 依存するフレームワークやライブラリもアプリケーションとともに出荷する解決策
    • Javaにおけるひし形依存問題
  • ライブラリの管理
    • ライブラリのバージョン管理の方法と問題
    • ビルドの再現性
    • 自前の成果物リポジトリ
    • 宣言的な依存管理の自作

(2)コンポーネント

コンポーネントの観点は以下の通り。

  • コードベースをコンポーネントに分割
  • コンポーネントのパイプライン化
    • パイプラインの分割が解決する問題
      • 並列パイプラインの方法と欠点
  • インテグレーションパイプライン
    • 高速フィードバック
    • 各パイプラインからの可視性
    • 組み合わせたときの問題

(3)依存グラフの管理

依存グラフの管理の観点は以下の通り。

  • 依存関係のバージョン管理
  • 無閉路有向グラフ 依存グラフの作成
    • ひし形依存の問題
    • 高速フィードバックのための解決策
  • 依存グラフをパイプライン化
    • 可視性のための解決策
    • コンポーネント分割によるリリースブランチ許容の例外
  • ビルドのタイミング
    • コンポーネント更新の判断基準
      • 新バージョンの統合作業を継続的に行い、素早いフィードバックを得る
  • 依存グラフへの状態の追加
  • 浅い依存グラフと後方互換性による依存関係の単純化
  • 循環依存

(4)バイナリの管理

バイナリの管理の観点は以下の通り。

  • 成果物リポジトリ
  • 再生成可能なもののみ格納し、削除を可能にする
  • ハッシュの保持
  • バイナリとソースの紐づけ
  • インデックスファイルの追加

(5)Mavenでの依存関係の解決例

Mavenでの依存関係の解決例での観点は以下の通り。

  • 依存関係のキャッシュ
  • 成果物の保存
  • バージョンの指定
  • スコープの指定
  • 依存関係の重複排除

5.影響・作用

インクリメンタルな変更とメインラインへのチェックイン、またはアプリケーション自体をコンポーネントに分割することで、素早いフィードバックを得られる。

6.おわりに

以上が、継続的デリバリーの中での、コンポーネントや依存関係の管理についての概観です。

7.参考文献

『継続的デリバリー 信頼できるソフトウェアリリースのためのビルド・テスト・デプロイメントの自動化』 第13章 コンポーネントや依存関係を管理する