こんにちは、スタメンでモバイルアプリ開発をしている @temoki です。
スタメンに入社した当時は私一人でモバイルアプリ開発をしていましたが、おかげさまでこの一年半で仲間も増え、組織上もモバイルアプリグループが発足するにまで至りました。そのため、最近はチームで一緒になって開発を進めていける喜びを感じつつ、複数人でも開発をスムーズに行うための環境づくりも進めています。
その一つとして、このたびモバイルアプリ開発におけるCI/CDサービスとして Bitrise を採用したため、その背景や理由についてお伝えしたいと思います。
背景と目的
CI/CDサービスを導入を検討しはじめた目的はこの三つです。
- リリースの頻度を上げたい
- 私がいなくてもデプロイできるようにしたい
- ユニットテストを定着させたい
それぞれの目的についての背景は次のとおりです。
リリースの頻度を上げたい
ストアへのリリースはだいたい月に一回というペースで行ってきましたが、メンバーが増えたことで開発スピードも上がり、一回のリリースでの変更量が大きくなったことがリリースへの不安につながってきました。そのため、社内へのテスト配信の頻度をあげたり、ストアへのリリースをより小さく、より頻繁に行う必要があります。
また、せっかく開発は完了している機能があるのにユーザーへの提供が遅くなってしまったり、逆に遅くならないために直近のリリース予定日での機能の詰め込みということも起きるようになってきました。
私がいなくてもデプロイできるようにしたい
デプロイ作業自体は fastlane や Gradle によりほぼ自動化してありましたが、アプリ署名のための秘匿情報の管理の観点から、その作業は私の開発機のみで行うようにしていました。しかし、その回数が増えてくると、実行の手間や実行のために開発機のリソースを取られることで、自分の作業に影響がでてきました。
そもそも、チームでの開発となった今、私しかデプロイを行えないということ自体が問題です。
ユニットテストを定着させたい
リリースへの不安を減らすためにユニットテストの文化を定着させていきたいと思っている中、改修により既存のユニットテストが壊れていることに気づくのが遅れるということが起きてしまいました。幸いにもユニットテストのビルドが通らなくなっているだけで、テスト自体でエラーが起きるようなことではありませんでしたが、やはり定着させるためには常にテストが実行される環境が必要だと再認識しました。
候補の選定と検証
iOSアプリのビルドを行える macOS をサポートしていることを条件に候補を絞りました。以下が候補に挙がったサービスとその理由です。
- GitHub Actions : macOSの無料枠がある
- Bitrise : モバイルアプリに強いと評判
- Circle CI : TUNAGウェブアプリケーションの開発で使用中
これらをウェブサイト上で機能表を比較してみても大きな差はないため、まず実現したいと思っている次のようなワークフローを作成して比較してみることにしました。
- GitHubリポジトリの特定のブランチへのプッシュをトリガーに、アプリをビルドして Firebase App Distribution で社内配信する
- 手動のトリガーで、アプリをビルドしてストアへアップロードする
- GitHubの Pull Request をトリガーに、ユニットテストを実行する
以降に記載する比較結果は2020年3月時点のもので、ソースコードがGitHubのプライベートリポジトリにある前提のものとなります。
GitHub Actions
GitHub Actions は GitHub Universe 2018 で発表され、2019年末に正式リリースされたばかりの、GitHub製CI/CDサービスです。リリースのニュースを聞いた時はモバイルアプリ向けのサポートは先になるだろうと思っていたのですが、プラットフォームとしてmacOSも含まれ、iOSやAndroidのビルドツールもサポートされるなど、良い意味で裏切られたので注目していました。
しかも、macOSでも無料枠(GitHub Freeプランの場合は2000分、Proプランの場合は3000分の利用時間)があるため、最初に試してみるのは GitHub Actions にすることにしました。
以下にその結果を○△×でまとめました。
- ○ : macOSでも無料で利用できる枠がある
- ○ : モバイルアプリ向けに必要な環境も充実している
- ○ : モバイルアプリ向けのアクションも比較的揃っている印象
- △ : アクションはYAML形式のコードでのみ定義できる
- β版の時は Visual Editor があったが正式リリース時に廃止されたようです
- △ : ビルドに必要な秘匿情報は GitHub の Secrets に文字列として配置できる
- iOSのプロビジョニングファイルや、コード署名用証明書などを扱うには一手間かかる
- × : macOS 環境が高額
- Linuxの10倍で利用時間を消費するため、 Proプランの場合は実質300分しか無料で利用できない
- × : 手動でビルドを開始する公式の方法がないのでアクション構築のトライ&エラーがやりにくい
- GitHub API で 外部イベント repository_dispatch を起こすことで代用できるが面倒。このトリガーではCarthageのキャッシュが利用できないなどの難点も。
一通りのトライアルを終えてみて、×に挙げた部分が運用上のネックとなりそうなことがわかりました。特に、iOSにおいてipaファイルを出力するまでには(Carthageのキャッシュが利用できたとしても)20分くらいはかかる現状もあり、利用時間(=費用)を気にしながら運用することになりそうです。
Bitrise
次は Bitrise です。Bitrise はモバイルアプリ向けのCI/CDサービスを謳っており、日本開催のモバイルアプリ向けのイベントにもよく出展されているため本命のサービスです。BitriseでもFreeプランでmacOSを利用可能ですが、1ビルドあたり10分という制約があり、現状のアプリのipaファイル出力までを試すには時間が足りないことがわかっていたため、GitHub Actionsの後に試すことになりました。
今回、検証のために Developerプラン を契約しています。このプランでは、一回のビルドあたり45分制限がありますが、ビルド回数に関わらず定額であるため、利用時間を気にせずに試すことができました。以下が、Bitriseの結果です。
- △ : Freeプランでは1ビルドあたり10分の制限があり、iOSアプリのビルドを試すには厳しい
- ○ : 定額であるため、利用時間を気にする必要がない
- ○ : モバイルアプリ向けに必要な環境が充実している
- ○ : リポジトリ構成を自動でチェックしてワークフローをある程度自動で構築してくれるため、初期セットアップが楽
- ○ : UIがわかりやすい(そしてかわいい)
- ○ : ワークフローをビジュアルでもYAML形式のコードでも定義できる
- ○ : モバイルアプリ向けのアクションが豊富にある
- ○ : ビルドに必要な秘匿情報はアプリケーションごとに定義でき、かつモバイルアプリとの親和性が高い
- iOSのプロビジョニングファイルや、コード署名用証明書を設定するための専用の機能がある
- ○ : 困った時は仮想マシンにsshやリモートデスクトップでログインして状況を確認することができる
評判が高いのも納得のクオリティでした。GitHub Actionsの時には試行錯誤しながらセットアップしていましたが、Bitriseではとても簡単にセットアップを終えることができました。また、定額なのでその後もアプリの社内配信やユニットテストをどんどん実行でき、利用時間を全く気にしなくていいのが素晴らしいです。
Circle CI
TUNAGウェブアプリケーションの開発ですでに社内で利用中の Circle CI も候補に挙げましたが、モバイルアプリ向けに想定している実行時間や頻度を考えると、その開発業務にも費用にも大きな影響を与えそうということがわかりました。そして何よりBitriseが想像以上に優秀だったことから、Circle CIの検証はせず、Bitriseを継続していくことに決めました。
さいごに
最後にまとめとなりますが、一言で言えば 「Bitriseはいいぞ!」 です。業務上の選定となるため機能面での比較を真面目に行いましたが、Bitriseを使っているうちに、そのビジュアルデザインのかわいさ、操作性の良さ、細かい部分でのユーザーへの配慮を感じられ、純粋にBitriseというプロダクトを心から気に入ってしまいました。
そして、弊社の創業事業TUNAGもエンドユーザーに同じように心から気に入ってもらえるようなプロダクトに育てていきたいと強く思いました。そのためにはさらに強い開発力が必要となりますので、スタメンでは一緒にプロダクト開発を進めてくれる仲間を募集しています!興味を持ってくれた方は、ぜひぜひ下記のエンジニア採用サイトをご覧ください。
スタメン エンジニア採用サイト サーバーサイドエンジニア募集ページ フロントエンドエンジニア募集ページ インフラエンジニア募集ページ モバイルアプリエンジニア募集ページ