世の中のみんなは今日も頑張ってOSSのミドルウェアを書いていることと思いますが、そんな我々に欠かせないのがTravis CIというサービスでして、OSSならCI環境を無料で使わせてもらえる! マジで最高のサービスだと思います。日本からだとUSの人達が元気な時間帯とズレてるせいか、pushしたあとビルドが走るのが早くて本当にありがたい。*1
で、CIを回すからには対象の言語バージョンといっしょにOSの違いも確認したい。標準の環境の Linux (Ubuntu) 以外に最近ではなんとOSX環境もあるので、ミドルウェアプログラミング野郎としてはやっぱり両方で動かしておきたいわけです。言語バージョンももちろんあれやこれや、古いの*2から新しいのまで色々動かしたい。
しかしそこには問題があって、有限のリソースというものがある以上、野放図に指定はできないわけです。
普通にバージョンを指定
単に組合せで指定したい場合は、こう:
# .travis.yml language: ruby rvm: - 2.1 - 2.2.3 - 2.3.0 - ruby-head - rbx os: - linux - osx
この設定を与えると Travis CI は rvm(rubyのバージョン) と os の組合せを掛け算して、5バージョン 2環境 の10ビルドを実行する。ただしこれは失敗してもいいやというものはあって、例えば ruby-head や rbx ではビルドは動かしておきたい、がコケても失敗とは見做さない*3、とかしたいことがある。この場合は allow_failures というやつでその指定をすることになる。
matrix: allow_failures: - rvm: ruby-head - rvm: rbx
ビルド条件をもっと細かく特定して指定
ただしこれも色々あって、言語バージョンの指定が割とざっくり("2.1" とか)しているならいいんだけど、細かくバージョンを指定したくなった場合、実はあれこれ制約が出てくる。Ruby 2.1といっても2.1.xの最新版で実行したいとなったりすると、まずどのバージョンがTravis上で使えるのかを調べる必要がある。Rubyの場合は以下のページ(言語ごとにあるのでドキュメントページから探そう)。
Travis CI: Precompiled Ruby Versions
これを見るとわかるのが、各OSのバージョンごとに使える言語バージョンが決まっている、ということだ。細かい言語バージョンまで指定する場合、それが動く環境を選ぶようにしてやる必要がある。*4
ということで、例えば Ruby 2.1.10 でテストを実行したければ OSX 10.10 もしくは 10.11 を指定する必要がある……んだけど、Travis CIのドキュメントを見てもぱっとわかるページがない。困ってたところ教えてもらった。ここにあった。
Building an Objective-C Project - Travis CI
Objective-C! いやまあ実際にはObjective-C環境もXcode自体も(直接的には)要らないんだけど、これを経由して間接的にOSXのバージョンを指定してやることができる。
これが本当にMacでしか動かないでいいビルドなら設定全体に osx_image を指定してやればいい。つまり、こう。
language: ruby rvm: - 2.1 - 2.2.3 - 2.3.0 - ruby-head - rbx os: - osx osx_image: xcode7.3 matrix: allow_failures: - rvm: ruby-head - rvm: rbx
しかし我々はLinuxでも走らせたいのでこれでは困る。ちなみに上記の設定で単純に Linux でも動かすようにすると*5、以下のようになる(ビルドがこけてるのは別の理由)。もしかしたら実害はないのかもしれないが、キモいしギョッとするのでこれはイヤだ。
ということで、環境の組合せを直接指定することになって、これは matrix のもうひとつの機能であるところの includes を使う。
language: ruby # http://rubies.travis-ci.org/ # See here for osx_image -> OSX versions: https://docs.travis-ci.com/user/languages/objective-c matrix: include: - rvm: 2.1.10 os: linux - rvm: 2.2.4 os: linux - rvm: 2.3.0 os: linux - rvm: ruby-head os: linux - rvm: 2.1.0 os: osx osx_image: xcode7.3 # OSX 10.11 - rvm: 2.2.4 os: osx osx_image: xcode7.1 # OSX 10.10 - rvm: ruby-head os: osx osx_image: xcode 7.3 # OSX 10.11 allow_failures: - rvm: ruby-head
これは勝手な想像だけど、Travis CIの内部的には rvm や os の組合せから matrix を作っているんじゃないかなーという気がする。で、この指定方法はその内部表現(に近いもの)を直接指定していることになる、んじゃないかな、たぶん。
やること自体はこれだけだけど、探し回ってもあんまり良い設定サンプルが無かったので、ここに書いておこうと思った。これで求めているビルド環境の組合せが作れた。
なお、matrixの元になる掛け算対象の設定項目リストは、それぞれの言語のドキュメントページにその名も "Build Matrix" として項目がある。