CircleCI 上の Gradle テストが exit value 137 で失敗する時の対処法
※追記あり
サボリ気味なので3月分のブログです。 今回は Gradle と CircleCI の小ネタです。 CircleCI 上で Java のビルドやテストのために Gradle を実行していて、ある日から以下のようなエラーが発生するようになりました。
* What went wrong: Execution failed for task ':varanus-vrp-engine:test'. > Process 'Gradle Test Executor 18' finished with non-zero exit value 137 This problem might be caused by incorrect test process configuration. Please refer to the test execution section in the user guide at https://docs.gradle.org/4.10.2/userguide/java_plugin.html#sec:test_execution
OOM によるエラーのようで、 CircleCI の公式ブログにも取り上げられています。
対処としては GRADLE_OPTS
などで heap size などメモリの使用を調節するのですが、そもそも Gradle でのビルドってどのようなメモリ設定なのかなってことで調べてみると以下のようなパラメータが影響していました。
使用していた Gradle 4.10.2 では
- command line client と daemon の
-Xmx
: デフォルト値は1024m
--max-workers
: デフォルト値は=コア数
- worker の
-Xmx
: デフォルト値は物理メモリの 4 分の 1
- ※ドキュメントに記述は見つからず...
もちろんこれを適切に設定して解決するのも良いのですが、うちの場合は手っ取り早く Gradle 5 にバージョンアップすることで OOM のエラーを回避することができました。 というのも、以下の修正でデフォルト値が変更になっています。
つまり Gradle 5 では
https://docs.gradle.org/5.3.1/userguide/build_environment.html#sec:configuring_jvm_memory
- command line client の
-Xmx
: デフォルト値は64m
- 基本 daemon を動かすことが推奨されているので client のメモリ設定は少なくて良い。
--no-daemon
で実行する必要がある場合はこの値を増やす
- 基本 daemon を動かすことが推奨されているので client のメモリ設定は少なくて良い。
- daemon の
-Xmx
: デフォルト値は512m
--max-workers
: デフォルト値は=コア数
- worker の
-Xmx
: デフォルト値は512m
らしい。
worker に関する記述が見つからなかったのですが、もしかしたら根本の原因は
CircleCI 上で worker が想定以上にメモリを使う => worker が OOM で exit code 137 => テスト失敗
なのかなと思っていて、 重いテストを多数実行してたのは事実ですが、 worker の heap size 設定してなかった(設定できるのか不明)のが問題だったんじゃないかな〜と思うんですが確証はないです。やっつけブログ記事ですいませんw
GRADLE_OPTS
などで heap size 調整しても OOM エラーが解決しない場合は Gradle のバージョンアップ検討してみてください。
追記 2019-08-24
GRADLE_OPTS
で XmX
を設定しても worker の heap size は設定できないので、次のように org.gradle.jvmargs
などを設定することが必要でした。
.circleci/config.yml
version: 2 jobs: build: ... environment: - GRADLE_OPTS: "-Dorg.gradle.workers.max=2 -Dorg.gradle.jvmargs='Xmx1g -XX:MaxMetaspaceSize=256m -XX:+HeapDumpOnOutOfMemoryError'"
gradle.properties
に書くように、 GRADLE_OPTS
にシステムプロパティを書いて設定できるというのをいまいち認識できてませんでした。同じ問題に遭遇した人はこれで解決できると思います。