CircleCIでFirebase Test Labを動かす方法

CircleCIからFirebase Test Labを動かしてみたので、その際につまずいた所を書いておこうと思います。ほとんどの設定の仕方はCircleCIの「Testing With Firebase Test Lab」に書いてあるので、そちらを参考にしてください。

CircleCIでFirebase Test Labを使うための設定

さっそくですが結果、下記のような config.yml になりました。

version: 2
jobs:
  build:
    docker:
      - image: circleci/android:api-28

    working_directory: ~/repo

    environment:
      JVM_OPTS: -Xmx3200m
      TERM: dumb

    steps:
      - checkout

      # Download and cache dependencies
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "build.gradle" }}
            # fallback to using the latest cache if no exact match is found
            - v1-dependencies-

      - run:
          name: gradle dependencies
          command: ./gradlew androidDependencies

      - save_cache:
          paths:
            - ~/.gradle
          key: v1-dependencies-{{ checksum "build.gradle" }}

      - run:
          name: Build debug APK and release APK
          command: |
            ./gradlew :app:assembleDebug
            ./gradlew :app:assembleDebugAndroidTest

      - run:
          name: Store Google Service Account
          command: echo $GCLOUD_SERVICE_KEY | base64 --decode --ignore-garbage > ${HOME}/gcloud-service-key.json

      - run:
          name: Authorize gcloud and set config defaults
          command: |
            sudo gcloud auth activate-service-account --key-file=${HOME}/gcloud-service-key.json
            sudo gcloud config set project ${GOOGLE_PROJECT_ID}

      - run:
          name: Test with Firebase Test Lab
          command: >
            sudo gcloud firebase test android run \
              --type instrumentation \
              --app ./app/build/outputs/apk/debug/app-debug.apk \
              --test ./app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk \
              --results-bucket cloud-test-${GOOGLE_PROJECT_ID} \
              --device model=Nexus6,version=21,locale=ja,orientation=portrait \
              --timeout 10m \
              --use-orchestrator

      - run:
          name: Install gsutil dependency and copy test results data
          command: |
            sudo pip install -U crcmod
            sudo mkdir ~/firebase
            sudo gsutil -m cp -r -U `sudo gsutil ls gs://cloud-test-${GOOGLE_PROJECT_ID} | tail -1` ~/firebase/ | true

      - store_artifacts:
          path: ~/firebase/

以降は実際につまずいたところの解説になります。

Firebase Test Labをgcloudコマンドから使う準備をする

gcloudコマンドは image: circleci/android:api-28 に入っているのですが、Firebase Test Labにアクセスできるようにするために、プロジェクトの情報を読み込ませる必要あります。

  1. まずは Testing With Firebase Test Lab の1〜3に従って、Firebase Test Labにブラウザでアクセスできるようにします。
  2. 次に、Firebase Consoleのプロジェクト設定、サービスアカウントから「新しい秘密鍵の生成」を押して、JSONファイルをダウンロードします。

    f:id:t-kashima:20190404222911p:plain:w200

  3. そして、ダウンロードしたJSONファイルを下記の手順でBase64エンコードして、そのファイルに書かれている文字列をCircleCIの環境変数「GCLOUD_SERVICE_KEY」に設定します。

openssl base64 -in [ダウンロードしたJSONファイル] -out service_key.json

これで下記の部分が動くようになって、Firebase Test Labを使う準備ができました。

      - run:
          name: Store Google Service Account
          command: echo $GCLOUD_SERVICE_KEY | base64 --decode --ignore-garbage > ${HOME}/gcloud-service-key.json

      - run:
          name: Authorize gcloud and set config defaults
          command: |
            sudo gcloud auth activate-service-account --key-file=${HOME}/gcloud-service-key.json
            sudo gcloud config set project ${GOOGLE_PROJECT_ID}

Firebase Test Labをgcloudコマンドから使う

下記の部分でInstrumented Testを指定の端末で実行することができます。1つつまずいたのは「Nexus 6」のように端末名の間にスペースを入れてしまていて、Format must be ARG_FILE:ARG_GROUP_NAME Exited のようなエラーが出てしまっていました。

     - run:
          name: Test with Firebase Test Lab
          command: >
            sudo gcloud firebase test android run \
              --type instrumentation \
              --app ./app/build/outputs/apk/debug/app-debug.apk \
              --test ./app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk \
              --results-bucket cloud-test-${GOOGLE_PROJECT_ID} \
              --device model=Nexus6,version=21,locale=ja,orientation=portrait \
              --timeout 10m \
              --use-orchestrator

テスト結果をCircleCIのArtifactsに保存する

Firebase Test Labのテスト結果は、上記で指定したGoogle Cloud Storageのバケットにアップロードされます。そのため最新のものを一件ダウンロードして、指定のフォルダに保存します。そして、それをCircleCIのartifactsとして保存します。

      - run:
          name: Install gsutil dependency and copy test results data
          command: |
            sudo pip install -U crcmod
            sudo mkdir ~/firebase
            sudo gsutil -m cp -r -U `sudo gsutil ls gs://cloud-test-${GOOGLE_PROJECT_ID} | tail -1` ~/firebase/ | true
      - store_artifacts:
          path: ~/firebase/

あまりまとまった記事がなかったのですが、CircleCIからFirebase Test Labを使うのはすごく簡単で、エミュレータを立ち上げたりする苦労をしなくていいのは本当に最高だなと思いました!

参考