Upgrade to Pro — share decks privately, control downloads, hide ads and more …

開発からアプリストアまで一気に自動化!モバイルアプリのCI/CD徹底解説

 開発からアプリストアまで一気に自動化!モバイルアプリのCI/CD徹底解説

今回の「とことんDevOps勉強会」では、iOSやAndroidといったモバイルアプリのCI/CDの構築方法について紹介します。日本仮想化技術ではお客様からのご要望で、Flutterを使用したモバイルアプリのCI/CDの構築をGitHub Actionsを使って実現しました。ターゲットプラットフォームにおけるビルドやストアへの登録までをGitHub Actionsを使って実現する一連の流れを紹介します。
まだまだ情報が少ないモバイルアプリのCI/CDの実現方法を、試行錯誤しながらまとめ上げました。今回はそのノウハウを惜しげもなく公開してしまいます。皆様のご参加をこころよりお待ちしております。

とことんDevOps

September 29, 2022
Tweet

More Decks by とことんDevOps

Other Decks in Technology

Transcript

  1. • 本名: 石本 達也 • 日本仮想化技術(VTJ) DevOpsエンジニア ◦ 長崎出身→福岡→東京 • 2012年10月〜 OSC福岡で初めて学生として参加し、オープンソースを知る

    • 2015年04月  新卒として商社系の SIerに入社 ◦ SAPの導入支援&アドオン開発を担当 • 2017年07月  ベンチャー系の人材紹介会社に入社 ◦ 大手通信会社の案件でサービス開発 PJで要件調整やマルチベンダとの折衝や調整を担当 ◦ 社内に戻りディレクション業務と RPA開発チーム立ち上げをエンジニア兼務で担当 • 2022年01月  日本仮想化技術に入社(8ヶ月目) ◦ 開発環境構築を「かんたん」に、開発サイクルとリリースを「はやく」 ◦ VS Codeを軸にした仕組み作りや自動化を中心に実験と検証 ◦ 得たナレッジや気づきを弊社で開発を進めているDevOps支援サービスを反映 自己紹介 3
  2. DevOpsの4本柱 • 文化 • 仕組みを回していくうちに文化として受け 入れて徐々に定着させていく • 自動化 • 目の前の小さなが改善の積み上げよりも、

    仕組みから変えることで大きな改善に繋が ることも • メトリクス • ブラックボックス化したシステムを言い訳に せず、どんどん情報収集する仕組み作り • 共有 • 自分自身で理解するよりも、他人に説明し て理解してもらうことの方が難しい • 自動化してツールとして共有することもあり 6
  3. • 開発対象のプラットフォームを決める ◦ Apple、Android • 開発手法を決める モバイルアプリ開発を始めるには 開発手法 主な言語や技術 など

    メリット/デメリット ネイティブアプリ Apple:Objective-C、Swift Android:Java、Kotlin など ・パフォーマンスが高い ・AndroidとiOS向けに対応しようとすると両方で開発が 必要 クロスプラットフォームアプリ Flutter、React Native など ・両環境向けにビルド可能 ・新機能や最新OSへの対応待ち期間がある ・端末固有機能に対応していないものある ハイブリッドアプリ JavaScriptやHTMLなどのWeb技術や WebViewなどを駆使して開発 ・WebViewでできる範囲に限られる ・新機能や最新OSへの対応待ち期間がある ・端末固有機能に対応していないものある 8
  4. • Googleが開発している汎用モバイルOS ◦ LinuxカーネルやOSSがベース ◦ テレビ用: Android TV、自動車用: Android Auto、ウェアラブルデバイス用

    : Wear OS など • KotlinやJava などを使用して開発できる • 2003年、携帯電話向けソフトウェアプラットフォームを開発するAndroid社を設立 ◦ アンディ・ルービンら 3名 • 2005年、GoogleがAndroid社を買収 • 2007年11月、携帯電話用ソフトウェアのプラットフォームとしてOHAからAndroidを発表 ◦ OHAは、規格団体のオープン・ハンドセット・アライアンスのこと ◦ Apache License 2.0に基づいて配布 • Android 12が主流で最新バージョンとしてAndroid 13が出ている(2022/09/28時点) • 仮想マシン ◦ 〜Android 4.4は、基本的にはDalvik(ダルビック)仮想マシン (VM) 上で動作 ▪ 実行直前にネイティブコードに変換して動作させる JITコンパイル方式 ◦ Android 4.4 (KitKat) 〜は、仮想マシンAndroid Runtime (ART) 上で動作 ▪ 予め最初からネイティブコードに変換しておく (ahead-of-time; AOT)方式 ▪ AOTとインタープリタとJITをミックスしたハイブリッド方式 (Android 7.0〜) Androidとは 11
  5. 歴代のコードネーム 12 • 〜1.4まで • 通常のバージョニング • 1.1、1.2… • バージョン1.5から9まで

    • 頭文字がバージョンの発表順に CからPまでのアルファベット順で始まる菓子の名前 • Androidロボットが各コードネームの菓子に扮していた • コードネームがエンドユーザー向けの製品別名として使われることもあった • Cupcake (1.5)、Donut (1.6)、Jelly Bean (4.1, 4.2, 4.3) など • バージョン10から • アルファベット1文字だけになった • コードネームはエンドユーザー向けの製品別名としては使われなくなっている
  6. Android Studioとは 13 • Googleが提供するAndroid向けアプリケーション開発用の統合開発環境(IDE) ◦ JetBrains社が開発したIntelliJ IDEAをベース ◦ プロジェクト作成からアプリ実行までを行うことができる

    • 公式サイトからインストーラーを用いてインストール • 2013年5月にGoogle I/Oで発表され、2014年12月にGA ◦ EclipseとAndroid Development Tools(ADT)は、2015年にサポートが終了して役目を Android Studioに引き継いだ • Android SDKやAndroid NDKなどが含まれている
  7. • Android Software Development Kitの略 • アプリケーション開発用ツールセット Android SDKとは 14

    https://developer.android.com/studio/intro/update?hl=ja#sdk-manager Android SDK Build-Tools Android アプリをビルドするために必要なツール。 Android SDK Platform-Tools Android プラットフォームに必要な各種ツール。 (Android Debug Bridge(adb) など) Android SDK Tools ProGuard などの基本的なツール。 Android Emulator 開発端末上でデバイスを動かすために必要なツール。 Android Virtual Device(AVD)というPC上で動作する仮想デバイスとプラットフォームを組み合わせ てデバイスを動作させる Android SDK Platform プラットフォームをインストールしたり、削除したりできる (Android 12.0 (S) / APIレベル31 など)
  8. • Android Debug Bridge(=adb) • 実機デバイス上で実行しながらPC上で デバッグすることができる仕組み • USBケーブル経由やWi-Fi経由などをサポート •

    使用している実機のOSバージョンとAPIレベル に依存 • 詳しくはこちら • 複数の実機デバイス不要で動作 • 仮想デバイス(AVD)とOSバージョンやAPIレベ ルなどの組み合わせが自在 • Android Virtual Device • 実機デバイスに比べると動作は重め • 詳しくはこちら Android Debug Bridge Android Debug BridgeとAndroid Emulator 15 Android Emulator
  9. iOS / iPadOS / macOS / watchOS…とは 18 • Appleが開発および提供するモバイルOS

    • iOS ◦ iPhone OSの略 ◦ iPhoneとiPod touch(2022/5/10に在庫限りで販売終了を発表) ◦ 主流はiOS15でiOS16が最近リリースされた • iPadOSは、iPad向け。macOSは、Macbook向け。watchOSは、Apple Watch向け.... • 開発言語は、SwiftやObjective-C ◦ 新規開発ではSwiftが採用されることが多い? ◦ 相互運用性が保証されているため、Swiftを使用したとしてもObjective-Cのライブラリを使用できる • Swift UI ◦ すべてのApple向けのアプリを単一のコードベースで開発できることを目的として開発された UI
  10. Xcode / Xcode Cloud • Xcode ◦ Appleが開発および提供している統合開発環境(IDE) ▪ Appleのパソコンでしか使えない

    ▪ AppleプラットフォームでAppを開発、テスト、配信するために必要なものが全て含まれている ◦ 最新バージョンは、Xcode14 ◦ Gitも一緒にインストールされる ◦ App Storeからダウンロード • Xcode Cloud(ベータ版) ◦ Xcodeに組み込まれたCI/CDサービス ◦ ビルドや複数の自動テストを並列実行、テスターへのAppの配信などが行える ◦ 先日ベータ版の招待が届いたので、検証中 19
  11. サマリ 20 Android iOS/macOS/iPadOS… Kotlin(、Java) 開発言語 Swift(、Objective-C) Android Studio エディタ

    Xcode Android 12〜13 直近のバージョン iOS15〜16 Android SDK、NDK SDK など iOS SDK、macOS SDK… エミュレーター 実行環境 シミュレーター レイアウトエディター UIツール デザインエディター 内部テスト/外部テスト... テスト配信 TestFlight Google デベロッパー デベロッパー アカウント Apple デベロッパー aab 公開・配布可能なファイル形式 ipa Google Play Store ストア App Store Google Play Store Console 管理コンソール など Apple Developer Portal App Store Connect
  12. • Google PlayでAndroidアプリを公開するため に必要 • Googleアカウントがあればベータ版の使用は 可能 • Googleアカウントを使用して発行(登録料が1回 限りでUS$25必要)

    • アカウントが発行されるとGoogle Play Consoleが使用できるようになる Google Play デベロッパー アカウント デベロッパー アカウント 22 Apple デベロッパー アカウント • Apple StoreでiOSアプリを公開するために必要 • ベータ版の使用や各種ツール、情報提供を得る ために必要 • 高度な機能を備えたAppをビルドして配信する 場合、Apple Developer Programが必要(年 間登録料がUS$99必要) • Apple Developer PortalとApp Store Connect が使用できるようになる
  13. Android App Bundle(AAB)とAndroid Package(APK) Android App Bundle(AAB) 24 • 2018

    年にリリースされた Android 用の公開の みを目的としたファイル形式 • App Bundle をデバイスにインストールできるよ うにするには、ディストリビュータが APK に加 工することが必要 • オープンソース Android Package(APK) • Android用のインストールかつ実行可能なアプ リ形式 • タブレット端末や機種ごとに作成する必要があ る
  14. • バックエンド ◦ PythonとRESTfulなAPI開発をするためのWebフレームワーク • フロントエンド ◦ 各種エミュレーター(シミュレーター)を使用 ◦ エミュレーターとバックエンドの通信

    ◦ エディタとエミュレータの通信 • インフラとユーザーアクセス ◦ テスト配信したモバイル端末からアクセスされる APIサーバー ◦ DBとしてクラウドSQLを使用 ◦ モバイルアプリのCI/CDで使用する暗号化された証明書管理用のバケット • CI/CD ◦ Mac Runnerも使用 ◦ モバイルアプリまわりの自動化ツールとして Fastlaneを使用 全体構成の概要 27
  15. • Python + FastAPI ◦ FastAPIは、PythonでRESTfulなAPI開発をするためのWebフレームワーク • コーディング規約は、PEP8を使用 ◦ VS

    Codeでレコメンドされるもの • テストフレームワーク ◦ pytest • Docker環境 ◦ APIサーバー:Pythonイメージをベース ◦ DBサーバー:PostgreSQLイメージをベース 30 バックエンド環境の概要
  16. • Flutter + Dart ◦ どちらもGoogleによって開発されたもの ◦ Flutter ▪ SDK(Software

    Development Kit) ▪ クロスプラットフォームなアプリケーション開発が可能 ◦ Dart ▪ Webアプリやモバイルアプリのクライアント開発向けに設計された プログラミング言語 ▪ ネイティブコードまたは、 JavaScriptにコンパイルできる • 使用するネイティブ言語 ◦ Android:Kotlin、iOS:Swift • コーディング規約 ◦ Dartガイドラインはこちら • テストフレームワーク ◦ Dartが標準で提供しているライブラリを使用 ◦ 単体テスト、コンポーネントテスト、 E2Eテスト • 実行環境 ◦ 各種シミュレーター(エミュレーター) フロントエンド(モバイル)環境の概要 34
  17. CI/CD環境の概要 • GitHub Actionsとは ◦ ビルド、テスト、デプロイなどのワークフローをGitHubから直接実行できる自動化ツール • 無料プランで2,000分の無料枠が毎月与えられる[1] • ワークフロー

    > ジョブ >ステップで構成[2] ◦ 作成個数に制限は実質なし ◦ 実行時間の上限は、ワークフロー: 35日間。ジョブ:最大6時間。 ▪ 上限に到達した場合は、途中でキャンセルされて正常に完了しない ◦ APIリクエストの上限は、 1,000件/h ◦ 同時実行ジョブ数の上限 は、無料プランで全体の合計が 20個まで(macOSは最大5個まで) • ジョブマトリックス:最大 256のジョブ • ワークフロー実行キュー: 10秒間隔で500まで 40
  18. • GitHub Actionsで極端に処理が遅くなる問題に遭遇 • Flutterで使用しているパッケージか GitHub Actionsのスペック不足かなどは調査中 • スペック問題は、GitHub Actionsでは回避策がないためCircleCIがおすすめ

    • Trigger CircleCI Pipelineを使用することでGitHub ActionsからCircleCIを実行することも可能 • セルフホステッドランナーは、検証やデバッグ用途で使用中 • GitHub Hostedとは勝手が違う。足りないパッケージなどは自分でインストールが必要 • 節約目的などでの本番運用は現時点では消極的 モバイルアプリで使用するランナー概要 43 Android側 Apple側 Ubuntu Runner ランナー Mac Runner 2-core CPU (x86_64) CUP 3-core CPU (x86_64) 7 GB of RAM メモリ 14 GB of RAM 14 GB of SSD space ストレージ 14 GB of SSD space できる(パブリックベータ版) インスタンスのサイズアップ できない 1クレジット 消費クレジット数/分 10クレジット
  19. ステップで使用しているAction一覧 • ステップで主に使用しているAction一覧 ◦ GitHubのマーケットプレイスから入手可能 • Fastlnaeは、Rubyのパッケージに含まれる • 実行環境構築系のActionの使用が中心 •

    それ以外の部分は、シェルスクリプトにまとめてステップ内で呼び出している 45 Action名 説明 actions/checkout GitHubからソースコードをクローンする際に使用する Action actions/setup-java Javaの実行環境を構築する Action subosito/flutter-action Flutterの実行環境を構築する Action ruby/setup-ruby Rubyの実行環境を構築する Action slackapi/slack-github-action Slackメッセージを送信する際に使用
  20. 主なコマンド • 「gem install fastlane」or「brew install fastlane」 ◦ Fastlaneの実行環境を構築 ◦

    Macに標準で入っている Rubyの使用は推奨しない (ドキュメントより) ▪ 依存関係管理まわりが複雑で競合が発生する可能性がある ◦ anyenv > rbenv > rubyなどで別に用意する • fastlane init ◦ 初期プロジェクトを作成 ◦ (project)/androidと(project)/iosのそれぞれで実行する • fastlane (レーン名) ◦ Fastfileで定義したレーンの内容を実行する 48
  21. • Fastfile[1] ◦ fatslane (レーン名)コマンドで実行する自動化のシナリオが書かれているファイル ◦ .(プロジェクト名)/(プラットフォーム名)/fastfileに格納されている ◦ Rubyの構文を使用している ◦

    AppfileやMatchfileに記載した情報は自動で Actionに渡される ◦ Fastfileなどに直接センシティブな情報を記載すると ログ上に出力される場合があるので注意 • Appfile[2] ◦ Fastfileが処理される際に読み込まれる設定ファイル ▪ Apple IDやアプリ識別子 など • Matchfile[3] ◦ Fsatlane Matchコマンドを使用する際に読み込まれる設定ファイル 主なファイル 49
  22. 主に使用しているFastlane Action 50 対象 アクション名 説明 ALL create_keychain キーチェーンを作成 [1]

    iOS automatic_code_signing Xcodeのコード署名を有効化 iOS match 開発チーム全体で1つのコード署名IDを共有して、コード署名の設定を簡素化 iOS app_store_connect_api_key App Store Connect API トークンを取得 ALL flutter_version pubspec.ymlからバージョン情報を取得 iOS latest_testflight_build_number TestFlight から最新のビルド番号を取得 iOS upload_to_testflight TestFlight ベータ テスト用に新しいバイナリを App Store Connect にアップロード Android google_play_track_version_codes Google Play トラックのバージョンコードを取得 Android upload_to_play_store バイナリを Google Play にアップロード
  23. 流れ 52 流れ 説明 初期構築 「flutter create (ディレクトリ名)」でプロジェクト作成を実行 実装 「flutter

    run -d (デバイス名)」でアプリを実行 ビルド 「flutter build appbundle」や「flutter build ipa」でビルドを実行 ストアにアップロード Fastlaneで実行 テスターに配信 iOS側はアップロード後に自動でテスターに配信される (設定が必要) Android側はPlay Console画面でリリースを作成して配信する必要がある Google Play Developer APIなどを活用して自動化できるかも? 審査、公開 省略
  24. • APK をデバイスにインストールしたり更新したり する前に、証明書を使用してすべての APK に デジタル署名する必要がある • AABを使用してリリースする場合は、Playアプリ 署名によって処理が行われる

    アプリへの署名(Android側) アップロード署名 55 • Play Store Consoleにアップロードする際に必 要な署名 • keytoolコマンドで生成したものを使用する • 初回のみ画面上からアップロードする必要があ る アプリ署名
  25. アプリ署名 • Google がデベロッパーに代わってアプリの署名鍵を管理および保護し、その署名鍵を使用して、App Bundle から生成され最適化された配布用 APK に署名する • Google

    の安全なインフラストラクチャにアプリ署名鍵を保存し、セキュリティを強化するためのアップグ レード オプションを提供 • Google の鍵管理サービスによって保護 • Google Cloudのセキュリティに関するホワイトペーパー • Androidアプリは秘密鍵で署名される • 秘密鍵は公開鍵証明書に関連付けられている • 公開鍵証明書を使って、アプリのアップデートが同じ提供元によるものであることを確認できる https://support.google.com/googleplay/android-developer/answer/9842756?hl=ja#zippy=%2C鍵アー ティファクトツールの説明 56
  26. アップロード鍵 • 公式ドキュメントより ◦ keytoolを使用して鍵を生成 ▪ keytool -genkey -v -keystore

    ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload ◦ [project]/android/key.propertiesファイルを作成 ◦ Gradle でサインインを構成する ▪ [project]/android/app/build.gradleファイルを編集 57
  27. 証明書 59 • iOS、tvOS、watchOSは同じ証明書セットでOK。macOSは別の証明書セットが必要(だった) • Xcode 11以降は、すべてのプラットフォームで統一された証明書を作成できる https://help.apple.com/developer-account/?lang=ja#/deveedc0daa0 証明書 説明

    開発証明書 ・デバイスでAppを実行したり、Appサービスを利用したりするときに必要 ・個人所有。iOS用に2つ、macOS用に2まで 配布用証明書 ・Appをテスト用に配信したり、 App Store Connectにアップロードしたりする時に必要 ・チーム所有。1チームにつき、1つまで ・作成者は、Account HolderかAdminの役割を持っているアカウントのみ クラウド管理対象証明書 ・Xcode Organaizerのアーカイブと配信ワークフローを使用している場合に管理対象になる Developer ID 証明書 ・App Store以外の場所からダウンロードされるようなアプリ配信時に必要になる ・詳しくはこちら
  28. iOS側のアップロード例 61 ※逆順に説明しています • アプリをApp Store Connectにアップロード ◦ upload_to_testflightを使用 ◦

    ビルド済みのIPAファイル ◦ APIキー ◦ 証明書 • ビルド番号の整合性チェック ◦ latest_testflight_build_numberとflutter_versionを使 用 ◦ アップロード中にエラーで止まると待ち時間が無駄に なるため • App Store ConnectからAPIキーを取得 ◦ app_store_connect_api_keyを使用
  29. ※逆順に説明しています • 証明書の取得 ◦ matchを使用 ◦ 証明書を保持するための箱 (キーチェーン)が必要 • Xcode署名の有効

    ◦ automatic_code_signingを使用 • キーチェーンを作成 ◦ create_keychainを使用 iOS側の事前準備の例 62