継続的インテグレーション(CI)とは?マージ地獄を防ぐ「こまめな合体」の極意

目次
このサイトの運営者

山脇 弘成(SSAITS(サイツ)代表)

PMP®有資格者・Webプロジェクトマネージャー
大手メディアや官公庁のWebプロジェクト実績多数。
「技術」だけでなく「対話」を重視し、御社の「ほんとは、こうしたかった」を形にします。

Promapediaは、SSAITS(サイツ)が運営する
プロジェクトマネジメント情報サイトです。

SSAITS公式サイトはこちら

開発終盤の「せーの」でシステムが壊れる悲劇

継続的インテグレーション(CI)とは?マージ地獄を防ぐ「こまめな合体」の極意

システム開発のプロジェクトにおいて、こんな経験はありませんか?

たとえば、新しい「プロジェクト管理システム」を作っているとします。

  • Aチームは「ガントチャート作成機能」を開発。
  • Bチームは「タスク一覧のUI(画面)」を開発。
  • Cチームは「メンバー管理機能」を開発。

それぞれのチームが独立して何週間もかけて機能を開発し、ようやくそれぞれの機能が完成しました。そして開発の終盤、いよいよ全員のプログラムを持ち寄って「せーの」で1つのシステムに合体(マージ)させようとします。

するとどうなるか。お互いのコードが激しく干渉し合い、Aチームの機能を入れたらBチームの画面が崩れ、Cチームの機能を入れたらそもそもログインできなくなる……といった原因不明のエラーが多発します。
結果として、リリース直前になって膨大な修正作業に追われ、深夜まで残業して必死にズレを直していくことになります。

IT業界では、これを「マージ地獄」あるいは「インテグレーション地獄」と呼びます。

名著『LeanとDevOpsの科学』では、こうした寿命の長い分岐(ブランチ)による統合時のトラブルを強く警戒しており、これを防ぐための管理体制への移行を推奨しています。今回は、その核となる「継続的インテグレーション(CI)」について解説します。

そもそも「インテグレーション」とは何か?

IT業界以外の方にはあまり馴染みのない言葉かもしれませんが、インテグレーション(Integration)とは、一般的に「統合」「結合」「統一」といった意味を持ちます。

ソフトウェア開発の文脈では、別々の開発者やチームが作ったプログラム(コード)を、「合体させて、一つのシステムとして動くようにまとめる作業」のことを指します。
先ほどの例で言えば、Aチーム、Bチーム、Cチームが別々に作った機能のコードを持ち寄って、最後に1つのシステムに合体させるあの作業こそが、「インテグレーション」です。

「継続的インテグレーション(CI)」の定義と目的

最後にまとめて合体させた結果、大爆発して悲劇が起きるのであれば、どうすればよいのでしょうか。
その答えとして生まれたのが、「継続的インテグレーション(Continuous Integration:CI)」です。

これは非常にシンプルな考え方で、「最後にまとめて合体させるのではなく、継続的(常に、こまめに)合体させ続けよう」というアプローチです。

『LeanとDevOpsの科学』では、継続的インテグレーションを以下のように定義しています[1] … Continue reading

コードに定期的にチェックイン(統合)し、チェックインのたびに重大な不具合を発見するための迅速なテストがトリガーされ、不具合が見つかれば開発者が直ちに修正する(という開発のプラクティス)。

現場にCIを導入する3つの実践ルール

「現場にCIを導入する3つの実践ルール」の図解

では、実際のプロジェクト管理体制をどのように変えれば、この継続的インテグレーションを実現できるのでしょうか。ハイパフォーマーの組織が徹底している具体的なルールを3つ紹介します。

長期ブランチを禁止し「1日未満」で統合する

各チームが、数週間も自分たちの手元(独立したブランチ)だけで開発を続けることを禁止します。これが「トランクベース開発」と呼ばれる手法です。
すべてのチームが「トランク(メインのコードベース)」を共有し、作業中のブランチの寿命は「常に1日未満」という極めて短い期間に制限します。
各開発者は、作業が完全に終わっていなくても細かく区切り、最低でも1日に1回はメインのシステムに自分のコードを統合(合体)させます。コードのズレが小さなうちに統合されるため、深刻な衝突を未然に防ぐことができます。

統合のたびに「自動テスト」を走らせる

1日に何度も合体作業を行う場合、人間が手動でテストをしていては到底間に合いません。
そこで、誰かがメインのシステムにコードを変更・追加するたびに、自動的に単体テストなどの検査(ビルドプロセス)が発動する仕組み(CIツール)を導入します。
もし、Aチームの変更がCチームの機能に悪影響を与えた場合、システムが即座にエラーを検知して通知してくれます。

失敗したら「即座に修正」し、テスト合格を完了条件にする

「開発が終わってからテストをする」という古い考え方を捨てます。コードを書くことと自動テストを作ることはセットです。
もし合体によってどこかが壊れたら、開発者は他の作業を止めてでも即座に修正を行います。そして、「関連する自動化テストがすべて作成され、そのすべてに合格しなければ『作業完了』を宣言してはいけない」というルールを徹底します。

CI導入によるメリットと、PMが意識すべき注意点

上記の管理体制をプロジェクトに当てはめると、開発風景は劇的に変わります。
全員が毎日少しずつ機能を作り、毎日メインシステムに統合し続ける。そのたびに自動でテストが走り、エラーが出たらその日のうちに直す。

この最大のメリットは、開発の終盤になってからの徹夜作業(マージ地獄)が消滅し、常に「本番環境にリリース可能な、安定して動くシステム」を保ちながら開発を進められることです。

ただし、プロジェクトマネージャーとして注意すべき点(デメリットやハードル)もあります。
それは、CI環境(自動テストの仕組み)を構築するための初期の学習コストや導入工数がかかること、そして何より、開発メンバーに「未完成でもこまめに統合する」「テストコードを必ず書く」という新しいマインドセット(文化)へ移行してもらう必要があることです。

まとめ:こまめな「合体」がプロジェクトとチームを救う

開発終盤のインテグレーション地獄は、エンジニアの気力と体力を奪い、プロジェクトのスケジュールを無残に破壊します。

「継続的インテグレーション(CI)」は、決して一部の高度な技術力を持った会社だけのものではありません。「最後にまとめて合体させると痛い目を見るから、毎日こまめに合体させて、機械にチェックさせよう」という、非常に理にかなったリスクヘッジの仕組みです。

もしあなたの関わるプロジェクトで、リリース前の統合テストがいつも炎上しているなら、まずは「手元での開発期間を短くして、こまめに統合し合う」という小さなルール変更から試してみてはいかがでしょうか。その一歩が、チームを徹夜作業から救う大きな助けになるはずです。

1 ニコル・フォズグレン、ジェズ・ハンブル、ジーン・キム(著)、武舎広幸、武舎るみ(訳)『LeanとDevOpsの科学』インプレス、2018年、54ページ~55ページより
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次