こんにちは、GreenSnapでiOSエンジニアをやっている山野です。 GreenSnapでは、iOSのビルドとデプロイのCI環境としてBitriseを利用しています。 これまで、ビルド時間に、ひどいときは1時間以上かかっており、生産性がかなり低かったのですが、 今回、ビルド時間が長い原因を調査し、改善することができたので、その内容をまとめてみました。
そもそもBitriseとは
www.bitrise.io Bitriseは、モバイルアプリのCI/CDを構築するためのSaaSです。 デフォルトで、様々なタスクが容易されており、それらをGUI上で操作することで、簡単にCI環境を構築することができます。
なぜデプロイに時間がかかっていたのか
デプロイに時間がかかる理由は環境により様々あると思います。 弊社の場合、fastlaneを使って、pod, carthageライブラリのインストールとビルドからデプロイまでを一貫して行っていましたが、このfastlaneに非常に時間がかかっていました。
+------------------------------------------------------------------------------+ | bitrise summary | +---+---------------------------------------------------------------+----------+ | | title | time (s) | +---+---------------------------------------------------------------+----------+ ︙ +---+---------------------------------------------------------------+----------+ | ✓ | fastlane | 54.2 min | +---+---------------------------------------------------------------+----------+ ︙ +---+---------------------------------------------------------------+----------+ | Total runtime: 54.9 min | +------------------------------------------------------------------------------+
また、fastlaneの内部を見てみたところ、
+------+-----------------------------------------+-------------+ | fastlane summary | +------+-----------------------------------------+-------------+ | Step | Action | Time (in s) | +------+-----------------------------------------+-------------+ | 11 | cocoapods | 199 | | 12 | carthage | 928 | | 13 | gym | 1237 | | 14 | pilot | 750 | | 15 | deliver | 62 | | 16 | slack | 0 | +------+-----------------------------------------+-------------+
podとcarthageライブラリのインストールにそれなりに時間を要してしまっていることがわかりました。 そこで、これらのライブラリをキャッシュを使うことで、高速化できないか調べてみました。
Bitriseのキャッシュの導入
devcenter.bitrise.io Bitriseでは、公式でキャッシュ機能をサポートしています。 仕組みはシンプルで、2つのステップを追加するだけで導入可能です。
事前準備
弊社ではfastlaneを用いてライブラリをインストールしていたので、あらかじめこれらをfastlaneから除き、 それぞれシェルを使ってインストールできるようにステップを編集しておきました。
キャッシュの利用方法
devcenter.bitrise.io キャッシュの利用には、以下の2ステップを既存のワークフローに追加します。
Bitrise.ioキャッシュ:プルステップ
Bitrise.ioキャッシュ:プッシュ
Bitrise.ioキャッシュ:プルステップ
キャッシュをダウンロードします。 レポジトリをclone後、ライブラリをインストールする前にこのステップを追加します。これだけです。
Bitrise.ioキャッシュ:プッシュ
キャッシュをアップロードします。 すべてのステップの最後にこのステップを追加します。 どのディレクトリをキャッシュするかを設定しておく必要があるので、Cache pathsの欄に、
$BITRISE_CACHE_DIR Pods -> Podfile.lock Carthage -> Cartfile.resolved vendor/bundle -> Gemfile.lock
のように記載しました。 矢印の意味ですが、矢印の右側のファイルに変更があった場合は、左のキャッシュ対象を更新するという意味になります。
キャッシュの管理
キャッシュはブランチ単位で管理されます。キャッシュをダウンロードしてくる際に、デプロイ対象のブランチにキャッシュが無い場合は、デフォルトのブランチから探してくれます。 また、キャッシュはデフォルトでは7日後に期限切れになります。7日間キャッシュした対象のブランチで何もしなかった場合は、期限切れのタイミングでキャッシュも削除されます。
Bitriseのスケジュールビルド
Bitriseではスケジュールビルドを簡単に設定できます。 キャッシュ用のワークフローを作成し、1週間に1度定期実行するように設定すれば、7日後にキャッシュが消えることを回避できます。 設定は非常に簡単で、通常のビルド実行から、スケジュールビルドにチェックを入れ、曜日と時間を設定するたけです。
どれくらい改善されたか
キャッシュを使うことで、これまで数十分かかっていたライブラリのインストールですが、
+---+---------------------------------------------------------------+----------+ | ✓ | Bundle Install | 16.19 sec| +---+---------------------------------------------------------------+----------+ | ✓ | Pod Install | 1.4 min | +---+---------------------------------------------------------------+----------+ | ✓ | Carthage Install | 25.05 sec| +---+---------------------------------------------------------------+----------+
全部合わせて2分ほどで完了するようになりました。これにより、全体のデプロイ時間も大幅に削減され、導入前は1時間ほどかかっていたものが、20分ほどで完了するようになりました。
まとめと今後について
今回は、Bitriseのキャッシュ機能を使うことで、iOSのデプロイ時間を大幅に削減することができた話をさせていただきました。 Bitriseはモバイルアプリに特化しているだけのことはあり、非常に簡単な操作でCI環境を導入できるのでおすすめです。 今後は、Bitriseを使って、自動テスト環境なども構築できればいいなと考えています。
最後に
弊社では絶賛エンジニア募集中です。BtoCのサービス開発をしてみたい方や、植物に興味のある方は是非応募してください。 カジュアルに話だけでも聞きたいという方もお待ちしてます。 www.wantedly.com