Tagbangers Blog

Bamboo + Android + Firebase Test Lab + SonarQube

Android プロジェクトを Bamboo にのせて CI してみます。
それぞれ以下のような役割です。

Bamboo: CI サーバ
Firebase Test Lab: Android のテストをクラウド上の仮想、もしくは物理端末で実行してくれるサービス
SonarQube: コード解析。今回は Firebase で実施したインスツルメントテストのカバレッジを反映します

1. Firebase にプロジェクトを作成

コンソールぽちぽち。
CI からの認証用にサービスアカウントを作っておく。

2. Bamboo サーバに Google Cloud SDK のセットアップ

https://cloud.google.com/sdk/docs/quickstart-linux?hl=ja

$ wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-192.0.0-linux-x86_64.tar.gz
$ tar xzvf google-cloud-sdk-192.0.0-linux-x86_64.tar.gz
$ sudo chown -R bamboo:bamboo google-cloud-sdk
$ google-cloud-sdk/install.sh
$ source .bashrc
$ gcloud init

メモ:
CentOS 7 であれば、yum でインストール可能。
https://cloud.google.com/sdk/docs/quickstart-redhat-centos?hl=ja

3. Android プロジェクトの編集

Firebase Test Lab からテストカバレッジレポートが取得できるように、以下の修正を加えます。

app/src/main/AndroidManifest.xml

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

app/build.gradle

android {
    buildTypes {
        debug {
            testCoverageEnabled = true
        }
    }
}

Android Plugin for Gradle が Jacoco のテストカバレッジをサポートしていて、testCoverageEnabled を設定するだけで Jacoco のレポートが出力できます。

また、SonarQube にカバレッジを反映するための設定も追記します。

build.gradle

buildscript {
    dependencies {
        classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.4'
    }
}
apply plugin: 'org.sonarqube'

app/build.gradle

sonarqube {
    properties {
        property "sonar.exclusions", "**/*Generated.java"
        property "sonar.jacoco.reportPath", "${buildDir}/jacoco/testDebug.exec"
        property "sonar.jacoco.itReportPath", "${buildDir}/outputs/code-coverage/connected/coverage.ec"
    }
}

4. Bamboo のタスクを設定する

Android のビルドタスク

./gradlew :app:assembleDebug
./gradlew :app:assembleDebugAndroidTest

Firebase Test Lab のテスト実行タスク

DEVICE_MODEL=Nexus6P
DEVICE_VERSION=25
DEVICE_LOCALE=ja_JP
DEVICE_ORIENTATION=portrait

gcloud config set project <プロジェクトID>
gcloud --quiet components update
gcloud auth activate-service-account <サービスアカウント> --key-file <サービスアカウントのキーファイル>

echo "y" | gcloud firebase test android run \
    --type instrumentation \
    --app app/build/outputs/apk/app-debug.apk \
    --test app/build/outputs/apk/app-debug-androidTest.apk \
    --device model=${DEVICE_MODEL},version=${DEVICE_VERSION},locale=${DEVICE_LOCALE},orientation=${DEVICE_ORIENTATION} \
    --environment-variables coverage=true,coverageFile="/sdcard/coverage.ec" \
    --directories-to-pull=/sdcard

mkdir `pwd`/firebase
gsutil -m cp -r -U "`gsutil ls gs://<BUCKET_NAME> | tail -1`*" `pwd`/firebase

mkdir -p `pwd`/app/build/outputs/code-coverage/connected
cp `pwd`/firebase/${DEVICE_MODEL}-${DEVICE_VERSION}-${DEVICE_LOCALE}-${DEVICE_ORIENTATION}/artifacts/coverage.ec `pwd`/app/build/outputs/code-coverage/connected/coverage.ec

Firebase Test Lab でテスト実行すると、Google Cloud Storage にカバレッジレポートファイル (coverage.ec) が作成されるようにしていて、それを gsutil コマンドで CI サーバにダウンロードしています。

SonarQube 解析タスク

./gradlew sonarqube --info -Dsonar.host.url=<SonarQubeのURL> -Dsonar.login=****** -Dsonar.password=******


おわり