くりにっき

フルスタックキュアエンジニアです

Jenkinsを使った最高のマトリックステスト(2016年版)

マトリックステストとは?

複数のパラメータを掛けあわせてテストを実行することです

(例:Ruby 2.1系、2.2系、2.3系 x Rails 4.2系、5.0系 = 計6パターンのテストを行うこと)

Travis CIの方がもっと手軽に行う事ができるのでOSS開発の場合はそっちを使うといいと思います

参考

sue445.hatenablog.com

マトリックステストの行い方

「新規ジョブ作成」で「マルチ構成プロジェクトのビルド」でプロジェクトを作成します

f:id:sue445:20160203005735p:plain

マトリックスの設定」でテストしたい軸とパラメータを記述するだけです

f:id:sue445:20160203010642p:plain

実行結果

実際にジョブを実行するとこういう風になります

f:id:sue445:20160203011044p:plain

マトリックスの設定で設定したパラメータはジョブ実行時に環境変数にセットされているので、スクリプト内でrbenvとかによしなに渡してやればそのパラメータでテストを行うことができます

スクリプト

f:id:sue445:20160203011340p:plain

結果

f:id:sue445:20160203011222p:plain

問題点

Jenkinsでも簡単にマトリックステストが実践できますがいくつか問題点があります

軸の設定をジョブにハードコーディングする必要がある

ジョブが1つだけならいいんですが同じリポジトリ複数のジョブを作成した時に、パラメータを追加したい時は全てのジョブに設定を反映させる必要があります

除外設定が面倒

特定の組み合わせだけテストを除外したい(例:Ruby2.1系ではRails 5.0は動かないのでテストする必要ない)ような場合に、標準で使える「組み合わせフィルター」だとGroovy式で設定する必要があります *1

f:id:sue445:20160203011924p:plain

右上はスキップされたので色が薄いです

f:id:sue445:20160203012124p:plain

できないことはないのですが、複数条件になると見づらいし、さっきと同様ジョブにハードコーディングされているので条件変えたい時に全てのジョブに手動で反映させる必要があります。

俺はTravis CIみたいにリポジトリにコミットしたymlファイルでテストしたいんじゃああああああ!!!11111

というわけでJenkinsプラグインを作りました

Yaml Axis Plugin - Jenkins - Jenkins Wiki

github.com

先日ブログにも書いたので記憶に新しい人もいると思います。

sue445.hatenablog.com

今日リリースした v0.2.0でパラメータの特定の組み合わせのみ除外することもymlでできるようになりました!(Travis CIの matris.exclude とほぼ同等の機能)

使い方

こういうyamlファイルをリポジトリにコミットしておいて

# axis.yml
RUBY:
  - 2.1.8
  - 2.2.4
  - 2.3.0

RAILS:
  - 4.2.0
  - 5.0.0.beta2

exclude:
  - RUBY: 2.1.8
    RAILS: 5.0.0.beta2

ジョブの設定

Yaml Axisを選択

f:id:sue445:20160203012757p:plain

Yaml matrix execution strategyを選択

f:id:sue445:20160203012823p:plain

全く同様の結果が得られます

f:id:sue445:20160203014207p:plain

最初の例と違って動的に変化する値はリポジトリ内のymlから参照するため「パラメータを追加したい時に複数のジョブに設定を反映させる必要がある」という問題は解決しています。

また、除外設定もymlを利用するのでワンライナーのGroovy式よりは見やすいかと思います。

その他詳しいことはGitHubwiki を御覧ください。

Jenkinsでマトリックステストをガリガリやってる人は是非Yaml Axis Pluginをご利用ください!

*1:Groovy式がtrueで評価された時のみ実行