PlayFramework2.2でCheckStyle,FindBugs,JaCoCo,PMD,CPDのレポート出力

PlayもSBTもよくわかっていない初心者がPlayFramework2.2(Java)プロジェクトの品質管理に取り組んだメモ。

下記を参考にさせていただきました。
http://qiita.com/mychaelstyle/items/da627864247472bb94c5

# やりたい事

PlayFramework2.2(Java)で作成したソースに対して下記レポート出力する。
JenkinsのJobでも同様のレポートを出力し、表示できるようにする。

* CheckStyle
* FindBugs
* JaCoCo
* PMD
* CPD

※JDK1.7対象

## project/plugins.sbtの編集
※改行を挟まないと有効にならない箇所があるので注意。

```project/plugins.sbt
// Comment to get more information during initialization
logLevel := Level.Warn

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

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

libraryDependencies ++= Seq(
  "com.puppycrawl.tools" % "checkstyle" % "5.5",
  "net.sourceforge.pmd" % "pmd" % "5.1.3"
)

// Use the Play sbt plugin for Play projects
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.3")

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

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

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

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

addSbtPlugin("com.etsy" % "sbt-checkstyle-plugin" % "0.4.0")
```

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

``` build.sbt
name := "Example-Project"

version := "1.0-SNAPSHOT"

libraryDependencies ++= Seq(
  javaJdbc,
  cache,
  filters,
  javaEbean,
  "org.webjars" % "bootstrap" % "3.0.0",
  "org.webjars" %% "webjars-play" % "2.2.0",
  "mysql" % "mysql-connector-java" % "5.1.24"
)

play.Project.playJavaSettings

jacoco.settings

findbugsSettings

cpdSettings

testNGSettings

com.etsy.sbt.Checkstyle.checkstyleSettings

resolvers += "webjars" at "http://webjars.github.com/m2"
```

Checkstyleのルールセットはプロジェクト直下にcheckstyle-config.xmlという名前で保存する。
(ファイル名は変えられるらしいが、よくわからなかったのでデフォルト)

使用したプラグインのURL
https://github.com/etsy/sbt-checkstyle-plugin


##Build.scalaを作ってPMDを実行する。
project/pmd-ruleset.xmlにPMDのルールセットを用意する。

```　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         = "Example-Project"
  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
    }
  }
}
```

##Jenkinsの設定

####ビルド→シェルの実行

```
PLAY_HOME=/usr/local/play-2.2.4

cd ${WORKSPACE}/example
${PLAY_HOME}/play jacoco:cover
${PLAY_HOME}/play checkstyle
${PLAY_HOME}/play findbugs
${PLAY_HOME}/play pmd
```

####ビルド後の処理
Checkstyle警告の集計

```
example/target/checkstyle-report.xml
```

Findbugs警告の集計

```
example/target/scala-2.10/findbugs/report.xml
```

PMD警告の集計

```
example/target/scala-2.10/pmd.xml
```

# まとめ

とにかく情報があまりないので、知識不足と相まっていちいちハマる。
CPDレポートは出力されるが0byteという問題を解決できず。

ようやくレポートが出るようになったところで、Playを2.3に上げることに。。

続き
[Play Framework 2.3でCheckStyle,FindBugs,JaCoCo,PMD,CPDのレポート出力](http://qiita.com/tamaco/items/933b157ac44d113cc67d)