LoginSignup
6
3

More than 5 years have passed since last update.

CircleCIでAndroidのビルドが通らない(UnmarshalException)

Last updated at Posted at 2018-12-25

ハマったのでメモ

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を指定

circle.yml
      - 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

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3