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
基本設定
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
いい感じにテストを回せるようになってよかった。