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にアクセスできるようにするために、プロジェクトの情報を読み込ませる必要あります。
- まずは Testing With Firebase Test Lab の1〜3に従って、Firebase Test Labにブラウザでアクセスできるようにします。
次に、Firebase Consoleのプロジェクト設定、サービスアカウントから「新しい秘密鍵の生成」を押して、JSONファイルをダウンロードします。
そして、ダウンロードした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を使うのはすごく簡単で、エミュレータを立ち上げたりする苦労をしなくていいのは本当に最高だなと思いました!