技術部モバイル基盤グループの門田(@_litmon_)です。モバイル基盤グループでは、エンジニアの方々が快適に開発できる環境を整えるため、日々アプリのビルド時間やCIの実行時間などを短くする方法を模索しています。testの実行時間が1分短くなった話をしようと思います。続編のような記事で、AndroidのCI環境を整えている話です。読んでいない方はぜひ上の記事から読むことをオススメします。前回は、Jenkins上でAndroidのエミュレータを起動して使用する方法から、OpenSTFというリモートで実機端末を操作することが出来るオープンソースツールを使用する方法に切り替えた結果、エミュレータの起動時間などが削られ実行時間が約9分近く削ることが出来ました。OpenSTFをしばらく運用していくといくつかの問題点が見つかりました。OpenSTFをCIで使う際の問題点OpenSTFはエミュレータの起動を待つこと無くテストを行うことが出来るため、とても優秀なツールだったのですが、実際に運用を進めていくと以下のような問題点が見つかりました。OpenSTFサーバー自体が不安定になることが時々あり、サーバーのプロセスが終了してしまうことが度々あった実機の状態が不安定で、時々接続に失敗することがあったりしてメンテナンスコストが高いCI専用の端末を用意する必要があり、slaveごとに端末が必要になるのでスケールしづらい1.のOpenSTFサーバーが不安定な点に関しては、正しくメンテナンスを行うことで回避することが出来たかもしれませんが、しばらくはプロセスが終了しており失敗している場合は手作業で立ち上げ直すという運用を取っていました。だいたい、2週間に一度は調子が悪くなり、そのたびに再起動を行っている、という状況でした。2.に関しては、実機の状態が不安定で"なぜか"OpenSTFに認識されないときがあり、そのたびに検証端末が置かれた棚を開きにいっており、毎回原因を追求することまではせず運用でカバーしていました。そのため、端末を管理するコストが大きくなっていました。自社でOpenSTFサーバーを立てると相応のメンテナンスコストがかかる物理端末に依存することで、端末の管理コストがかかりスケールしづらいという2点が挙げられます。Demandにたどり着きました。Inc.が出している非公式のAndroidエミュレータです。EC2(EC2)インスタンス上で起動し、扱うことが出来るものです。EC2インスタンス上に起動したエミュレータとADB接続でき、ADBコマンドから端末を操作することが出来るすぐれものです。Demandを導入することで、物理端末の制約から逃れ、快適なCI環境を手に入れることが出来ると考え、クックパッドでは5月頃から導入を始めています。Demandの使い方を紹介します。いっても、手順は公式のチュートリアルにとてもよくまとまっているので、そのとおり進めるだけで簡単に使うことが出来ます。–おおまかな流れとしては、以下のような形になります。7.0の3種類になります。6.0の2バージョンだった)。Demandでは、EC2のインスタンスタイプも指定できますが、t2.smallではテスト実行時間が若干遅くなるものの、それぞれ大きな差はありませんでした。クックパッドでは現在m4.largeを使用しています。現在、クックパッドではJenkinsのSlaveとしてEC2インスタンスを用いています。インスタンスへと転送する簡易プロキシを起動しています。することで、Slaveを立ち上げた時点ですでにGenymotionのエミュレータがADBに認識された状態になるため、Job側でなにも設定することなくエミュレータを使うことが出来ます。そのため、既存のJobの設定を編集する際も、OpenSTFのプラグインの設定を無効にするだけで簡単に移行が完了します。testの実行時間が1分短く!導入してしばらく様子を見ていたのですが、明らかにJobの実行時間が短くなっているのを体感しました。以下の画像は、縦軸が時間で横軸が実行したジョブの番号を示しています。Demandを導入した後になっています(※ときどき失敗しているのは、不安定なテストがあるせいです。気にしないでください)。このグラフから分かる通り、7分近くあったジョブの実行時間が6分弱に収まっていることが分かります。詳しく状況を見てみると、以下のようになっていました。それだけではなく、端末との接続時間や、アプリのアンインストール時間が短縮されていることが分かります。Slaveと同じEC2インスタンスのため、ネットワークの接続(apkの転送時間など)に影響があったのではないかと考えています。Demandですが、やはり気になるのは安定性です。現在、導入して3ヶ月ほど経ちました。Slaveは2台あり、内1台はフルタイムで活動しています。DemandのインスタンスはSlaveの起動時に同時に起動し接続しているため、内1台は常に活動したままです。関わらず、5月31日に起動して以来今までGenymotionのエミュレータの調子がおかしくなったことはありません。Demandを使うようになっています。Demandの良いところをたくさん挙げてきましたが、いくつか制限もあります。testでタイムゾーンに依存するテストがある場合、失敗する可能性がある一度これでハマってテストが落ち続けていたので、注意する...エミュレータのタイムゾーンを変更することは可能です現在、クックパッドの日本のアプリでは上記2つともそこまで大きな問題ではないのですが、プロジェクトによっては導入する際の障害になりうるので、参考になればと思います。Demandを使ったGenymotionエミュレータでのテストに置き換えた結果、CIの実行時間が1分近く短縮されました。安定性やスケーラビリティなど、実機で管理していた際の問題点も解消することが出来ました。クックパッドでは、アプリの開発ももちろんのこと、こういったアプリのビルドやCI周りに対しても様々な取り組みを積極的に行っています。アプリの基盤の仕組みを整えたり、新たに作り出していける、いきたいAndroidエンジニアのみなさんを募集しています。興味があったらぜひぜひ遊びに来てください。サービス開発を加速する会員事業部サービス開発グループ長の村田です。使ったセキュリティログ検索基盤の構築サービス特性にあった検索システムの設計戦略クックパッド採用説明会「クックパッドはサービスの作り手を採用したいんです。/*}*/スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。