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のリポジトリに下に一行あけて追記した。
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にプラグイン追加を追記する。
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ファイルを作成する。
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
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コマンドのオプション
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