Usual Software Engineer

よくあるソフトウェアエンジニアのブログ

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 の公式ブログにも取り上げられています。

circleci.com

対処としては GRADLE_OPTS などで heap size などメモリの使用を調節するのですが、そもそも Gradle でのビルドってどのようなメモリ設定なのかなってことで調べてみると以下のようなパラメータが影響していました。

使用していた Gradle 4.10.2 では

もちろんこれを適切に設定して解決するのも良いのですが、うちの場合は手っ取り早く Gradle 5 にバージョンアップすることで OOM のエラーを回避することができました。 というのも、以下の修正でデフォルト値が変更になっています。

github.com

つまり Gradle 5 では

https://docs.gradle.org/5.3.1/userguide/build_environment.html#sec:configuring_jvm_memory

worker に関する記述が見つからなかったのですが、もしかしたら根本の原因は

CircleCI 上で worker が想定以上にメモリを使う => worker が OOM で exit code 137 => テスト失敗

なのかなと思っていて、 重いテストを多数実行してたのは事実ですが、 worker の heap size 設定してなかった(設定できるのか不明)のが問題だったんじゃないかな〜と思うんですが確証はないです。やっつけブログ記事ですいませんw

GRADLE_OPTS などで heap size 調整しても OOM エラーが解決しない場合は Gradle のバージョンアップ検討してみてください。


追記 2019-08-24

GRADLE_OPTSXmX を設定しても 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システムプロパティを書いて設定できるというのをいまいち認識できてませんでした。同じ問題に遭遇した人はこれで解決できると思います。