$30 off During Our Annual Pro Sale. View Details »

開発からアプリストアまで一気に自動化!モバイルアプリの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. 開発からアプリストアまで一気に自動化! モバイルアプリのCI/CD 徹底解説 日本仮想化技術株式会社 VirtualTech.jp 2022/09/28 1

  2. 資料は後ほど公開します 文字が多めです。公開資料は、読み物としてご活用ください。 2

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

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

  5. もう少し詳しく知りたい人向け 5 https://www.slideshare.net/ToruMiyahara/devops-251879644

  6. DevOpsの4本柱 • 文化 • 仕組みを回していくうちに文化として受け 入れて徐々に定着させていく • 自動化 • 目の前の小さなが改善の積み上げよりも、

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

  8. • 開発対象のプラットフォームを決める ◦ Apple、Android • 開発手法を決める モバイルアプリ開発を始めるには 開発手法 主な言語や技術 など

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

  10. Android 10

  11. • 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
  12. 歴代のコードネーム 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文字だけになった • コードネームはエンドユーザー向けの製品別名としては使われなくなっている
  13. 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などが含まれている
  14. • 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 など)
  15. • 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
  16. APIレベル • Android プラットフォームのバージョンごとに提供されるフレームワーク API のリビジョンを一意に識別す る整数値 • Google側でサポートを求めるレベルが指定されてる 16

    Google Play アプリの対象 API レベル要件 APIレベルとは
  17. 17 iOS / iPadOS / macOS / watchOS…

  18. 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
  19. Xcode / Xcode Cloud • Xcode ◦ Appleが開発および提供している統合開発環境(IDE) ▪ Appleのパソコンでしか使えない

    ▪ AppleプラットフォームでAppを開発、テスト、配信するために必要なものが全て含まれている ◦ 最新バージョンは、Xcode14 ◦ Gitも一緒にインストールされる ◦ App Storeからダウンロード • Xcode Cloud(ベータ版) ◦ Xcodeに組み込まれたCI/CDサービス ◦ ビルドや複数の自動テストを並列実行、テスターへのAppの配信などが行える ◦ 先日ベータ版の招待が届いたので、検証中 19
  20. サマリ 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
  21. デベロッパーアカウント 21

  22. • 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 が使用できるようになる
  23. 公開・配布可能なファイル形式 23

  24. Android App Bundle(AAB)とAndroid Package(APK) Android App Bundle(AAB) 24 • 2018

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

  26. 今回はFlutter + Dart + VS Code 26

  27. • バックエンド ◦ PythonとRESTfulなAPI開発をするためのWebフレームワーク • フロントエンド ◦ 各種エミュレーター(シミュレーター)を使用 ◦ エミュレーターとバックエンドの通信

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

  29. 全体構成(1/3) 29

  30. • Python + FastAPI ◦ FastAPIは、PythonでRESTfulなAPI開発をするためのWebフレームワーク • コーディング規約は、PEP8を使用 ◦ VS

    Codeでレコメンドされるもの • テストフレームワーク ◦ pytest • Docker環境 ◦ APIサーバー:Pythonイメージをベース ◦ DBサーバー:PostgreSQLイメージをベース 30 バックエンド環境の概要
  31. バックエンド環境の構築について詳しく知りたい方は 31 https://speakerdeck.com/ismt7/vs-codedeshi-meruwebapurikesiyonkai-fa-ru-men?slide=27

  32. フロントエンド 32

  33. 全体構成(2/3) 33

  34. • Flutter + Dart ◦ どちらもGoogleによって開発されたもの ◦ Flutter ▪ SDK(Software

    Development Kit) ▪ クロスプラットフォームなアプリケーション開発が可能 ◦ Dart ▪ Webアプリやモバイルアプリのクライアント開発向けに設計された プログラミング言語 ▪ ネイティブコードまたは、 JavaScriptにコンパイルできる • 使用するネイティブ言語 ◦ Android:Kotlin、iOS:Swift • コーディング規約 ◦ Dartガイドラインはこちら • テストフレームワーク ◦ Dartが標準で提供しているライブラリを使用 ◦ 単体テスト、コンポーネントテスト、 E2Eテスト • 実行環境 ◦ 各種シミュレーター(エミュレーター) フロントエンド(モバイル)環境の概要 34
  35. • Android StudioやXcodeでアプリのUIをGUIを用いてデザインできるツール ◦ FlutterやVisual Studio Codeでは、公式で対応するツールや拡張機能がない • ホットリロードの機能などにも対応しているので、うまく付き合っていく レイアウトエディター

    / デザインエディター 35 https://developer.apple.com/jp/xcode/swiftui/ https://developer.android.com/studio/write/layout-editor?hl=ja
  36. Flutter Studio • 非公式なUIエディターツールはあれこれ存在している • ツールで生成したコードをコピペして持っていくような流れ • https://flutterstudio.app/ 36

  37. インフラとユーザーアクセス 37

  38. 全体構成(3/3) ※インフラ構成は簡略的な表記 38

  39. CI/CD 39

  40. CI/CD環境の概要 • GitHub Actionsとは ◦ ビルド、テスト、デプロイなどのワークフローをGitHubから直接実行できる自動化ツール • 無料プランで2,000分の無料枠が毎月与えられる[1] • ワークフロー

    > ジョブ >ステップで構成[2] ◦ 作成個数に制限は実質なし ◦ 実行時間の上限は、ワークフロー: 35日間。ジョブ:最大6時間。 ▪ 上限に到達した場合は、途中でキャンセルされて正常に完了しない ◦ APIリクエストの上限は、 1,000件/h ◦ 同時実行ジョブ数の上限 は、無料プランで全体の合計が 20個まで(macOSは最大5個まで) • ジョブマトリックス:最大 256のジョブ • ワークフロー実行キュー: 10秒間隔で500まで 40
  41. 全体イメージ 41

  42. ワークフロー/ジョブ/ステップ 42

  43. • 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クレジット
  44. 弊社メンバーのブログ記事(9/26公開) 44 https://devops-blog.virtualtech.jp/entry/20220926/1664160391

  45. ステップで使用している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メッセージを送信する際に使用
  46. Fastlane 46

  47. CI/CD環境の概要(Fastlane) • Fastlaneは、iOS および Android アプリのベータ展開とリリースを自動化するツール ◦ スクリーンショットの生成、コード署名の処理、アプリケーションのリリースなど • macOSは正式サポート。WindowsとLinuxは部分的にサポート

    ◦ GitHub Actions上では、Android側のビルドにUbuntu Runnerを使用しているが現状は問題なく使えている • MITライセンス 47
  48. 主なコマンド • 「gem install fastlane」or「brew install fastlane」 ◦ Fastlaneの実行環境を構築 ◦

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

    AppfileやMatchfileに記載した情報は自動で Actionに渡される ◦ Fastfileなどに直接センシティブな情報を記載すると ログ上に出力される場合があるので注意 • Appfile[2] ◦ Fastfileが処理される際に読み込まれる設定ファイル ▪ Apple IDやアプリ識別子 など • Matchfile[3] ◦ Fsatlane Matchコマンドを使用する際に読み込まれる設定ファイル 主なファイル 49
  50. 主に使用している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 にアップロード
  51. モバイルアプリが リリースされるまで 51

  52. 流れ 52 流れ 説明 初期構築 「flutter create (ディレクトリ名)」でプロジェクト作成を実行 実装 「flutter

    run -d (デバイス名)」でアプリを実行 ビルド 「flutter build appbundle」や「flutter build ipa」でビルドを実行 ストアにアップロード Fastlaneで実行 テスターに配信 iOS側はアップロード後に自動でテスターに配信される (設定が必要) Android側はPlay Console画面でリリースを作成して配信する必要がある Google Play Developer APIなどを活用して自動化できるかも? 審査、公開 省略
  53. アプリへの署名 53

  54. Android側 54

  55. • APK をデバイスにインストールしたり更新したり する前に、証明書を使用してすべての APK に デジタル署名する必要がある • AABを使用してリリースする場合は、Playアプリ 署名によって処理が行われる

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

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

  59. 証明書 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以外の場所からダウンロードされるようなアプリ配信時に必要になる ・詳しくはこちら
  60. Fastlaneでアップロードを自動化 60

  61. 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を使用
  62. ※逆順に説明しています • 証明書の取得 ◦ matchを使用 ◦ 証明書を保持するための箱 (キーチェーン)が必要 • Xcode署名の有効

    ◦ automatic_code_signingを使用 • キーチェーンを作成 ◦ create_keychainを使用 iOS側の事前準備の例 62
  63. Fastlane Matchとは • チーム全体で証明書とプロファイルを簡単に同 期できる仕組み • GCPとAWSとGitから選択できる ◦ GitはGitHubを通じて共有する •

    CI/CDを1メンバーとして扱うイメージで作成 63
  64. おわり 64