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

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

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


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

## Scalaプロジェクト側の設定
### ScalaTestの設定
利用するテストフレームワークのライブラリを設定する。
`build.sbt`のlibraryDependenciesに以下の内容を追記する。

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

### テストコードを書く
今回は、以下のような簡単なテストを書いてコミットしておきます。
 
```scala:src/main/scala/CITestClass.scala
class CITestClass(val version: Int, val name: String) {}
```

```scala: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. "保存"ボタンを押下し、設定を完了する。

![sbt.png](https://qiita-image-store.s3.amazonaws.com/0/66426/aed8a842-3429-dfc4-8b30-efb3fa461755.png)


### 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. "保存"ボタンを押下し、設定を完了する。

![test.png](https://qiita-image-store.s3.amazonaws.com/0/66426/2cc75e60-51ed-a72c-2b74-44bd114fa42c.png)



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


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


# コードカバレッジを出す
## Scalaプロジェクト側の設定
### sbt-scoverageの設定

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

```scala
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のバージョンにより、出力先ディレクトリ名が変わる。
![scoverage.png](https://qiita-image-store.s3.amazonaws.com/0/66426/a01c72d8-1555-cf2b-d45e-d558f3f40abe.png)


### sbtの実行コマンド変更
ジョブ設定画面の Build using sbt > Actionsの設定を`clean coverage test`と設定する。

設定後にビルドを行うと、ジョブとビルド結果のメニューに"Scoverage HTML Report"という項目が表示され、コードカバレッジを確認することができるようになります。
![scoverage_2.png](https://qiita-image-store.s3.amazonaws.com/0/66426/eea19715-06a3-62bb-b5f0-05e7fbef42bd.png)

# コーディングスタイルのチェック
## Scalaプロジェクト側の設定
### Scalastyleの設定

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

```scala
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`を参照するように設定する。

![checkstyle.png](https://qiita-image-store.s3.amazonaws.com/0/66426/52420aba-0337-9245-3f55-d47ea777c312.png)


### sbtの実行コマンド変更
ジョブ設定画面の Build using sbt > Actionsの設定を`clean scalastyle coverage test`と設定する。

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

# 今回利用したScalaプロジェクト
GitHubに置いてます。
[djyugg / scala-ci-sample](https://github.com/djyugg/scala-ci-sample)

# 参考
- [ScalaTest Quick start](http://www.scalatest.org/quick_start)
- [Scalastyle - SBT plugin](http://www.scalastyle.org/sbt.html)
- [sbt-scoverage](https://github.com/scoverage/sbt-scoverage)