興味本位で自分のアルゴリズム実装repository( https://github.com/shibayu36/algorithms )のテストをCircleCIで動かしてみようと考えた。基本的にCircleCIはcircle.ymlに設定を追加したら終わりなのだけど、何を設定すればいいか少し調べる必要があったのでメモ。
設定
Configuring CircleCI - CircleCI などを見ながら、最終的なcircle.ymlは以下のようになった。Circle CIでJavaを使ってビルドする | さにあらず や CircleCIでJUnitの結果を見る - Qiita あたりも参考になった。
machine: java: version: oraclejdk8 timezone: Asia/Tokyo environment: GRADLE_OPTS: -Xmx4G post: - sudo service mysql stop - sudo service postgresql stop checkout: post: - chmod +x ./gradlew dependencies: override: - ./gradlew testClasses --stacktrace test: override: - ./gradlew --full-stacktrace check post: - mkdir -p $CIRCLE_TEST_REPORTS/junit/ - find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} $CIRCLE_TEST_REPORTS/junit/ \;
まずmachineセクションでサーバのセットアップをする。
- 今ならoraclejdk8を設定したらJava8を利用できる
- GRADLE_OPTSではヒープサイズを4GBに設定している
- https://circleci.com/docs/oom/ によると、メモリは4GBまで使えるので最大まで使えるように
- 昔はgradleのdaemonを起動するため
-Dorg.gradle.daemon=true
も付けていたけど、今はデフォルトでdaemonが起動するため 必要ないようだった
- デフォルトでMySQLやPostgresが起動している ため、使えるメモリを増やすため、落としておく
- mongodも起動してそうだったので、落としても良いかも?
checkoutフェーズではgradlewの実行権限を追加するだけ。
dependenciesフェーズではテストの依存をインストールする。Gradleを使っていれば、./gradlew testClasses --stacktrace
だけでOK。
testフェーズでは実際にテストを動かす。
- テストだけじゃなくて静的解析系も動かすために
./gradlew --full-stacktrace check
にしている- プラグインを入れてなければ
./gradlew --full-stacktrace test
と同様っぽい?このあたりはちゃんと調べてない - https://docs.gradle.org/current/userguide/java_plugin.html 見ると、Gradleタスクの詳細はわかりそう
- プラグインを入れてなければ
- $CIRCLE_TEST_REPORTSにテストレポートのxmlを突っ込むと、テストレポートをCircleCIで見れるようになるので、postフェーズにそれを記述
確認
これでテストが実行できるようになった。https://circleci.com/gh/shibayu36/algorithms で確認できた。
まとめ
Java8 + Gradleプロジェクトで簡単にCI回せるようになって便利。
参考
- Configuring CircleCI - CircleCI
- Circle CIでJavaを使ってビルドする | さにあらず
- CircleCIでJUnitの結果を見る - Qiita
- https://circleci.com/docs/oom/
- https://docs.gradle.org/current/userguide/gradle_daemon.html#sec:why_the_daemon
- https://circleci.com/docs/configuration/#services
- https://docs.gradle.org/current/userguide/java_plugin.html
- https://circleci.com/docs/test-metadata/#gradle-junit-results