.travis.yml

Travis CI

[21] Travis CI は、 CIWebサービスです。 この分野では草分け的存在です。

Travis CI 使ってみた

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

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

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

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

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

登録

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 の例

language: perl
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 は残念ながら用意されていませんでした...

追記 (2014年1月)

いつからか、

language: perl

... のように言語を明記しないと言語ごとのバリエーションが認識されなくなったようです。

現在は Perl 5.8 も追加されています。

環境変数

[32] Travis CI で実行中は環境変数TRAVISCI が設定されます >>33

[34] CI はいろいろな CI サービスで使われています。

実行完了後の処理を指定する

[6] after_success は、複数の job が実行されるとき、そのそれぞれで実行される。 すべての job が成功した時だけ実行する方法は公式には用意されておらず、要望はあるが長期間放置されている >>5

[12] もう何年も経っているので、なおす気がなさそう。。。

[8] Travis の API を使って他の job の実行状況を監視し、すべて成功していたら最後に一度だけ実行するスクリプト >>7 が利用者により公開されている。

[11] しかし 1つのjob の実行時間上限を超えるほど他の job の実行完了まで時間がかかると、 エラーになってしまいます・・・。

[10] after_success が失敗しても、失敗したことが無視されて全体として成功扱いになります。

[26] Build Stages - Travis CI () https://docs.travis-ci.com/user/build-stages

IRC over TLS で結果報告する

[9] IRC notifications over SSL and unstandard ports are undocumented · Issue #428 · travis-ci/docs-travis-ci-com ( 版) https://github.com/travis-ci/docs-travis-ci-com/issues/428

submodule を自動で update しない

[13] 今まで clone 時に submodule が自動的には init & update されていませんでしたが、 2016年4月に突然仕様変更があったようで、無限に再帰的に取得されるようになりました。

[15] .travis.yml

git:
  submodules: false
... と指定するとこの動作を無効化できます。

Mac OS X

[16] Mac OS X でのテスト実行はなぜか非常に待たされることがあります。 (実行環境が足りてないのでしょうか。)

ブランチでビルド成功したら自動的にマージしたい

[48] >>47 オリジナルバージョン。 matrix の全部のテストが終わるのを待機して、最後にやる。 (build stage がなかった頃に使っていたもの。)

[49] >>46 build stage 対応版。全部のテストが終わったら実行される stage で呼び出すもの。

メモ

[1] Travis CI: Welcome to Travis CI ( ( 版)) http://about.travis-ci.org/

[3] Validate your .travis.yml file ( ( 版)) http://lint.travis-ci.org/

[4] Travis CI 使ってみた - 若葉もすなる☆日記というもの ( ( 版)) http://d.hatena.ne.jp/wakabatan/20120408/1333878824

[23] 価格 https://travis-ci.com/plans

$129/月

デプロイ失敗後の処理をうまくやってくれない。失敗しても成功扱いになってしまう。

[17] ビルド中止ボタンがついていますが、まともに動かないことが多いです。 何度も押してやっと止まるか、止まらないか。

[20] ひどいときは中止完了で中止ボタンが出ないのに、なぜか実行中の表示のまま経過時間だけ無情に進み続けることもあります。

[18] Build not starting on OS X · Issue #6841 · travis-ci/travis-ci ( ()) https://github.com/travis-ci/travis-ci/issues/6841

[19] Customizing the Build - Travis CI ( ()) https://docs.travis-ci.com/user/customizing-the-build#Build-Timeouts

[22] Using Docker in Builds - Travis CI () https://docs.travis-ci.com/user/docker/

[24] Build Environment Overview - Travis CI () https://docs.travis-ci.com/user/reference/overview/

[25] Common Build Problems - Travis CI () https://docs.travis-ci.com/user/common-build-problems/

[27] Build Stages and allow_failures do not work well together · Issue #7789 · travis-ci/travis-ci () https://github.com/travis-ci/travis-ci/issues/7789

[28] キャンセル機能相変わらずまともに動かないなあ。 ちゃんと止まってるのか怪しいし、 Build Stages みたいな新機能だと忘れられてるし。。。

[29] The Travis CI Blog: Announcing support for open source projects on travis-ci.com () https://blog.travis-ci.com/2018-05-02-open-source-projects-on-travis-ci-com-with-github-apps

[31] travis コマンドは ruby と gem が必要な上に docker 版も公式で存在しないとか舐めてる。 Travis CI というサービス自体が Docker 時代の前からあるから、 時代に追いつけてないんだろうなあ...

[35] .org から .com に強制移転になって何かわけわからんくなったな。

[36] 移行が手動だしベータ機能扱いでベータを有効にしないと実行すらできないとか意味わからん、 なんでそんな状態で旧サービス廃止するんだよ。。。

[37] 完全移行するには gem でなにかインストールしてどうのこうのしないと駄目だよとか言い始めたぞ... 意味不明すぎる。

[39] 言われた通りに実行したら言われた画面がなくなってるが、 どうにかこうにか実行できたものの

Sorry, we could not find any repositories to migrate.

とか言われて草。真面目にやる気なさすぎだろwww

[38] もしかして Travis CI 捨てて他社サービスに移行する方が楽なんじゃね?

[40] Travis CI も昔はいいサービスだったんだけどなー

[41] 昔は OSS は完全無料だったのに、 travis-ci.com に強制移行させられ、 無料枠の範囲内だけ無料にサービスダウンしました。 中規模以上で活発に開発している OSS課金しないと使いものになりません。 上限に達すると自動停止されます。

[42] Travis CIのプラン改定 & open-source planに申し込んでみた - Qiita, https://qiita.com/TomoyukiAota/items/42987f1d20f06abb3b3c

[43] Travis CIOSS 向け無料提供は事実上終了した模様。

[44] こうなるともう他の CI サービスではなく Travis CI を選ぶ理由ってないような?

[45] 機能的には後発のサービスの方が充実してるし、無料枠も今となっては後発サービスの方がずっと大きいからなあ。