Play Framework 2.2でFindBugsとJaCoCo, PMD, CPDを利用してJenkinsで表示

Play FrameworkでFindBugs, JaCoCo, CPDによるチェックをおこなう。
sbtコミュニティリポジトリの追加が必要。

最新版のバージョンなどはリポジトリ内で確認した

+ http://dl.bintray.com/sbt/sbt-plugin-releases/de.johoop/
+ https://github.com/sbt/findbugs4sbt
+ https://github.com/sbt/cpd4sbt


project/plugins.sbtにリポジトリを追加する。typesafeのリポジトリに下に一行あけて追記した。

```scala:project/plugins.sbt
resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"

resolvers += "sbt community repository" at "http://dl.bintray.com/sbt/sbt-plugin-releases/"
```

同じくproject/plugins.sbtにプラグイン追加を追記する。

```scala:project/plugins.sbt

libraryDependencies ++= Seq(
  "net.sourceforge.pmd" % "pmd" % "5.1.0"
)

addSbtPlugin("de.johoop" % "jacoco4sbt" % "2.1.4")

addSbtPlugin("de.johoop" % "findbugs4sbt" % "1.3.0")

addSbtPlugin("de.johoop" % "cpd4sbt" % "1.1.4")

addSbtPlugin("de.johoop" % "sbt-testng-plugin" % "3.0.0")
```

プロジェクトフォルダ直下にbuild.sbtファイルを作成する。

```scala:build.sbt
import de.johoop.jacoco4sbt._
import JacocoPlugin._
import de.johoop.findbugs4sbt.FindBugs._
import de.johoop.cpd4sbt.CopyPasteDetector._

play.Project.playJavaSettings

seq(jacoco.settings : _*)

findbugsSettings

cpdSettings

```

project/Build.scalaからbuild.sbtへの移行がまだよくわかっていないのでとりあえずBuild.scalaを作ってPMDを実行する。
project/pmd-ruleset.xmlにPMDのルールセットを用意する。

ここを参考にさせてもらった。
https://github.com/ymasory/play-pmd-checkstyle

```scala:project/Build.scala
import sbt._
import Keys._
import play.Project._
import de.johoop.jacoco4sbt._
import JacocoPlugin._
import de.johoop.findbugs4sbt._
import de.johoop.findbugs4sbt.FindBugs._
import de.johoop.cpd4sbt.CopyPasteDetector._

object ApplicationBuild extends Build {

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

  val main = play.Project(appName, appVersion).settings(
    ProjectSettings.all: _*
  )  
}

object ProjectSettings {

  def all: Seq[sbt.Project.Setting[_]] = List(
    PmdSettings.all
  ).flatten

  object PmdSettings {

    val pmd = TaskKey[Unit]("pmd", "run PMD")
    val pmdTask = pmd <<=
      (streams, baseDirectory, sourceDirectory in Compile, target) map {
        (streams, base, src, target) =>
        import net.sourceforge.pmd.PMD.{ main => PmdMain }
        import streams.log

        val args = List(
          "-d",
          src.getAbsolutePath,
          "-f",
          "xml",
          "-R",
          (base / "project" / "pmd-ruleset.xml").getAbsolutePath,
          "-reportfile",
          (target / "scala-2.10/pmd.xml").getAbsolutePath
        )

        log info ("using pmd args " + args)
        trappingExits {
          PmdMain(args.toArray)
        }
      }
      val all = Seq(pmdTask)
  }

  def trappingExits(thunk: => Unit): Unit = {
    val originalSecManager = System.getSecurityManager
    case class NoExitsException() extends SecurityException
    System setSecurityManager new SecurityManager() {
      import java.security.Permission
      override def checkPermission(perm: Permission) {
        if (perm.getName startsWith "exitVM") throw NoExitsException()
      }
    }
    try {
      thunk
    } finally {
      System setSecurityManager originalSecManager
    }
  }
}
```

実行はplayコマンドのオプション

```shell-session:command
play jacoco:cover findbugs cpd pmd
```

レポートの出力先は下記の通り。

* target/scala-2.10/jacoco/
* target/scala-2.10/cpd/cpd.xml
* target/scala-2.10/findbuts/report.xml
* target/scala-2.10/pmd.xml

Jenkinsでこれらのレポートを読み込むには下記の記事の通り。

Jenkins+GradleでJavaのCIのための基本build.gradle設定 (JUnit,PMD,FindBugs,CPD,JaCoCo)
http://qiita.com/mychaelstyle/items/74baa62b7bf2fe81e309