Travis CI 使ってみた

テストをいい感じで勝手に実行してくれるのないかなーと思ってたら、 Travis CI とかいうのがあると聞いたので、試しに使ってみました。

仕事では昔からそういうのやってて、最初は自分で作っていたり、最近は Jenkins 氏になっていたりしますが、適当なタイミングでテストが実行されて結果が IRC に流れてくる環境が整っています。仕事以外のプロジェクトもそうしたいと思っていましたが、自作にしろ既製品にせよ環境の構築と維持が面倒です。

Travis CI は Continuous Integration for the Open Source Community というキャッチフレーズ(?)の、 GitHub 上のソフトウェアの CI サービスです。 GitHub アカウントでログインしてリポジトリを選択して、あとはリポジトリ内に簡単な設定ファイル (言語とか実行するコマンドとか) を用意して push するだけで、あちらのサーバーで実行してくれます。とっても手軽で便利です。

開発・運用リソースはもちろん、サーバーや回線の費用も結構かかってるだろうに、どうやって運営しているんだ、と心配になってきますが、たくさんのスポンサーのみなさまが支えてくださっているそうで、とてもありがたい話です。

使い方はとても簡単なのでドキュメントを読みましょう。以下は使ってみて気づいたことなどのメモです。

登録

Travis 側でログインしてリポジトリを選ぶだけで登録できます。あとは push するだけ。簡単すぎて拍子抜けします。

ビルド

今回はいくつかの Perl のモジュールのテストを実行する処理を登録しています。 Perl のバージョンは何種類か用意されていて、リポジトリの .travis.yml で指定することができます。

ただし、最新の 5.14 を指定したのに、なぜか perl -v したら 5.12.4 と出てきました。不思議ですねw あらかじめ用意されていないバージョンがどうしても使いたければ、自分で perlbrew で入れてしまえばOKです。

Perl 本体と cpanm は元から用意されていますが、他に必要なモジュールがあれば、自分で入れる必要があります。 carton などで開発環境を簡単に用意できるように既になっていれば、そのコマンドを .travis.yml に指定するだけです。 XS モジュールが C のライブラリに依存しているような場合でも、 apt でインストールできるようです。

MySQL や MongoDB など、よく使われてそうなストレージは最初から用意されています。 Perl だと Test::mysqld でテストを書いたりしますが、特に何も設定しなくても普通に実行できます。

Perl など、言語のバージョンは複数指定できます。複数指定するとそれぞれ並行してビルドを実行してくれます。

テストスクリプトの出力はできるだけ綺麗にしておいた方がいいです。同じ出力が繰り返されていたり、一定サイズに達したりすると、無限ループと判断されて強制終了されるみたいです。 Wide character がうんたらみたいな Perl の警告を放置していたら、長いテストの途中で切られてしまいました。そこまでいかなくても、あまりにサイズが大きいと Web サイト上で結果を表示する時に動きがとても遅くなって不便です。

なお、ビルド環境は毎回リセットされるみたいなので、難しいことは考えずに必要なものはどんどん入れてしまってOKです。逆に言えば、依存モジュールのインストールなどの時間がかかる作業も毎回行う必要があります。

結果

実行結果は Web サイト上で確認できる他、メール、 IRC、 Web Hooks で通知を受け取ることができます。

Web サイトのトップにいきなり自分のプロジェクトが出てくるのでちょっとびっくりしますがw、それを選択すると実行の進捗や結果、履歴を見ることができます。

プロジェクトの IRC チャンネルがあれば、そこに通知を流すのが良さそうです。

時間帯などにもよるのかもしれませんが、 push するとほぼ即座にビルドが開始されるようです。ビルドにかかる時間はもちろんビルドの処理内容に依存しますが、わりとすぐに結果が返ってきます。

Jenkins なんかと比べると単純でできることも少ないですが、その分簡単ですし、普通に開発してテストして、という用途には十分なんじゃないでしょうか。

.travis.yml の例

perl:
  - "5.14"
  - "5.10"
before_install: git submodule update --init
install: "make test-deps"
script: "make test"
notifications:
  email:
    - foo@example.com
  irc:
    channels:
      - "irc.example.com#foo"
    use_notice: true

こんな感じのファイルをリポジトリに置いておきます。みんな大好き Perl 5.8 は残念ながら用意されていませんでした...

まとめ

Travis CI を使うと GitHub 上のソフトウェアのテストを簡単に自動実行させることができます。一度設定してしまえば何もする必要がありません。テストが落ちたら通知が来ます。