きままにものづくり

日々の気付いたことなんかを書いてます。

Play2.0.4+Jenkins+JUnitでScalaのテストを自働化

こんにちは、even_ekoです。
タイトルが少しややこしくなっています。

今日の記事の内容は、前回(PlayのScalaアプリケーションでテストを実行してみる - きままにものづくり)の続きになっています。
playのscalaアプリケーションをテストするというのが前回の内容でした。
今回は、そのテストをjenkinsで自働化しようということです。テストの結果やコードのカバレッジの結果も出力させちゃいます。
ちなみに、JUnitについて話していきますが、Specs2でも同様にできます。


Jenkinsについて

jenkinsについてはいたるところで詳細に解説されていますが、簡単に言ってしまうと高機能なcronです。
つまり、色んなことを勝手に実行してくれるということです。

jenkinsのインストールと設定はさくらVPS(CentOS6.3)へJenkinsをインストールして認証つけてURLを変更する - えんたつの記録が参考になります。

スクラム開発の環境を整える過程でjenkinsを導入したいというのなら、ALMnium(alminium/alminium · GitHub)を参考にしてみると良いかもしれません。
色んなツールのインストールと設定を自動でしてくれるのでとても便利です。しかし、mysqlのアカウントが既にあるとうまくインストールできなかったりします。その時は、専用のインスタンスを起ち上げたりする必要があるかもしれません。

macにインストールする場合は、[MAC]jenkinsインストール設定 | Memorandum blogが参考になります。

jenkinsの設定

jenkinsをインストールして、アクセスしてみると以下のような画面が出てきます。
写真はmacのローカルにインストールした際のものになります。いくつかジョブがありますが気にしないでください。
f:id:even_eko:20130227001743p:plain
設定する内容は以下のようになります。

  • JDKの設定
  • Gitの設定
  • Coberturaのインストール

JDKの設定

「Jenkinsの管理」->「システムの設定」とページを遷移させていくと、JDKの設定できる画面にたどり着けます。
f:id:even_eko:20130227003329p:plain
このページのJDKという項目の自動インストールというところにチェックを入れれば勝手に、ビルドする際にインストールしてくれます。写真はインストール後になっているので少し違っています。

Gitの設定

JenkinsはSVNCVSはデフォルトでサポートしているのですが、Gitはサポートしていません。そのため、プラグインをインストールする必要があります。
プラグインをインストールするページには、「Jenkinsの管理」->「プラグインの管理」でいけます。
利用可能タブをクリックした後、フィルターのところに「Git Plugin」と入力すれば目的のプラグインが出てきます。このプラグインですGit Plugin - Jenkins - Jenkins Wiki
リポジトリの設定などはジョブを作成する際に必要となります。

Coberturaのインストール

Coberturaはカバレッジレポートを作成してくれるプラグインです。antとmavenに対応しています。playはsbtを使用しているので、少し工夫をしないと使用することはできません。
インストールの仕方はgitプラグインと同様です。
少し、余談ですがビルドツールについてまとめておきます。

ant

Apache Ant - Welcome
javaのビルドツール。ビルドのルールをxmlを使用して記述できる。

maven

Maven - Welcome to Apache Maven
javaのプロジェクト管理ツール。antに比べたくさんの機能を持っている。

sbt

sbt — sbt Documentation
scalajavaのビルドツール。mavenと比べると機能は少ないがscalaをビルドしてくれる。

playの設定

jenkinsの設定の後は、playのソースに少し変更を加えます。playで作成したアプリケーションのツリー構造は以下のようになっています。
f:id:even_eko:20130227010519p:plain
アプリケーションの名前はtreeになっています。若干ややこしいですが...
この中のtree/projectにあるファイルに変更を加えていきます。

** scctの設定
scalaカバレッジレポートを作成するためにscct(scct - Scala Code Coverage Tool)を使います。
まず初めに、Build.scalaを変更します。

tree/project/Build.scala

import sbt._
import Keys._
import PlayProject._

object ApplicationBuild extends Build {

    val appName         = "tree"
    val appVersion      = "1.0-SNAPSHOT"

    lazy val s = Defaults.defaultSettings ++ Seq(ScctPlugin.instrumentSettings: _*)

    val appDependencies = Seq(
      // Add your project dependencies here,
    )

    val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA, settings=s).settings(
      // val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings(
      // Add your own project settings here
      parallelExecution in test := false
    )

}

変更箇所は、3つです。

lazy val s = Defaults.defaultSettings ++ Seq(ScctPlugin.instrumentSettings: _*)

ここでは、scctの設定を変数sに保存しています。

val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA, settings=s).settings(

scctの設定をplayのプロジェクトに設定しています。
このスタイルはGetting code coverage in the Play Framework using Jacoco - ronalleva.comを参考にしました。

parallelExecution in test := false

最後に、テストを並列で行われると何かと困る(詳しくはGetting code coverage in the Play Framework using Jacoco - ronalleva.com)ので並列実行しないように設定します。

次に、plugin.sbtを設定します。

tree/project/plugin.sbt

// Comment to get more information during initialization
logLevel := Level.Warn

// The Typesafe repository 
resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"

// Use the Play sbt plugin for Play projects
addSbtPlugin("play" % "sbt-plugin" % "2.0.4")

//追加した部分
resolvers += Classpaths.typesafeResolver

resolvers += "scct-github-repository" at "http://mtkopone.github.com/scct/maven-repo"

addSbtPlugin("reaktor" %% "sbt-scct" % "0.2-SNAPSHOT")

下の3行が追加した部分になります。
これで、scctの設定は終わりです。

sbt-simple-junit-xml-reporter-pluginの設定

少し名前が長いですが、sbt-simple-junit-xml-reporter-pluginはJUnitxmlレポートをsbtでも吐き出させるようにするプラグインです。
githubで公開されています(https://github.com/bseibel/sbt-simple-junit-xml-reporter-plugin)
sbtはmavenと違いレポートを吐き出す機能をデフォルトでは備えていないため、これが必要になります。
ちなみに、specsの場合はspecs側でそのような設定になっているのでプラグインは必要ありません。
scalaTestもそのような機能を含んでいるらしいです(Google グループ)。
しかし、playがサポートしているテスト・ツールはJUnitとspecsです。なので、scalaのテストをJUnitで行う場合は、このようなプラグインが必要になります。

sbt-simple-junit-xml-reporter-pluginの設定では、新しくplugin.scalaというファイルを作成します。

tree/project/plugin.scala

import sbt._

object Plugins extends Build {
  lazy val plugins = Project("plugins", file("."))
    .dependsOn(
      uri("git://github.com/bseibel/sbt-simple-junit-xml-reporter-plugin.git")
    )
}

gitにpushする

jenkinsにはgitリポジトリからソースをcloneするように設定するので、どこかのリポジトリに変更を加えたplayのソースをpushして下さい。

今までのもろもろの設定が面倒くさい、もしくはgitリポジトリなんてないという方は私のgithubにテスト用のソースを上げているのでそちらを使用してみて下さい。
https://github.com/iseki-masaya/playTestWithJUnit

Jenkinsのジョブを作成する

jenkinsのジョブを作成します。homeの画面の「新規ジョブ作成」から作成できます。
ジョブ名を記入後、フリースタイル・プロジェクトのビルドを選択して下さい。
f:id:even_eko:20130227015434p:plain

ソースコード管理システムのところでGitを選択し、リポジトリのURLを入力して下さい。
f:id:even_eko:20130227015721p:plain

次に、ビルドの項目でシェルの実行を選択し、以下のソースを記入して下さい。

rm -rf ./test-reports/*.xml
play clean
play test
play scct:test

f:id:even_eko:20130227020002p:plain
最初のrm -rf ./test-reports/*.xmlは、sbt-simple-junit-xml-reporter-pluginにより作成されるレポートを削除するためのコマンドです。
本当はAPP_ROOT/target/test-reportsのところにxmlを吐いて欲しいのですが、設定の方法が分からないのでこうなっています。

次に、ビルド後の処理の項目で、Cobertura カバレッジレポートの作成を選択します。
Cobertura XML レポートパターンのところにscctによって出力される結果のパスを入力します。

**/target/scala-2.9.1/coverage-report/cobertura.xml

f:id:even_eko:20130227020618p:plain

最後に、ビルド後の処理の追加を押し、JUnitテストの結果の集計を選択します。
sbt-simple-junit-xml-reporter-pluginによって出力される結果のパスを入力します。

**/test-reports/*.xml

f:id:even_eko:20130227020944p:plain

これで、保存を押します。
この状態で、ビルドの実行を押して結果を確認します。
f:id:even_eko:20130227021137p:plain

以上で自働化完了です。