千里の道も一歩から 継続的インテグレーションから始める継続的デリバリーへの道~Jenkinsを添えて

継続的インテグレーションとは?

継続的インテグレーションを知っていますか? 英語ではContinuous Integrationといい、よくCIと略されます。

継続的インテグレーションとは、ソフトウェアやサービス、システムが動作するか、こまめに確認しながら開発を進める開発手法です。継続的インテグレーションではこの動作確認のために、コンパイルやテスト、インスペクション、デプロイやソフトウェアのパッケージングなどの一連の流れを、できるだけ短いサイクルでインテグレーション(結合)します。

短いサイクルでインテグレーションするためには、コンパイルやテストなどの自動化が欠かせません。近年はJenkinsというオープンソースの使いやすいソフトウェアの登場とともに一気に世界中で普及しています。

継続的インテグレーションのメリット

継続的インテグレーションに取り組むと、次のメリットがあります。

1. 手戻りの削減、品質の維持

今日の日本におけるソフトウェア開発で一般的なウォーターフォール開発では、先にコーディングをして、モジュールごとにテストをし、最後にソフトウェアをインテグレーションします。この場合、たくさんの修正や変更が入り混じってしまい、もしバグが出てしまった時の解析はたくさんの変更を紐解かなければならず、困難を極めます図1⁠。

継続的インテグレーションでは、コミットごとなどの可能な限り小さな変更でソフトウェアにバグが入っていないかを確認できるため、手戻りが減り、常に一定の品質を維持し続けられます。

図1 普通の開発と継続的インテグレーションの違い
図1 普通の開発と継続的インテグレーションの違い

2. いつでも、だれでも、実行可能なソフトウェアが作成できる

このメリットには2つの側面があります。

1つ目は、ビルド端末や特定の開発端末など、特定の端末でしかソフトウェアの作成ができないような暗黙知をなくし、属人性を排除できることです。リリースまでの一連の流れをすべて自動化できれば形式知化でき、組織を強化できます。

2つ目は、開発者だけではなく、デザイナや場合によってはエンドユーザまで、だれでも期待したものができあがっているか、確認しながら開発ができることです。これにより、期待したものと違うものができてしまうリスクを軽減できます。

3. 作業コストを削減できる

継続的インテグレーションでは、コンパイルやテスト、デプロイなどの一連の作業を自動化します。これらの一連の流れを手動で繰り返すのは現実的ではありません。このような単純作業を自動化すると、余った労力は人間にしかできない設計や実装などの知的な作業に集中できるようになります。

4. 機械による作業の正確さ/暗黙知を形式知に

人間の手作業を繰り返すと、どんなに注意していてもミスが起きてしまいます。しかし自動化をすることで作業を正確にこなすことができます。

自動化をするためには、属人的な暗黙知をスクリプトなどの形式知にする必要があり、暗黙知を形式知に変えられます。

5. 品質や生産性を継続的に分析・カイゼンし続けられる

品質や生産性を分析するためには、データを計測する必要があります。データを計測して、分析し、そしてカイゼンをします。つまり、計測できないものはカイゼンできません。

継続的インテグレーションでインテグレーションするたびに、その結果を自動的に計測して分析し、開発をカイゼンし続けましょう。

継続的インテグレーションの歴史

継続的インテグレーションの歴史は長く、体系化される以前も、人間が働いていない夜間などにインテグレーションを自動的に行なっていました。これによってできたソフトウェアをナイトリービルドやデイリービルドと呼んでいました。オープンソースソフトウェアに馴染みのある方は、目にしたことや、実際にナイトリービルドを試してみたこともあるのではないでしょうか。

継続的インテグレーションが開発手法として確立されたのは1999年頃です。アジャイルソフトウェア開発の方法論の一つである「エクストリーム・プログラミング(XP⁠⁠」の実践手法(プラクティス)の一つとして確立されました。エクストリーム・プログラミングでは、刻一刻と変化するビジネス環境やニーズに柔軟に対応するために、継続的インテグレーションを実施し、常に動作するソフトウェアを確認しながら開発するスタイルを取っています。他にも、Test Driven Development(TDD)やペアプログラミングなどでも実践されています。

加えて、近年継続的インテグレーションを実践しやすくなった土壌として、クラウドコンピューティングを代表とするように、計算機のリソースがほぼ無限大に使えるようになった点が挙げられます。短いサイクルでインテグレーションをするためには、大量の計算機が必要となり、結果を蓄積するためにも大量のディスクが必要です。近年は大幅に計算機のリソースが安価になり、継続的インテグレーションが普及したきっかけになったといえるでしょう。

これまでに説明したとおり、継続的インテグレーションのメリットはアジャイル開発にとどまらないため、アジャイル開発やエクストリーム・プログラミングではない開発スタイルでも実践されるようになりました。

継続的デリバリーへの道

継続的インテグレーションでカイゼンを続けると商用(プロダクション)環境にも、自動で継続的にデプロイできるようになります。一日に何度もデプロイをして、ユーザの行動やコンバーション、フィードバックを即座にソフトウェアに反映する開発スタイルが確立されてきました。これを継続的デリバリーといいます。例えば、FacebookやTwitterなどのWebサービスが予告なしにUIを変更していることを経験したことがある人も多いでしょう。

継続的インテグレーションを継続的デリバリーにつなげていくには、⁠どのようにサービスを停止せずにリリースをするか?」⁠ユーザの声をどのように集めて反映していくか?」といった更なる工夫が必要になってきます。

IT業界は栄枯盛衰、いち早く機能をリリースし、ユーザの声をいち早く取り入れ、サービスやソフトウェアをカイゼンし続けなければ、あっという間に廃れてしまうため、多くの企業にとって、継続的デリバリーの重要度はましています。

継続的インテグレーションを支えるツール

継続的インテグレーションを実践するのに欠かせないのがツールの存在です。

コンパイルではビルドツールがよく用いられます。古くはmakeがビルドツールとして有名であり、JavaではMavenやGradleがよく使われています。最近のビルドツールはコンパイルだけではなく、テストのトリガーとして使えたり、レポートを出力できたりと、高機能なものが多いです。加えて、ビルドした成果物はバイナリリポジトリに格納し、配布することがよくあります。バイナリリポジトリではArtifactoryやNexusが有名です。一般的なWebDavサーバも使われます。

ユニットテストではJUnitに代表されるxUnitがよく使われます。Pythonにはunittestというユニットテストライブラリが含まれています。

画面結合テストでは、Seleniumというオープンソースの画面テスト自動化ツールがよく用いられます。Seleniumは画面の遷移や画面要素からの値の取り出しなどをサポートしています。

デプロイでは、最初にプロビジョニングというハードウエアやOSのセットアップが必要です。最近ではクラウドコンピューティングを使うことが多く、CLIやSDKからプログラミングしてインフラストラクチャをセットアップします。また、OSやミドルウェアの設定はChefやAnsibleといったオーケストレーションツールを使うことが多いでしょう。最終的なソフトウェアのバイナリはFabricやCapistranoといったデプロイツールを使って、一気に配布します。

これらの一連の作業はすべてスクリプト化し、Git(GitHub)やSubversionといったバージョン管理ツールでバージョン管理をするのが鉄則です。

これらのツールを組み合わせて実行し、結果を通知したり、保存したりするのが継続的インテグレーションツールです。今日世界のデファクトスタンダードといえるのがJenkinsというオープンソースの継続的インテグレーションサーバです。

継続的インテグレーションツールJenkins

Jenkinsはバージョン管理ツールと連携し、コンパイルやテストなどのインテグレーションを実施して結果を保存し、開発者に通知します図2⁠。

図2 継続的インテグレーションの中心にJenkinsがある
図2 継続的インテグレーションの中心にJenkinsがある

Jenkinsは、多様な言語への対応やセットアップの手軽さ、Webブラウザだけで操作できる操作性、プラグインアーキテクチャによる自由度の高さ、オープンソースであること、ユーザコミュニティなど、たくさんのメリットがあります。

継続的インテグレーションを始めるのに最適な一冊

Jenkinsはその自由度の高さゆえ、何から始めて良いのかわからないという声をよく聞きます。そのようなこれからJenkinsを使った継続的インテグレーションを始めたい人に、約4年前に出版した書籍が『Jenkins実践入門』です。その改訂版である改訂新版Jenkins実践入門――ビルド・テスト・デプロイを自動化する技術をこの度刊行しました。もちろん、この4年間のJenkinsやJenkinsを取り巻くツールの変化に対応しています。

これからJenkinsに取り組む方にはもちろんのこと、分散ビルドやビルドパイプライン、ビルドプロモーションなどの継続的デリバリーに向けたより高度なトピックも紹介しています。また、Infrastructure as CodeやImmutable Infrastructureなどもコラムで紹介しています。

Jenkinsという名前は、プロジェクトに優秀な執事がいてほしいという思いからつけられています。皆さんのプロジェクトにも、ぜひ『改訂新版Jenkins実践入門』を片手に、新しい優秀なプロジェクトメンバーを迎えてください。

この記事で使われているJenkinsのロゴは、Jenkins projectに帰属し、Creative Commons Attribution-ShareAlike 3.0の元に再利用が許諾されています。

佐藤聖規(さとうまさのり)

クラウドやアーキテクチャ,DevOpsなどの コンサルティングに従事。インフラ,Jenkinsやその周辺ツールが得意。著書は多数,織田翔名義で『15時間でわかるGit集中講座』,『Java逆引きレシピ』。

Twitter:@lino_s