Unyablog.

のにれんのブログ

circleCI で Android アプリのテストをする (travis から移行)

前回の記事です。

circleCI に移行する

前回の記事でまあうまく行ったのですが結構な確率で落ちる。masterが進んでるわけではないのに pr と pull で違う結果になったり、 merge すると落ちたりしていました。

いろいろやってみたのですが結局不安定なまま変わらなかったし、travisfirefox で見るとめちゃくちゃ重い*1といった理由で travis で消耗するのをやめようということになりました。

そして CircleCI を使ってみました!

CircleCI は travis CI と同じように CI サービスの一種です。travis は open source では無制限ですが、 CircleCI では4コンテナに制限されるみたいです。*2

まあ4コンテナもあれば十分でしょう。

build.gradle とかは前回の記事を参考にしてください。

.travis.tml から circle.yml へ

circleCI も travis と同じように GitHub にシュッと連携できます。

また、CircleCI も Android のビルドはサポートされています。 travis では beta のようですが CircleCI では正式にサポートされていそう。ドキュメントも最新の Android SDK が書いてあってよさ気です。

そして書いた circle.yml はこちら。

machine:
  java:
      version: openjdk7
  environment:
    ANDROID_HOME: /usr/local/android-sdk-linux
    GRADLE_OPTS: -Xmx512m

dependencies:
  pre:
    - echo y | android update sdk --no-ui --all --filter "platform-tools,build-tools-23.0.1,build-tools-22.0.1,android-23,android-22,sys-img-armeabi-v7a-android-22,android-19,sys-img-armeabi-v7a-android-19,android-17,sys-img-armeabi-v7a-android-17,android-15,sys-img-armeabi-v7a-android-15,extra-android-support,extra-google-m2repository,extra-android-m2repository"
  post:
    # remove cache
    - rm -r ~/.gradle
    - echo n | android create avd -n test22 -f -t android-22
    - echo n | android create avd -n test19 -f -t android-19
    - echo n | android create avd -n test17 -f -t android-17
    - echo n | android create avd -n test15 -f -t android-15

checkout:
  post:
    - git submodule sync
    - git submodule update --init

test:
  override:
    - case $CIRCLE_NODE_INDEX in 0) $ANDROID_HOME/tools/emulator -avd test22 -no-window -no-boot-anim -no-audio ;; 1) $ANDROID_HOME/tools/emulator -avd test19 -no-window -no-boot-anim -no-audio ;; 2) $ANDROID_HOME/tools/emulator -avd test17 -no-window -no-boot-anim -no-audio ;; 3) $ANDROID_HOME/tools/emulator -avd test15 -no-window -no-boot-anim -no-audio ;; esac:
        background: true
        parallel: true
    - circle-android wait-for-boot:
        parallel: true
    - ./gradlew --info clean :app:connectedAndroidTest:
        parallel: true

やってることは travis とそう変わらないです。

ポイント

  • secret key について

    どうやら travis でも circleCI でも secret key はわざわざ yml に埋め込まなくても web の UI から直接環境変数をプライベートで指定できるみたいでした。

  • checkout

    circleCI は空気を読んで submodule init してくれないので書きます。

  • rm -r ~/.gradle/

    circleCI は勝手にキャッシュしてくれるのですが、キャッシュONにすると fail のあと直しても fail したりするのでやめました*3

  • $CIRCLE_NODE_INDEX, parallel: true

    circleCI で複数コンテナで走らせる時のオプションで、CIRCLE_NODE_INDEX環境変数にインデックスが入るので各々やりたいコマンドを書きます。*4 そして、複数で走らせたいときは parallel をつけると走ってくれます。

  • circle-android wait-for-boot

    travis における android-wait-for-emulator です。

やってみたところ travis よりも早い!!かと思ったけどそんなに変わらない。ただ UI が firefox でも固まらない(大切)から良い。

テスト結果

確率的に落ちる

結局 CircleCI でも変わらず時々落ちちゃいました...

続きは次の記事↓で。

*1:Chrome だとそんなこと無いんですが...

*2:closed だと1コンテナのみ

*3:https://circleci.com/docs/how-cache-works の一番下に従った結果です

*4:一旦変数に展開するみたいなもう少しいいやり方はありそうだけど面倒でやってない...