GitHubと連携できる継続的インテグレーションツール「Travis CI」入門

開発の現場ではビルドやテストを自動化して継続的に実行していく「継続的インテグレーション」(CI)が近年普及しつつある。CIを支援するためのツールはいくつかあるが、今回はGitHubと連動し、指定したリポジトリ上にあるコードを自動的に取得してビルドやテストを実行できるサービス「Travis CI」を紹介する。

Travis CIで手軽に継続的インテグレーションを導入

「継続的インテグレーション(CI)」とは、ソフトウェア開発過程において頻繁にテストを行うことで問題を早期に発見し、品質の向上を図る開発手法である。しかし、テストを毎回手動で行うのには手間がかかる。そこで特定のタイミングで自動的にテストを実行し、テスト完了後にその結果を通知する「CIツール」などが利用される。

CIツールとしてよく知られているものとして「Jenkins」などがあるが、多くのツールでは独自にテストのための環境を構築しなければならない。今回紹介する「Travis CI」はGitHubと連携した自動テスト実行サービスで、サービス提供側のサーバー上でテストが実行されるため、最小限の設定のみでCIを導入できるのが特徴だ(図1)。

図1 Travis CIのトップページ
図1 Travis CIのトップページ

Travis CIでできること

Travis CIはドイツのTravis CI社によって運営されているサービスだ。Travis CI社は同社のサービスを非オープンソースのソフトウェア開発プロジェクト向けに有料で提供することで収益を得ており(Travis CIの料金プラン一覧)、オープンソースソフトウェア向けには無償でサービスを提供している。また、そのソースコード自体もすべてオープンソース化され、GitHub上」で公開されている。

Travis CIが持つ主要な機能としては、以下が挙げられる。

  • 設定したGitHubリポジトリから自動でソースコードをチェックアウトしてあらかじめ指定しておいたビルドやテスト処理を実行する
  • テスト結果をTravis CIのサイト上や各種API、メールなどで開発者に通知する
  • テストが正常に完了して問題がなかった場合、あらかじめ指定しておいたホスティングサービスにソフトウェアをデプロイする

これらはすべてTravis CI社が運営するサーバー上で実行され、テストを実行するための環境もTravis CIが用意してくれるため、開発者側で独自のテスト環境を用意する必要は無い。さらにテストの実行はリポジトリへのプッシュ時に自動的に実行されるため、開発者はTravis CIの存在を意識せずにビルド/テスト結果を受け取ることが可能だ。

いっぽう、Travis CIはあくまでビルド/テスト環境を用意するだけであり、当然ながらテスト自体は用意してくれない。実行するビルドやテスト処理はリポジトリ内に配置した「.travis.yml」というファイルで記述する仕組みとなっており、任意のコマンドが実行可能だ。そのため、すでにプロジェクトで使用していたテストを自動実行させる、といったことも簡単に行える。

ちなみにTravis CIではさまざまな言語で実装されたソフトウェアのビルドおよびテストに対応している。また、テストの実行環境はLinux(Ubuntu)となっているが、Objective-Cで実装されたプログラム向けにMac OS X環境でテストを実行する機能も用意されている。

Travis CIを使ってみる

それでは、実際にTravis CIを利用するための流れを紹介していこう。まずTravis CIを利用するにはGitHubのアカウントと、テストしたいプログラムが含まれるGitHubリポジトリが必要だ。これらを用意していない場合は、事前に用意しておこう。

また、Travis CIを無料で利用できるのは一般公開されている(publicな)リポジトリのみだ。GitHubの有料プランを使用して作成したプライベートリポジトリをTravis CIと連携させる場合、有料プランの契約が必要となる。なお、その場合もプロジェクト設定を行ってから最初の100ビルド分まではトライアルとして無料で利用できる。

また、Travis CIへのログインはGitHubアカウントを利用する形で行う。Travis CIトップページ右上の「Sign in with GitHub」ボタンをクリックするとGitHubの認証ページが表示されるので、そこで連携させたいアカウントが表示されているのを確認して「Authorize application」をクリックすれば良い(図2)。

図2 GitHubの認証ページ

 Travis CIにログインすると「Getting Started」画面が表示されるので、ここでの指示に従ってテスト設定ファイルの作成やリポジトリの登録の作成を行うことになる(図3)。

図3 Travis CIへのログイン直後に表示される「Getting Started」ページ

テスト設定ファイルの作成

Travis CIでは、「.travis.yml」というファイルをリポジトリのルートディレクトリ内に配置することでビルドやテストの設定を行う仕組みになっている。このファイルは拡張子からも想像できるとおり、YAML形式で記述する。さまざまな設定項目が用意されているが、最低限必要なのはビルド環境の設定と、ビルドの際に実行するコマンドの指定だ。

使用する言語言語環境の設定

Travis CIではビルドやテストをそれぞれ隔離された仮想環境内で実行するようになっている。言語ごとに異なる仮想環境が用意されており、ユーザーはそこからビルドに使用する環境を選択して利用する(リスト1)。

リスト1 Travis CIで用意されている言語環境

ANDROID
C
C#
C++
Clojure
Crystal
D
Dart
Erlang
F#
Go
Groovy
Haskell
Haxe
Java
JavaScript
Julia
Objective-C
Perl
Perl6
PHP
Python
R
Ruby
Rust
Scala
Visual BASIC

使用する言語環境は、.travis.ymlファイルの最初に「language: <言語>」という形で記述する。たとえばPythonを利用するのであれば以下のようになる。

language: python

また、PythonやPerl、PHP、Rubyなど、言語環境によってはバージョンの異なる複数の処理系が用意されているものもある。たとえばPythonの場合、バージョン2.6および2.7、3.2~3.5、さらに開発中のブランチ(nightly)やPyPy(Pythonで実装されたPython実行環境)でもテストを行える。利用する言語環境については、次のように「言語環境名:」に続けてリスト形式で指定する。

python:
  - "2.6"
  - "2.7"
  - "3.2"
  - "3.3"
  - "3.4"
  - "3.5"

たとえば上記のように指定した場合、テストはPython 2.6および2.7、3.2~3.5で実行される。言語環境ごとに指定できるパラメータについては、Language-specific Guidesドキュメントを参照して欲しい。

使用するライブラリや環境変数の指定

Travis CIでは、ビルドを実行するたびに指定された言語環境に応じた仮想環境を起動してリポジトリ内のファイルを展開し、続いてビルド作業を実行する。そのため、リポジトリに含まれていないライブラリなどがビルドに必要な場合は、あらかじめそれらをインストールするよう指定しておく必要がある。

これらの作業は「installステップ」と呼ばれており、.travis.ymlファイル内で「install:」に続けてインストール処理を記述することで処理内容を指定できる。

PythonやRuby、Perlなどのライブラリを利用したい場合は、各言語で提供されるパッケージマネージャを利用してパッケージのインストールを行える。たとえばPythonであれば次のようにpipコマンドが利用できる。

install:
  - pip install <インストールするパッケージ>

同様にRubyであればgemコマンドやbundleコマンド、Perlであればcpanmコマンドでパッケージのインストールが行える。もちろん、複数のコマンドを記述することも可能だ。その場合、記述された順番で処理が実行される。

また、Travis CIで利用されるコンテナは言語環境としてObjective-Cを選択した場合を除いてUbuntu(記事執筆時点ではUbuntu 12.04 LTS Serverの64ビット版)で構築されており、次のように指定することで特定のソフトウェアパッケージをインストールできる。

addons:
  apt:
    packages:
    - <パッケージ名1>
    - <パッケージ名2>
    
    

デフォルトではUbuntuの標準リポジトリからパッケージをインストールするが、それ以外のリポジトリを利用することも可能だ。これらに付いて詳しくは、Travis CIの「APT Sources and Packages」ドキュメントを参照して欲しい。

パッケージマネージャが提供されていない言語や、パッケージマネージャでインストールできないパッケージを利用したい場合は、インストールを行うシェルスクリプトなどを用意して実行させることで対応できる。Travis CIではリポジトリのトップディレクトリ内で各種処理が実行されるので、リポジトリ内にこのようなシェルスクリプトを用意しておき、次のようにしてこれを実行するよう指定する。次の例では、「bin/ci/install_dependencies.sh」というファイルにインストール用スクリプトを記述して呼び出している。

install:
  - ./bin/ci/install_dependencies.sh

ちなみに、インストールにroot権限が必要なソフトウェアを利用したい場合、sudoコマンドを利用することもできる。その場合、事前に.travis.ymlファイル内で「sudo: required」というパラメータを指定しておく必要がある。ただし、このパラメータが指定されると、コンテナベースのビルド環境ではなく仮想マシンベースのビルド環境を利用するようになるため、ビルドに必要な時間が増える点には注意したい。

sudo: required

また、特にinstallステップで実行すべき作業がない場合は以下のように「true」を指定しておく。

install: true

ビルド内容の記述

実際にソフトウェアのビルドやテストを行うステップは「scriptステップ」と呼ばれており、.travis.ymlファイル内では「script:」に続けてその内容を記述する。

たとえばC/C++やObjective-Cなどのコンパイル型の言語であれば、ここにmakeなどのコンパイル処理などを記述する。次の例は、configureを実行後にmakeを実行し、続いてテストを実行するものだ。

script: 
  - ./configure && make && make test

また、次の例はRubyでrakeを使ったテストを実行するものだ。

script:
  - rake test

scriptステップでも複数のコマンドの記述が可能で、記述された順番で処理が実行される点も同じだ。

ビルドに成功した際にデプロイを行う

Travis CIではビルドの成功後、自動的に作成したパッケージを指定したクラウドサービスやパッケージリポジトリにアップロードする機能がある。対応サービスなどの詳細についてはTravis CIのドキュメントを参照して欲しいが、クラウドサービスとしてはGoogle AppEngineやHeroku、OpenShift、Amazon Web Service(AWS)など、パッケージリポジトリとしてはPyPIやRubyGems、npmなどがサポートされている。また、GitHubのリリースページやAmazon S3にバイナリやアーカイブをアップロードすることも可能だ。

デプロイ時に実行する処理は、.travis.ymlの「deploy:」以下に記述する。たとえばGitHubのリリースページに指定したファイルをアップロードするには、次のように記述する。

deploy:
  provider: releases
  api_key: "<GitHubのOAuthトークン>"
  file: "<アップロードするファイル>"
  skip_cleanup: true
  on:
    tags: true

そのほかのビルドステップ

Travis CIでは、「before_installステップ」や「before_scriptステップ」、「before_deploy」といったステップも用意されており、先に説明したinstallステップやscriptステップ、depoyステップの直前に処理を実行することも可能だ。これらを含めて定義されているのは次の9つのステップとなる。

1. before_installステップ
2. installステップ
3. before_scriptステップ
4. scriptステップ
5. after_sucessもしくはafter_failureステップ
6. before_deployステップ
7. deployステップ
8. after_deployステップ
9. after_script

ちなみに5.のafter_sucessおよびafter_failureステップは、scriptステップで実行した処理に成功した場合に前者が、失敗した場合は後者の処理が実行される。

なお、これらすべてのステップについて記述する必要は無い。最低限必要なのはinstallおよびscriptステップの2つだけだ。

テストコードの戻り値

Travis CIでは、各ステップで実行されたコマンドの返り値を使ってその成否を判断している。一般的には0が返された場合に成功、それ以外の値が返された場合は失敗と判断される。

ちなみにbefore_installおよびinstall、before_scriptで指定された処理でエラーが発生した(0以外の戻り値を返した)場合、ビルド作業はエラーとなり終了するが、scriptステップで指定された処理でエラーが発生した場合、その後の処理自体は継続される。ただし、ビルドは失敗したものと見なされ、その後の処理は実行されない。

また、after_successおよびafter_failure、after_scriptステップでエラーが発生しても、ビルド結果に影響はない。

Travis CIへのリポジトリ登録

リポジトリ側に設定ファイルを用意したら、続いてTravis CI側での登録作業を行う。Travis CIにログインした状態でTravis CIのProfileページ」にアクセスするとリポジトリ一覧が表示される。ここでTravis CIとの連携を行いたいリポジトリを選び、スライダ部分をクリックすると連携が有効になる(図4)。

図4 Travis CIのリポジトリ設定画面

 連携を行うと、Travis CIのトップ画面に登録したリポジトリが表示されるようになる(図5)。

図5 Travis CIのトップ画面

 ただし、Travis CIではリポジトリへのプッシュ時にテストが実行されるため、この時点では何も表示されない。実際のビルドは次のプッシュ時から行われるようになる。

テスト結果の確認

.travis.ymlファイルの作成やリポジトリ登録を行った後、リポジトリに対してなんらかのコミットを行ってそれをGitHubにプッシュするとビルドが実行され、その進捗や結果がTravis CIのコンソール画面(https://travis-ci.org/<ユーザー名>/<リポジトリ名>)に表示される。ビルドが成功すれば、図6のように「build passing」というステータスが表示される。

図6 ビルド成功時のコンソール画面

 いっぽうビルドが失敗した場合、図7のように赤字で「×」が表示され、どの環境でどのようなエラーが出たのかを確認できる。

図7 ビルド失敗時のコンソール画面

 ここではビルドを実行した環境毎にエラーメッセージが表示される。それぞれの環境表示をクリックすると実行ログが表示され、詳細なビルド環境やエラーメッセージを確認できる(図8)。

図8 実行ログや環境の詳細を確認できる

 この例の場合、指定したファイルが存在しないためにエラーが発生していることが分かる。

テスト結果の通知

Travis CIでは、ビルド結果をメールやIRCで通知する機能が用意されている。まずメールでの通知だが、これはコミット時に使われたメールアドレス(コミットログで「Author:」として記録されているメールアドレス)に対して送信される。ただし、このメールアドレスに対応するGitHubアカウントが存在しない場合や、そのコミット者がそのリポジトリへのアクセス権を持っていない場合には通知メールは送信されない。また、デフォルト設定では通知が行われるのは以下の場合のみで、ビルド毎に通知が行われるわけではない。

  • ビルドに失敗した場合
  • ビルドに失敗していたものが修正され成功した場合

.travis.ymlファイルの「notifications」以下に次のようにメールアドレスを記載することで、特定のメールアドレス宛にビルド結果を通知することも可能だ。

notifications:
  email:
    - <通知先メールアドレス1>
    - <通知先メールアドレス2>
  
  

IRCでの通知を行う場合も同様に「notifications」以下で指定する。

notifications:
  irc:
    - <通知先チャンネル1>
    - <通知先チャンネル2>
  
  

そのほか通知関連ではCampfireやHipChatといった外部サービスに通知を送ったり、特定のWebhookを実行することも可能だ。これらについてはドキュメントの「Configuring Build Notifications」ページに記載されているので、詳しくはこちらを参照して欲しい。

ビルドステータスアイコンを表示させる

Travis CIを使っているプロジェクトの多くでは、GitHubのリポジトリページにビルドの成否を示す「バッジ」が表示されている。このバッジはTravis CIが提供しているもので、GitHubリポジトリページに表示されるReadmeファイルに指定されたURLの画像を埋め込むことで実現されている。

画像のURLは、Travis CIのコンソール画面で表示されているバッジをクリックすると表示される(図9)。

図9 Travis CIのコンソール画面でバッジをクリックするとURLが表示される

 ドロップダウンでMarkdownなどの形式を指定して埋め込みコードを表示させることも可能だ。このコードをコピーしてReadmeファイルに挿入すれば、GitHubのリポジトリページにバッジが表示される(図10)。

図10 Readmeファイルにバッジのコードを埋め込むことでGitHubにビルドの成否を表示できる

手軽にCI環境を構築でき、周辺ツールも豊富

このように、Travis CIは設定ファイルを1つ用意するだけで簡単にCI環境を構築できる手軽さが特徴だ。さらに、Travis CIではAPIが提供されており、これを使って独自に情報を表示したり、travis CIを操作できるサードパーティ製クライアントやツールも登場している。これらクライアントやツールなどはTravis CIの公式ドキュメントでも紹介されているので、試して見るのも良いだろう。

また、今回紹介していない機能として、テスト用のデータベースの提供やテストツール「Selenium」を利用したWebブラウザ環境でのテスト機能なども用意されている。これらを利用することで、データベースが必要なテストをTravis CI上で実行したり、実際のWebブラウザを使ってテストを実行するといったことが可能になる。そのほか、GitHubのプルリクエスト機能と連動してその内容をテストすることもできる。こちらは多人数での開発時などに有用だろう。

前述の通り、Travis CIはオープンソースのプロジェクトであれば無料で利用でき、またクローズドなプロジェクトでも比較的現実的な料金での利用が可能だ。実際に試して見ると分かるが、リポジトリ上のコードの状態を常に把握できるというのは非常に便利である。CIを未体験の方は、ぜひ一度試して見てはいかがだろうか。