JenkinsでScalaのCI環境を構築する


最近、Scalaを書き始めてみました。
並列処理が書きやすくて、うまく書けたときは面白く感じますが、まだまだ言語の仕様を覚えきれてなかったり、そもそも関数型言語としての書き方ができていないかなーという感じです。

そんな中、ちょっとしたアプリを作る機会があったので、ScalaのCI環境を作りしながら進めてみました。
手順をメモがてら残しておこうと思います。
利用したツールの構成としては、Jenkins + ScalaTest + scoverage + Scalastyle な感じです。

とりあえずJenkinsでテストを動かすまで

Scalaプロジェクト側の設定

ScalaTestの設定

利用するテストフレームワークのライブラリを設定する。
build.sbtのlibraryDependenciesに以下の内容を追記する。

"org.scalatest" % "scalatest_2.11" % "2.2.4" % "test"

テストコードを書く

今回は、以下のような簡単なテストを書いてコミットしておきます。

src/main/scala/CITestClass.scala
class CITestClass(val version: Int, val name: String) {}
src/test/scala/CITestClassTest.scala
import org.scalatest.FunSuite

object CITestClassTest {
  def createTestInstance(): CITestClass = {
    new CITestClass(1, "test")
  }
}

class CITestClassTest extends FunSuite {

  test("testName") {
    val testInstance = CITestClassTest.createTestInstance()

    assert(testInstance.name == "test")
  }

  test("testVersion") {
    val testInstance = CITestClassTest.createTestInstance()

    assert(testInstance.version == 1)
  }
}

Jenkins側の設定

sbt pluginのインストール・設定

  1. ダッシュボードより Jenkinsの管理 > プラグインの管理 の順に選択。
  2. 利用可能タブからsbt pluginを選択し、インストールする。
  3. ダッシュボードより Jenkinsの管理 > システムの設定 の順に選択。
  4. Sbtの項目で"Sbt追加"ボタンを押下。sbtの設定画面が出てくるので、nameにsbtの設定名を入力する。今回は、sbtの管理をJenkinsさんに計らってもらいたいので、 自動インストールにチェックを入れsbtのバージョンを選択。
  5. "保存"ボタンを押下し、設定を完了する。

ScalaのCIを行うジョブの作成

  1. ダッシュボードより、新規ジョブ作成を選択。
  2. フリースタイル・プロジェクトのビルドを選択して"OK"を押下する。
  3. ジョブ設定画面に遷移するので、まずはソースコード管理項目にコードの取得元リポジトリの設定を行う。(バージョン管理ツール毎にやり方が変わるので省略)
  4. ビルド手順の追加からBuild using sbtを選択。sbt launcherで利用したいsbt設定を選択し、Actionsにsbtへ渡すコマンドを設定。ユニットテストを走らせるだけであればclean testと設定する。(Jenkinsで実行するのでcleanは必要ないとは思いますが、とりあえず実行するようにしています。)
  5. ビルド後の処理から、JUnitテスト結果の集計を選択。テスト結果のxmlファイルを参照するよう値を設定する。テスト結果は、target/test-reports配下に出力されるため、テスト結果XMLをtarget/test-reports/*.xmlと設定する。
  6. "保存"ボタンを押下し、設定を完了する。

※Jenkins側で特にJavaのバージョンを指定していない場合は、OS側でパスが通っているJavaが利用されます。それとは別のJavaを利用したい場合は、Jenkinsの管理 > システムの設定 にて利用するJavaのバージョンを指定する必要があります。また、Jenkins上で複数のJavaを利用している場合は、ジョブ設定でsbtと同様にJavaのバージョン指定も必要になります。

これでJenkins上でScalaのビルド・テストが実行可能な状態となりました。

コードカバレッジを出す

Scalaプロジェクト側の設定

sbt-scoverageの設定

以下をplugins.sbtに追記する。

addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.3.1")
resolvers += Resolver.url("scoverage-bintray", url("https://dl.bintray.com/sksamuel/sbt-plugins/"))(Resolver.ivyStylePatterns)

これで、sbtでcoverageコマンドが使えるようになり、コードカバレッジを出すことができるようになります。

Jenkins側の設定

Scoverage Pluginのインストール・設定

  1. ダッシュボードより Jenkinsの管理 > プラグインの管理 の順に選択。
  2. 利用可能タブからScoverage Pluginを選択し、インストールする。
  3. ジョブ設定画面にて、ビルド後の処理の追加からPublish Scoverage Reportを選択。scoverageが出力した結果ファイルを参照するように値を設定する。結果ファイルは、target/scala-2.11/scoverage-report/scoverage.xmlに出力される。

※Scalaのバージョンにより、出力先ディレクトリ名が変わる。

sbtの実行コマンド変更

ジョブ設定画面の Build using sbt > Actionsの設定をclean coverage testと設定する。

設定後にビルドを行うと、ジョブとビルド結果のメニューに"Scoverage HTML Report"という項目が表示され、コードカバレッジを確認することができるようになります。

コーディングスタイルのチェック

Scalaプロジェクト側の設定

Scalastyleの設定

以下をplugins.sbtに追記する。

addSbtPlugin("org.scalastyle" %% "scalastyle-sbt-plugin" % "0.7.0")
resolvers += "sonatype-releases" at "https://oss.sonatype.org/content/repositories/releases/"

これで、sbtでscalastyleコマンドが使えるようになり、コーディングスタイルのチェックが可能になります。
ただし、プロジェクトの配下にscalastyle-result.xmlという名前の設定ファイルを配置しないと動作してくれません。
ファイルのひな形は、sbt scalastyleGenerateConfigを実行することで生成することができます。

Jenkins側の設定

Checkstyle Plug-inのインストール・設定

  1. ダッシュボードより Jenkinsの管理 > プラグインの管理 の順に選択。
  2. 利用可能タブからCheckstyle Plug-inを選択し、インストールする。
  3. ジョブ設定画面にて、ビルド後の処理の追加からCheckstyle警告の集計を選択。Scalastyle実行結果ファイルのtarget/scalastyle-result.xmlを参照するように設定する。

sbtの実行コマンド変更

ジョブ設定画面の Build using sbt > Actionsの設定をclean scalastyle coverage testと設定する。

設定後にビルドを行うと、ジョブとビルド結果のメニューに"Checkstyle警告"という項目が表示され、Scalastyle実行時に制約に引っかかった箇所を確認することができるようになります。

今回利用したScalaプロジェクト

GitHubに置いてます。
djyugg / scala-ci-sample

参考