DevOpsへの取り組みが各企業で進んでいます。DevOpsは組織論であり、一般的にアジャイル開発を組み込み、品質の高いソフトウェアを短期間で継続的にリリースするための考え方になります。
ここではMonacaをはじめとする、モバイルアプリ開発におけるDevOpsの考え方、導入方法を紹介します。
モバイルアプリとWebアプリケーションの違い
まず、モバイルアプリとの比較として、Webアプリケーションについて考えてみます。
Webアプリケーションはサーバサイドでコンテンツを生成し、Webブラウザで表示します。これは静的サイトであっても基本的に同じで、初期状態においてすべてのコンテンツはサーバ側で保持しています。
それに対して、モバイルアプリの場合はUI部分をスマートフォンやタブレット側で保持しています。Webアプリケーションでは、表示する内容やサイズなどをサーバ側で指定できるのに対して、モバイルアプリでは各デバイス側で制御します。最近では自動アップデートの仕組みもできていますが、AさんのバージョンとBさんのバージョンが同じである保証はありません。
審査の有無
モバイルアプリの場合、AppleやGoogleによる審査がある点も欠かせません。アプリをビルドしたからといって、即座にリリースできる訳ではありません。審査に数日かかったり、リジェクトされる可能性もあります。審査を通す際には、開発時とは別にアップデート文を作る必要もあります。この部分に関しては自動化は難しいかも知れません。
Monacaを使った場合、iOSで必要なアプリアップロードまで行うことが可能です。Androidの場合はアプリをダウンロードして自分でアップロードする必要があります。その後、アップデート文やスクリーンショット差し替えなどを行った上で審査にかけます。
テストについて
Webアプリケーションとモバイルアプリ、どちらもテストについては大きくは変わりません。ユニットテストがあり、さらに結合テスト、負荷テストなどがあります。大きく異なるのはUI側のテストでしょう。Webアプリケーションの場合、Seleniumを使ってWebブラウザを自動操作してテストを行うのが一般的です。
モバイルアプリの場合、例えば以下のようなサービスがあります。Webアプリケーションの場合、任意のOSでWebブラウザさえあればテストできますが、モバイルの場合は実機が必要なのが問題です。
- Firebase Test Lab
- XCUITest(iOSのみ)
- EarlGrey(iOSのみ)
- AWS Device Farm
- Bitrise
ビルド・リリースについて
DevOpsにおいて、ビルドからリリースまでの手順を自動化(またはボタンを押すのみ)にできるかどうかは重要です。このフェーズの中に秘伝のタレがあると、人や組織への依存がなくせません。その結果、リリースした途端に問題が出たり、開発環境と状況が異なっているといった問題に繋がります。
多くの場合、次のような進め方になるでしょう。
- 開発者がソースコードをバージョン管理にプッシュする(ブランチはmaster以外)
- プッシュされたコードに対して自動化されたテストが実行される
- テストが通過した場合のみ、マージ可能になる
- コードをレビューし、マージされる
- マージされたコードを即時反映、または他の変更と合わせて本番環境へ反映
5の段階でアプリが自動ビルドされていれば、後は審査へ進めることになります。
MonacaではMonaca CIというビルド自動化環境を提供しています。これはGitHubと連携し、コードの変更がコミットされたタイミングでビルドが自動的に行われます。ビルド後、Hockey AppやDeploy Gateといったアプリ配信サービスと連携し、テスターへの配信やストアへのアップロード自動化が可能です。
Monaca CIでCordovaのビルドとデプロイを自動化 | Monaca
サーバ側のコード変更について
Webアプリケーションのように、UIをサーバ側で制御できる場合とは異なり、モバイルアプリではクライアントごとにバージョンが異なる可能性があります。そのため、後方互換性のないコード変更はアプリが動作しなくなる可能性があります。最新版のモバイルアプリで動作していれば問題ない、というのではなく、旧バージョンにおいても正しく動作できるようにサーバ側のコード(API)にも気を配らなければなりません。
セキュリティの問題などで、どうしても破壊的な更新になってしまう場合もあるでしょう。その場合に備えて、アプリを強制的にアップデートする仕組みを用意しておくのも必要なことです。アプリを起動した際にバージョンをチェックし、サーバ側でサポートする版と比べて古い場合にはアップデートを促すようにします。
そうした仕組みを導入する場合にも、アプリの審査が通過してリリースできる状態になってからでないとサーバ側のコードはアップデートしてはいけないので注意してください。万一、サーバ側をアップデートした後で審査に落ちたりすると、アプリが動作しなくなる期間が長くなってしまいます。
Monacaのようなハイブリッドアプリでは、外部のJavaScriptを読み込むことでパッチ処理も可能です。審査を伴わないアップデートになるので、あまり大規模にUIが変わる、動作が変わるというのはお勧めできません。In-App アップデーター プラグイン | Monaca Docsを使うことで、アプリ内のアセットを更新できます。緊急的なバグフィックスにも利用できます。
全体の仕組みについて
DevOpsは組織論であると書きましたが、関連ツールの組み合わせも大事な要素です。極限まで自動化することで、開発からリリースまでの時間を短縮し、短いスパンでの繰り返しリリースを実現できます。
Monacaを利用する場合、次のような図になります。
12時の方向から順番に上げていきます。
- Monaca IDE(他にLocalKit、CLIが選択可能)で開発
- GitHubにコードをコミット(ブランチは個別)
- テストを実行
- テストが通ったら開発用ブランチ(developなど)にマージ
- developブランチが更新されたタイミングでMonaca CIにてビルド
- デプロイサービスを通じてアプリをテスターに配布
- テスターの結果を得て、アプリをストアにアップロード
- 審査を通過してリリース
これをいかにスムーズに、かつ小さなリリースで繰り返すかがDevOpsの鍵になるでしょう。
まとめ
モバイルアプリは無数に存在し、ユーザに選ばれるためにはアップデートを通じてユーザの要望に応え続けるほかありません。そのためには短いスパンで品質の高いアプリリリースを継続する必要があります。そのためにDevOpsの導入は必須でしょう。
Monacaでは皆さんのアプリ開発をよりスムーズにできる仕組みを提供しています。ぜひ導入してみてください。