最近、Scalaを書き始めてみました。
並列処理が書きやすくて、うまく書けたときは面白く感じますが、まだまだ言語の仕様を覚えきれてなかったり、そもそも関数型言語としての書き方ができていないかなーという感じです。
そんな中、ちょっとしたアプリを作る機会があったので、ScalaのCI環境を作りしながら進めてみました。
手順をメモがてら残しておこうと思います。
利用したツールの構成としては、Jenkins + ScalaTest + scoverage + Scalastyle な感じです。
とりあえずJenkinsでテストを動かすまで
Scalaプロジェクト側の設定
ScalaTestの設定
利用するテストフレームワークのライブラリを設定する。
build.sbt
のlibraryDependenciesに以下の内容を追記する。
"org.scalatest" % "scalatest_2.11" % "2.2.4" % "test"
テストコードを書く
今回は、以下のような簡単なテストを書いてコミットしておきます。
class CITestClass(val version: Int, val name: String) {}
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のインストール・設定
- ダッシュボードより Jenkinsの管理 > プラグインの管理 の順に選択。
- 利用可能タブから
sbt plugin
を選択し、インストールする。 - ダッシュボードより Jenkinsの管理 > システムの設定 の順に選択。
- Sbtの項目で"Sbt追加"ボタンを押下。sbtの設定画面が出てくるので、nameにsbtの設定名を入力する。今回は、sbtの管理をJenkinsさんに計らってもらいたいので、 自動インストールにチェックを入れsbtのバージョンを選択。
- "保存"ボタンを押下し、設定を完了する。
ScalaのCIを行うジョブの作成
- ダッシュボードより、新規ジョブ作成を選択。
- フリースタイル・プロジェクトのビルドを選択して"OK"を押下する。
- ジョブ設定画面に遷移するので、まずはソースコード管理項目にコードの取得元リポジトリの設定を行う。(バージョン管理ツール毎にやり方が変わるので省略)
- ビルド手順の追加から
Build using sbt
を選択。sbt launcherで利用したいsbt設定を選択し、Actionsにsbtへ渡すコマンドを設定。ユニットテストを走らせるだけであればclean test
と設定する。(Jenkinsで実行するのでcleanは必要ないとは思いますが、とりあえず実行するようにしています。) - ビルド後の処理から、
JUnitテスト結果の集計
を選択。テスト結果のxmlファイルを参照するよう値を設定する。テスト結果は、target/test-reports
配下に出力されるため、テスト結果XMLをtarget/test-reports/*.xml
と設定する。 - "保存"ボタンを押下し、設定を完了する。
※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のインストール・設定
- ダッシュボードより Jenkinsの管理 > プラグインの管理 の順に選択。
- 利用可能タブから
Scoverage Plugin
を選択し、インストールする。 - ジョブ設定画面にて、ビルド後の処理の追加から
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のインストール・設定
- ダッシュボードより Jenkinsの管理 > プラグインの管理 の順に選択。
- 利用可能タブから
Checkstyle Plug-in
を選択し、インストールする。 - ジョブ設定画面にて、ビルド後の処理の追加から
Checkstyle警告の集計
を選択。Scalastyle実行結果ファイルのtarget/scalastyle-result.xml
を参照するように設定する。
sbtの実行コマンド変更
ジョブ設定画面の Build using sbt > Actionsの設定をclean scalastyle coverage test
と設定する。
設定後にビルドを行うと、ジョブとビルド結果のメニューに"Checkstyle警告"という項目が表示され、Scalastyle実行時に制約に引っかかった箇所を確認することができるようになります。
今回利用したScalaプロジェクト
GitHubに置いてます。
djyugg / scala-ci-sample