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=******
おわり