ビルド

コマンド

1つのコマンドだけ実行すればよい

速いかどうか

数秒以内

インクリメンタルなビルドが可能かどうか

小さな変更の場合に全コードベースを一から再ビルドしていないか
クリーン作業が不要であるかどうか
インクリメンタルなビルドのためのファイルに関するロジックが入り組んでいないかどうか
環境の分離で同じファイルに対する競合が発生しない構成になっているかどうか

何もソースが変わっていない場合

ビルドの実行がされないかどうか

冪等性

何回実行しても結果が同じであること

キャッシュを使っているかどうか

ローカルにビルド結果を置いていないかどうか
同じバージョンのアーティファクト(ビルドの成果物)は全開発者の全ビルドで1回しかビルドされないかどうか
キャッシュのキーはターゲットとハッシュ値にして、内容の更新でキャッシュが変わるかどうか
キャッシュからのデータ取得がビルドよりも速いかどうか

複数プラットフォーム対応

複数の言語・ライブラリ・フレームワーク・プラットフォームに対応しているかどうか

シェルスクリプトのデメリット

デバッグが困難
各種ライブラリーのバージョン等依存関係が統一されにくい
依存関係による分岐に記載が複雑でバグが発生しやすい
簡単なことを複雑なシェルスクリプトにしていないか
小規模ならコマンドだけで十分

タスクベースのビルドシステムのデメリット

xmlはデバッグが困難
xmlは何が実行されているか分かりづらい
結果としてビルド用スクリプトと対して違わない
並列化が困難で命令型を順々に実行していく

外部依存関係の決定性

全依存関係をミラーリングしているかどうか
全依存関係を一意にするハッシュ値で管理しているかどうか
依存関係のいずれかが変わったときはレビューしているかどうか

自動依存関係管理(範囲指定)ではなく、手動依存関係管理(明示的にマイナー・パッチバージョンまで指定)しているかどうか

外部依存関係のセキュリティ

外部依存関係はミラーリングサーバー内だけにアクセスできるようにする
ビルドシステムがサードパーティのアーティファクトリポジトリへアクセスしないようにブロックする

サードパーティーアーティファクトのハッシュ指定で改変を検知する

ベンダリングする(ルートディレクトリのthird_partyディレクトリに外部依存関係は置く)

自動依存関係管理(推移的依存関係)を使っていないか

各モジュールが使用する外部依存関係をそれぞれ再帰的にダウンロードしていないか

AがBの依存先のCに依存していないか
BからCが使われなくなり依存関係を削除したときにAがCを使っている場合に破綻する

AからはB経由でCを使うのではなく、Aから直接Cを使う、またそれを明示的にする
冗長性を脆いシステムより優先する

単一バージョンになっているか

AはB経由でバージョン1のCに依存して、Bはバージョン2のCに依存し得る構成になっていないか
Cのバージョンは固定して、Aからは明示的にCを直接使うようにする

各モジュールは小さく構成されているかどうか

各モジュールが大きいとスケールしない

関連