“ビルドを壊す”とは、コードに変更を加えた結果、プロジェクトが正常にコンパイルまたはビルドできなくなることを意味します。ほとんどの開発者は実践の中で少なくとも一度はこの状況に直面したことがあります。Stack Overflow Developer Survey 2023によると、アンケートに回答した80%のエンジニアが、業務のリポジトリで少なくとも一度はビルドを壊したことがあると証言しています。これはチーム開発における最も一般的な問題の一つであり、即座に修正する必要があります。
要点
ビルドを壊すとは、変更を加えた後にプロジェクトがビルドできなくなる状況です。CI/CDの文脈では、ビルドパイプラインが失敗し、アーティファクトが作成されないことを意味します。
モバイル・ウェブ開発の世界では、ビルドとはソースコードを実行可能なファイルやパッケージに翻訳するプロセスです。Androidの場合は、Gradleを使用してAPKやAABを構築します。iOSの場合は、Xcodeを通じてコンパイルします。ウェブプロジェクトの場合は、WebpackやViteを通じてバンドルします。これらのいずれのステージでもビルドを壊す可能性があります。
現代のバージョン管理システムやJenkins、GitHub Actions、GitLab CIなどのCI/CDツールは、自動的に壊れたビルドを検出し、チームに通知します。ほとんどのプロジェクトでは、ビルドが壊れた場合、ビルドが修正されるまで他のすべてのタスクの優先度が下げられるというルールがあります。
fun main() {
val message: String = "Build successful"
println(message)
// この行はビルドを壊す
val number: Int = "not a number"
}
この例では、Int型の変数に文字列を代入するとコンパイルエラーが発生します。型の不一致は静的型チェック言語におけるビルド破損の最もよくある原因の一つです。
壊れたビルドにつながるエラーはいくつかのカテゴリに分類できます。2024年のGitLabの分析によると、原因の分布は以下の通りです。
| カテゴリ | 例 | 累積戦略 |
|---|---|---|
| 文法エラー | カッコの不備、誤ったインポート | 35% |
| 依存関係の問題 | ライブラリのバージョン不兼容 | 25% |
| ビルド構成 | リソースパスの誤り | 20% |
| マージ衝突 | 不正確に解決された衝突 | 15% |
| インフラリ | CIランナーやキャッシュの問題 | 5% |
最も注意が必要なのが依存関係の問題です。あるモジュールでライブラリを更新すると、APIやメソッドの動作が変わった場合に隣のモジュールでビルドが壊れる可能性があります。
一方で文法エラーはより早く検出できます。コンパイラが正確な行とエラー型を指示します。これが、静的型チェック言語が動的型チェック言語よりもビルドの安定性において信頼性が高いと考えられる理由です。
壊れたビルドはチームの産性に直接影響します。ビルドが失敗すると、開発者はリポジトリからプロジェクトの最新バージョンを取得できなくなり、CIパイプラインもその後のすべての変更に対してブロックされます。
Atlassianの2023年の研究によると、ビルドが4時間以上続けて壊れたままのプロジェクトは、チームの生産性の平均25%を失うことがわかりました。開発者は自分のタスクを完了する代わりに問題の診断に注意を向ける必要があります。
生産性だけでなく、チーム内の士気も受ける影響も大きいです。ビルドを壊した開発者は同料からの圧力を感じます。健全なチームでは、壊れたビルドに対して罰せるのではなく、即座の修正を要求するルールが守られています。ブレームレス・カルチャーとは、インシデントを誰かの間違いとしてではなく、システム的な問題として分析するアプローチです。
分散チームでは、壊れたビルドが別の時間帯の同料の作業をブロックする可能性があります。ヨーロッパの開発者が帰る前にビルドを壊した場合、アジアのチームは修正を待つ間に一日分の作業を失う可能性があります。
壊れたビルドの予防は、コミット前のローカル検査から始まります。各開発者は変更をプッシュする前にテストとビルドを実行する必要があります。主な予防方法はいくつかの階層に分けられています。
第2の階層はCI/CDパイプラインの構成です。各プルリクエストはマージ前に自動的なビルドとテストを通過する必要があります。ビルドが失敗すると、PRは修正されるまでブロックされます。このアプローチはゲーテッド・コミットと呼ばれ、ほとんどの現代的なプロジェクトで使用されています。
第3の階層はモニタリングと統計です。チームはMTTR(平均修理時間)メトリックを追跡します。この指標が低いほど、チームは壊れたビルドに対して早く対処できます。目標値は30分以内です。
ビルドが壊れた場合、最初のステップはどの開発者が最後に変更を行ったかを特定することです。Gitはgit bisectというツールを提供しており、二分探索によってビルドを壊したコミットを見つけることができます。
# 己知の良いコミットと悪いコミットでbisectを開始する
git bisect start
git bisect bad HEAD
git bisect good abc1234
# Gitが中間のコミットをチェックする
# ビルドしてテストし、次にマークする:
git bisect good # if build passes
git bisect bad # if build fails
# ~log2(n)ステップ後、gitが原因を表示する
git bisect reset
問題のコミットを見つけた後は、2つの対処方法があります。1つ目は、修正に時間がかかる場合はgit revertを使用して変更を戻す方法です。これは特にビルドがチーム全体をブロックしている場合に最も安全です。
2つ目は、新しいコミットを作成して即座に修正する方法です。この方法は、問題が局所的で明確な場合に適しています。修正後に変更をプッシュし、ビルドが成功することを確認します。いずれの場合でも、ビルドの回復時間は1時間を超えてはなりません。
よくある質問
ビルドを壊すとは、変更を加えた後にコードがコンパイルやビルドを停止する状況です。エラーが修正されるまで、プロジェクトは非動作状態になります。これは通常文法エラー、不正確なインポートや依存関係の問題によって発生します。
最もよくある原因は文法エラーです:カッコの遺れ、不正確なデータ型、もしくは間違ったインポートです。2番目にライブラリのバージョン互換性の問題と不正確なビルド構成があります。よりまれに、マージ衝突によってビルドが壊れることもあります。
責任は、ビルドを壊した変更を導入した開発者にあります。ただし、健全なチームではブレームレス・カルチャーのアプローチを採用しており、責任者を探すよりも修正と予防に焦点を当てています。プロセスとツールは破損のリスクを最小限に抑える必要があります。
最適な回復時間は30分以内です。問題が複雑な場合は、git revertで戻してチームをアンブロックします。git bisectを使用して問題のコミットを見つけます。修正後にビルドを再実行します。
壊れたビルドは共有ブランチに依存するすべての開発者の作業をブロックします。チームの生産性が低下し、期限が延迟します。長時間にわたるビルドのダウンタイムは変更の蓄積と後にそれらをマージする際の複雑な衝突につながる可能性があります。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。