CircleCIでScalaのマルチプロジェクトをテストし、カバレッジを出力する

CircleCIでScalaのプロジェクトのテストを回した時の内容です。

circle.ymlは、以下の通りです。

machine:
  timezone:
    Asia/Tokyo
  java:
    version: oraclejdk8
dependencies:
  cache_directories:
    - "~/.sbt/boot"
  override:
    - sbt update
test:
  override:
    - sbt clean coverage test coverageReport coverageAggregate
  post:
    - cp -R ~/hoge/target/scala-2.10/scoverage-report/ $CIRCLE_ARTIFACTS

基本設定

タイムゾーンjavaのバージョンは、お好きにどうぞ

machine:
  timezone:
    Asia/Tokyo
  java:
    version: oraclejdk8

sbtのバージョンに関して

初めはdependenciesにsbtをダウンロードする内容を記入していたのですが。

dependencies:
  pre:
    - wget -q https://dl.bintray.com/sbt/debian/sbt-0.13.8.deb
    - sudo dpkg -i sbt-0.13.8.deb

リポジトリの内のproject/build.propertiesを見て、
書いてあるsbtのバージョンをインストールしてくれるみたいです。

キャッシュに関して

sbt updateを行う際に利用しているライブラリを毎回ダウンロードするのは、
効率が悪いのでライブラリ関連をキャッシュします。
その設定が以下の部分です。

キャッシュには、sbtのプラグイン系(plugins.sbt)とsbtでダウンロードしたライブラリ(build.sbt)の2種類が必要です。
sbtプラグイン系のキャッシュは ~/.ivy2 の以下にあります。
これは、CircleCI側でデフォルトでキャッシュされるので問題ないです。

もう一つの、sbtでダウンロードしたライブラリのキャッシュは ~/.sbt/boot にあります。 これは、デフォルトでキャッシュしてくれないので以下のように設定します。

dependencies:
  cache_directories:
    - "~/.sbt/boot"

これで、毎回ライブラリ系をダウンロードしなくなるので、大丈夫です。

マルチプロジェクトでのカバレッジの出し方に関して

最後に、カバレッジの出し方です。

scalaカバレッジを出すプラグインは、sbt-scoverageを利用しています。

マルチプロジェクトの場合、最後にcoverageAggregateのコマンドを実行することで 各プロジェクトで出力したレポートをマージしてくれます。

test:
  override:
    - sbt clean coverage test coverageReport coverageAggregate

CircleCIは $CIRCLE_ARTIFACTSという環境変数のパスに
テスト結果のカバレッジのレポートを移動させるといい感じに見れるようにしてくれます。

出力したレポートを$CIRCLE_ARTIFACTSへコピーすれば完了です。

  post:
    - cp -R ~/hoge/target/scala-2.10/scoverage-report/ $CIRCLE_ARTIFACTS

Continuous Integration and Deployment

いい感じにテストを回せるようになってよかった。