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の編集
※改行を挟まないと有効にならない箇所があるので注意。
// 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ファイルを作成する。
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のルールセットを用意する。
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のレポート出力