ハマったのでメモ
CircleCI(2.0)にAndroidの自動テストを組みこもうとしたところ、
Compileでつまづいてしまった。
エラー内容
主に以下のようなExceptionが発生
:app:compileDemoDebugKotlin
Compilation with Kotlin compile daemon was not successful
java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is:
java.io.EOFException
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:236)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:161)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:227)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:179)
at com.sun.proxy.$Proxy103.compile(Unknown Source)
...
Caused by: java.io.EOFException
at java.io.DataInputStream.readByte(DataInputStream.java:267)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:222)
... 60 more
たまにdaemonが死んだというメッセージだけ残っているときもありました
FAILURE: Build failed with an exception.
* What went wrong:
Gradle build daemon disappeared unexpectedly (it may have been killed or may have crashed)
原因
メモリ不足。
負荷軽減することでビルド通った。
(メモリ不足になる原因はKotlin側? バージョンによって結構デグレするっぽい。ちなみに私は 1.3.0
でした)
解決方法
メモリサイズを1.5GBに指定
CircleCIのDockerは2CPU,4GBです。
これの3GB, 4GBを使ってしまうとたぶんOS側のメモリが圧迫されて死にやすい?ので
1.5GBにします。(2GBよりも、これが一番安定していました)
JAVA_OPTS: -Xmx1536m
GRADLE_OPTS: '-Dorg.gradle.daemon=false -Dorg.gradle.jvmargs="-Xmx1536m -XX:+HeapDumpOnOutOfMemoryError"'
なによりdroidkaigi2018の設定なので信用できる(笑
Environment Variables にBuildFlavorとBuildTypeを追加
Name | Value |
---|---|
BUILD_FLAVOR | Production(*) |
BUILD_TYPE | Release(*) |
(*)各々のプロジェクトにマッチするものを設定してください、これは私のケースです
circle.yml にFlavorとTypeを指定
- run:
name: Run Complile
command: ./gradlew assemble$BUILD_FLAVOR$BUILD_TYPE
- run:
name: Run Inspection
command: ./gradlew lint$BUILD_FLAVOR$BUILD_TYPE
- run:
name: Run Test
command: ./gradlew test$BUILD_FLAVOR$BUILD_TYPE
それでもダメなときは
必要最低限のビルドに止める
私の場合はテストだけでいいので、./gradlew test$BUILD_FLAVOR$BUILD_TYPE
だけにする、とか。
課題点
安定しない
たまにOOMになっちゃいます。
なのでテストだけにしようかと思っています...
メモリを増やすという手もありますが、従量課金制というのと、一度有料にしたら戻せないので二の足ふんじゃいますよね。
Releaseビルドまでしたい
すべてのFlavorをDeployまでやろうとするとやっぱりOOMでダメでした。
(私のケースはとりあえずDeploy不要だったので、テストだけやる感じでした)
パフォーマンス
もう仕方ない気もしますが。
OOM発生しない程度のパフォーマンスが気になると思いますので載せておきます。
build ... 03:19
lint ... 02:43
test ... 01:54