WondershakeでLocariのAndroidアプリを開発している代蔵です.
今回は,私が担当しているAndroidアプリのCIについてご紹介しようと思います. Androidアプリの開発者が私一人ということもあり,テストなどを出来るだけ自動化することで開発に専念できるような環境を作りました.
大まかな流れ
- GithubへPush (marge)
- PushをトリガーにCircleCIでUnitテスト,UIテスト
- Slackに結果を通知
- Fabricで開発チーム(release)・社内全体(master)にAPKを配布
- AWS Device Farmでモンキーテスト(master)

1 GithubへPush(marge)
書いたコードをGitHubへPush.または,release, masterブランチへのPRのmerge.
2 PushをトリガーにCircleCIでUnitテスト,UIテスト
以下はcircle.ymlの一部抜粋になりますが,CircleCI上でUnitテストとUIテストを行っています. UnitテストはJUnit,UIテストはSpoonを使っています. Spoonを使っている主な理由は,画面のスクリーンショットを記録することでUIに問題ないかどうかを目視で確認できるようにするためです.
test:
pre:
# create sdcard
- mksdcard -l e 512M mysdcard.img
# start emulator
- emulator -avd circleci-android22 -no-audio -no-window -sdcard mysdcard.img:
background: true
parallel: true
# wait for booted
- circle-android wait-for-boot
# avoid com.android.builder.testing.api.DeviceException: com.android.ddmlib.ShellCommandUnresponsiveException
- sleep 10
override:
- ./gradlew testDebug
- ./gradlew spoonDebugAndroidTest:
timeout: 1800
- cp -r /home/ubuntu/locari_android/app/build/outputs/apk/* $CIRCLE_ARTIFACTS
- cp -r /home/ubuntu/locari_android/app/build/spoon-output/* $CIRCLE_ARTIFACTS
3 Slackに結果を通知
CircleCIの結果をSlackに通知しています.
4 Fabricで開発チーム(release)・社内全体(master)に配布
releaseブランチでテストが全て通った場合は開発チームに,masterブランチでテストが全て通った場合は社内全体へFabric経由でAPKが配布されます. その他のブランチでは,配布されないようになっています.
5 AWS Device Farmでモンキーテスト(master)
最後に,masterブランチですべてのテストが通った場合にのみ,AWS Device Farmでテストを行うようになっています. これにより,Android版Locariでは最低限の品質を担保しています.
アプリのリリース
CircleCI上のUIテストで取得したスクリーンショットとAWS Device Farmで問題が無いかどうかを確認.
全てに問題がなかった場合にのみCircleCIからAPKをダウンロードし,Google Playでリリースするという流れになっています.

最後に
細かい部分などは省略していますが,弊社のリリースまでの全体像を把握することが出来るかと思います. アプリのリリース作業などはまだ自動化していませんが,今のところ自動化の必要性は感じていません.
最近CircleCI上でOutOfMemoryErrorが多発していて,複数端末でのUIテストが出来ていないので,CircleCIから別のものに移行しようと検討中です.
弊社ではAndroid,iOS,サーバサイドエンジニアを募集しています.ご興味の有る方がいれば是非こちらからご応募下さい!