こんにちは。Androidエンジニアの@huinです。
(かなり間が空いてしまいましたが)2/28(土)に、株式会社Sansanで行われた「【iOS/Android】最新事例から学ぶ!モバイル向けテスト手法勉強会」で発表させていただきました。
発表で使用したスライドがこちらになります。
「(地味に)時間のかかる作業を自動化して、開発/テストの時間を最大化しましょう」という内容だったのですが、その中でCircleCIの導入についてお話させて頂きました。
2月中旬に移行して2ヶ月以上経過しますが、概ね問題なく安定運用できています。 2月の発表時にはあまり具体的な話をしていなかったので、今日はCircleCIの設定について紹介させて頂きたいと思います。
CircleCI導入のきっかけ
弊社ではもともとTravisCIを利用していたのですが、以下の様な不満がありました。
ジョブの実行に20分弱かかる
変更をプッシュしてから実行結果がでるまでに20分近く待たされるというはかなりストレスでした。
エミュレータの起動に失敗しジョブごと失敗することが頻発していた
ジョブが開始して10分以上待たされたあげくテストも開始できずに失敗するということが多々ありました。
そんな中、年明けからCircleCIの利用例がいくつか出ていたので*1 *2、弊社でも試してみたところセットアップも簡単で、上記の不満も大きく改善されました。とてもスムーズに導入できたのでそのまま本格導入して今にいたります。
では開発フロー中のCircleCIの役割と、具体的な設定をみていきます。
システム構成
まず全体の構成ですが以下のようになっています。
CircleCIでやっていることは以下の2つです.
- github.comへのpushをhookしてユニットテストを実行
- developでのテスト完了時にはapkを生成してFabric.ioにアップロードする
- apkはテスト用と本番用の2種類を作成しています
テストの実行と配信サーバへのアップロード、CIサービスとしてはシンプルに使な使い方をしています。 勉強会ではCIサービスからAppStore/Google Playへのアップロードも行うという発表もありましたが、Fablicでは今のところそこまではやっていません。
では具体的な設定を見ていきます。
CirlceCIの設定
CircleCIではcircle.yml
ファイルに設定を記述していきます。
circle.yml
基本的にはCircleCIのドキュメント*3 と同じものになっているので違う部分について説明します。
まず一つ目は、環境変数を設定する部分でJVMのヒープサイズなどを設定しています。
JAVA_OPTS: "-Xmx2048m -XX:MaxPermSize=1024m"
このオプションなしで実行していると、仮想マシンのメモリを使い果たしてジョブが失敗することが頻発しました。 プロジェクトのサイズにもよるかもしれませんが、設定しておくと良いと思います。
2つ目はテストの部分です。
test: override: - ./gradlew connectedAndroidTestDebug -PdisablePreDex
テストコマンドはドキュメント通りですが、一つオプションを追加しています。
なお、-PdisablePreDex
オプションはビルド時間を短縮するためにつけています。詳しくはAndroid Toolsのドキュメントを見ていただければと思います。
実行時間全体からすると小さいですが、オプションをつけることで実際に十数秒程度早くなりました。
最後はFabric.ioへのデプロイです。CircleCIではブランチ単位でデプロイの処理を切り替えることができるので、developブランチのみアップロードタスクを行っています。
deployment: develop: branch: develop commands: - ./gradlew assemble - ./gradlew crashlyticsUploadDistributionDebug crashlyticsUploadDistributionRelease
Fabricへのアップロードは、Gradleプラグインを入れてタスクを実行するだけです。 詳しくはFabridのドキュメントBuild ToolsおよびBeta Distributionを参考にしてください。
弊社の場合、ただFabric.ioにアップロードするだけでなくRelease Noteに最新のコミットコメントやブランチ名、ビルド時刻を追加することでインストールする側がバージョンを確認しやすいようにしています。
その他circle.yml
内で実行しているシェルスクリプト(install-dependencies.sh
, wait.sh
)は、CircleCIのドキュメントにあるものをそのまま利用しています。((4月上旬にAndroid環境の改善が行われ、エミュレータの起動用のコマンド circle-android wait-for-boot
が用意されました。))
また、これらの設定とは別にジョブの実行結果をSlackに通知するように設定しています。
まとめ
CircleCIの導入により以前に比べてテストを早く安定して実行できるようになり、 精神的にもCI環境を安心して利用できるようになりました。
具体的な原因は分析できていないので残念ながら仮想マシンの性能なのか他の要因なのかはわかっていませんが、実行時間はTravisCIと比べて5~7分ほど早くなっています。ドキュメントでちゃんと説明されているのもあり、エミュレータの起動も問題ありません。
CircleCIは1コンテナ(コンテナはジョブの同時実行数の単位です)であれば無料で利用できるので、個人デベロッパの方でも気軽に始めることが可能です。 ぜひ試してみてください!