【PHP版】CI(継続的インテグレーション)ツール導入ガイド:第1回 CIの概要

はじめに

CI(継続的インテグレーション)とは、開発、テスト、リリースのサイクルが継続的に行われていく様子の事であり、それらを円滑に行うためのツールがCIツールである。

CI全体の目的は品質の良いプログラムをリリースする事であり、そのためにCIツールは、プログラムコードの更新(コミット)とともに自動的にビルドやテストを行ったり、ドキュメントを更新したりする。
※こういった自動で実施する作業のことを「ジョブ」と言う。
また、CIを構成するさまざまなツールを実行するサーバーを 「CIサーバー」等と呼ぶ。CIサーバーでは実行されたテストの統計情報等を視覚化する事で、さらに品質を高めるための工夫が行われている。

本連載では CI の概要(第1回)を紹介すると同時に主に PHP プログラマ向けの CIツールを紹介し(第2回〜第4回)、実際に CIサーバーを構築してみる(第5回〜第6回)ところまで案内する。各章の概要は以下の通りである。

【CIツール導入ガイド】

CI とはどういう動作をする物か?

複数人での開発を行う時、プログラムコードのマージ(統合)が問題になる事がよくある。

マージの問題は、バージョン管理ツールだけでは解決できない。
これは単なる更新ファイルの衝突の問題ではなく、完全に独立したファイル同志であっても発生する問題だからだ。

例えば開発中に仕様変更が発生し、クラスを作る側と使う側とで微妙に認識がずれてしまうという事があるかも知れない。
こんな時はお互いに単体テストをするだけでは問題に気が付くのが難しいだろう。

リリース間際の結合テストで初めて問題が発覚し、大慌てで修正しなくてはならない可能性もある。

こういう問題を避けるためには、こまめにテストをするのが一番だ。

頻繁にリポジトリに登録するようにして、登録の度に単体テスト、結合テストを行う。
テスト以外にもコーディング規約にマッチしているかどうかをチェックしたり、コメントによる自動ドキュメント生成等も毎回できれば理想的だ。

これをリリースまで継続する事でプログラムの品質を高めていくことができる。

この工程を CI と呼ぶわけだが、これを開発者ひとりひとりが手作業で行っていくのは現実的では無い。

テストにはそれなりに時間が掛かるし、ちょっとしたコミットの度に毎回テストを行えと言っても、いつの間にかおざなりになってしまう事もあるだろう。

そこで専用の CIツールを利用して、自動化する事が必要となる。CIツールを利用すれば、リポジトリにプログラムを登録するだけで勝手にテストが自動的に行われる。

CIツールをインストールし、CI の自動化を担うサーバーを CIサーバーと呼ぶ。

CIサーバーはバージョン管理システムのリポジトリサーバーと兼用される事も多いが、独立して運用する事も、もちろん可能だ。

CIサーバーではプログラムコードのテスト以外にもさまざまな処理を実行できる。
正常にビルドできるかをチェックしたり、自動ドキュメント生成や静的コード解析(後述)等、品質を高めるためのさまざまなジョブを CIサーバーが一元的に管理するのだ。

問題があればメール通知・チャット通知やWEB画面で警告してくれるので、開発者はすぐに自分の間違いに気が付く事が出来るわけだ。


CI の前提条件

CI を行うためには、いくつかの前提条件がある。

バージョン管理を行っている事

プログラムのバージョン管理を行う事は、CI を行う上での第一の前提条件である。
昨今では Git や Subversion を利用してバージョン管理を行う事は、システム開発会社にとっては当たり前の事だろう。

しかしホームページ制作会社や自社の小規模システムを管理する部署等では、必ずしもそうではないのが現状だ。
もしまだバージョン管理を行っていないのなら、まずはそれから初めてみよう。
本サイトではバージョン管理ツールについても解説をしているので、参考にして頂きたい。

ソフトウェア開発者のための、バージョン管理の基礎勉強

テストを自動化している事

CIサーバーではプログラムの登録をトリガーとしてテストを行うので、テストが自動化されている事は必須では無いにせよ、重要な前提条件である。

バージョン管理が広く普及しているのに対し、テストの自動化は開発会社でもまだ採用に至っていない所は多いようだ。

テストの自動化を行う場合、「テストスクリプトの開発」というこれまでには無い作業を行わなければならず、スケジュールやコストへの影響も大きい。テストの自動化に興味があっても、それがネックとなり導入に踏み切れない事は多々あるようだ。

しかし、テストスクリプトを作らなくても自動テストができるとしたらどうだろうか? 例えば静的コード解析ではプログラムコードを実行する事なく分析し、さまざまな問題点を指摘してくれる。多少の初期設定は必要だが、各モジュールごとにテストスクリプトを記述する必要も無いので初期導入も保守も非常に簡単だ。

もちろん、テストスクリプトを記述してテストを行った方が良質なテストができる事は言うまでもない。しかし、静的コード解析を CI に導入するだけでも、従来より高い品質のプログラムをリリースできるようになるだろう。

本稿の第2回目以降では、静的コード解析を始めとする、 CI で利用可能なさまざまなツールを紹介したいと思う。

CIツールを稼働させる事

CI の専用ツールをインストールするための CIサーバーが必要になる。

CI は比較的重い処理が走るので、ある程度のスペックのサーバーが必要だと思って欲しい。

ユーザーが直接利用するサーバーではないだけにコストを抑えたい所だが、少なくとも 8GB 程度のメモリを独占的に利用可能なサーバーが望ましいだろう。

本稿の第5回目では、実際に CIサーバーを構築するまでの手順を紹介する予定だ。

なお、SaaS の CIツールにも色々な物がある。自前のサーバーを用意しなくて良い点は、SaaS の大きなメリットだ。

(Photo by:Magnus D)

さまざまな CIツール

CIツールには多くの製品が存在する。有償の物、オープンソースの物、SaaS型の物等、形態もさまざまであるが、その中から代表的な物をいくつか紹介しよう。

Jenkins

Jenkins 公式サイト:https://jenkins.io/

Java で記述された CIツールであり、リポジトリへの登録に連動しビルドやテスト等の登録されたジョブを実行し結果を視覚化する。

それぞれのジョブの警告がどのぐらい発生しているかの統計情報をグラフ化したり、問題の発生箇所を警告メッセージとソースファイルとを並べて表示したりできる。

各モジュールごとにプラグイン化されているため、対応言語も多く、さまざまな言語で利用可能である。

公式サイトには1000個以上のプラグインが登録されており、これらをインストールするだけで機能を追加できるのは大きな強みだ。

しかしプラグイン同志の相性問題等で動作が不安定になってしまう事もあるため、新しいプラグインを導入する時は注意しよう。

GitLab

GitLab 公式サイト:https://about.gitlab.com/

Ruby on Rails で記述された CIツールであり、Jenkins と同じく複数のジョブをコードの push に連動してまとめて実行できる。

GitLabは元々は GitHub のクローンとして登場したツールだが、Version 8以降、CIツールとしての機能が実装された。

そのため GitHub に慣れているユーザーにとっては導入しやすいツールと言える。

どのようなジョブを利用するかは、yamlファイルで設定を記述する。視覚化できる範囲は限定的だが、気軽に記述できる yaml ファイルで色々なツールを導入できる点は使いやすい。

一方、GitHub をモチーフしたアプリケーションであるだけに、リポジトリとして Gitしか想定されていない事は、Gitを導入していない環境においては大きな障壁になるかも知れない。

ただし Subversion等を Git と連携させる方法は色々あるので、工夫次第では補えるだろう。

AWS CodePipeline

AWS CodePipeline 公式サイト:https://aws.amazon.com/jp/codepipeline/

Amazon が提供する SaaS型の CD(継続的デリバリー)サービスである。

CD とは CI をさらに拡張し、デプロイまでを統合的に扱う手法である。

つまり、ソースコードをリポジトリに push するだけで、ステージング環境や本番環境の更新まで自動的に行ってくれるわけだ。

さらに AWS CodeStar とも連携が可能で、この場合開発環境の構築まで自動化してくれる。

もちろん、SaaS型であるが故に使用量に応じた料金を支払う必要がある。

また、EC2, S3, CodeCommit 等、さまざまな AWS (Amazon Web Service) の技術と連携した上で動作するため、本格的に利用するなら AWS に対する広範囲な知識が必要かも知れない。

AWS のアカウントがあれば手軽に始められるため、興味があれば是非一度は試して頂きたい。

まとめ

今回は CI導入ガイドの第1回 CI の概要を説明した。次回はCIの実行中に処理されるジョブの概要を説明する


社内サーバにリモートリポジトリを作るのも一つですが、「開発にまつわる面倒事」をこの際全部、tracpath(トラックパス)に任せてみませんか?
バージョン管理サービス・プロジェクト管理サービスの「tracpath(トラックパス)」では、
ユーザー5名、リポジトリ数3つまで、無料で利用可能です。

さっそく実務でも使って見ましょう。
自らも開発を行う会社が作ったからこそ、開発チームの「作る情熱」を支える、やるべきことに集中出来るサービスになっています。
エンタープライズ利用が前提のASPサービスなので、セキュリティも強固です。