Jenkins で Scala (lift) プロジェクトのテスト結果とカバレッジをグラフ表示する

ある日突然「Scala (lift) のプロジェクト作ったから Jenkins でテスト結果とカバレッジをいい感じで表示できるようにしておけよ」と言われて、一生懸命設定したときの内容をシェアする。

完成予想図

環境

  • sbt 0.7.5
  • sbt-coverage 0.2
  • junit_xml_listener 0.2
  • Jenkins 1.414
  • Jenkins Emma plugin 1.25
  • Jenkins sbt plugin 1.2

環境設定

sbt がインストールされている必要がある。
Mac OS X ユーザで homebrew ユーザなら

$ brew install sbt

でインストールされる。Scala のインストールは不要。
バージョンが少し古くても問題ない。

まずはローカルで試す

(1) Scala (lift) プロジェクトを用意する

ここでは説明のため、
Google Code Archive - Long-term storage for Google Code Project Hosting. にある
lift_sbt_prototype を利用する。

$ git clone git://github.com/lift/lift_sbt_prototype
$ cd lift_sbt_prototype
$ sbt update
(2) sbt のバージョンを 0.7.5 にする
$ sbt
> set sbt.version 0.7.5
> reload

project/build.properties が書き換わるのでコミットしておく。

(3) sbt-coverage の設定
$ sbt
> *undercoverRepo at http://undercover.googlecode.com/svn/maven/repository/
> *coverage is com.proinnovate sbt-coverage 0.2

sbt-coverage のページでは 0.1 を設定するように書かれているが
0.2 でないと動作しないので注意。

(4) junit_xml_listener の設定

Scala のテスト結果を surefire 形式で出力するプラグインの設定を行う

project/plugins/LiftProjectPlugins.scala (新規作成)

import sbt._

class ShimbashiShelfProjectPlugins(info: ProjectInfo) extends PluginDefinition(info) {
  val repo = "Christoph's Maven Repo" at "http://maven.henkelmann.eu/"
  val junitXml = "eu.henkelmann" % "junit_xml_listener" % "0.2"
}

project/build/LiftProject.scala (更新)

diff --git a/project/build/LiftProject.scala b/project/build/LiftProject.scala
index 859461f..ce65279 100644
--- a/project/build/LiftProject.scala
+++ b/project/build/LiftProject.scala
@@ -1,8 +1,12 @@
 import sbt._
+import eu.henkelmann.sbt.JUnitXmlTestsListener
 
 class LiftProject(info: ProjectInfo) extends DefaultWebProject(info) {
   val liftVersion = "2.0"
 
+  def junitXmlListener: TestReportListener = new JUnitXmlTestsListener(outputPath.toString)
+  override def testListeners: Seq[TestReportListener] = super.testListeners ++ Seq(junitXmlListe
+
   override def libraryDependencies = Set(
     "net.liftweb" % "lift-webkit" % liftVersion % "compile->default",
     "net.liftweb" % "lift-mapper" % liftVersion % "compile->default",

コードを書き換えたらアップデートしておく。コミットも忘れずに。

$ sbt update
(5) 実行してみる
$ sbt "coverage report html emmaxml"

target/scala_2.7.7/coverage/emma.xml
target/scala_2.7.7/test-reports/*.xmlXML ファイルができていれば OK。

Jenkins 上での設定

ローカルで行った sbt-coverage 0.2 の設定をビルドサーバ上でも行うこと。

sbt の設定


Emma の設定


JUnit の設定 (ついでに Javadoc の設定)

sbt-coverage は covertura のレポートも出力できることにはなっているが
0.2 では、正しい XML が吐かれなかったので Emma を使っている。

まとめ

継続的インテグレーションの中でテスト結果やカバレッジレポートをグラフで表示することはテストを書こうというモチベーションになる。
自分のコミットがカバレッジのグラフを右肩下がりにしてしまったときの罪悪感はなかなかのものである。
設定もそれほど難しくないので、とりあえず表示してみるのがオススメ。