Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

● 本名: 石本 達也 ● 日本仮想化技術(VTJ) DevOpsエンジニア ○ 長崎出身→福岡→東京 ● 2012年10月〜 OSC福岡で初めて学生として参加し、オープンソースを知る ● 2015年04月  新卒として商社系の SIerに入社 ○ SAPの導入支援&アドオン開発を担当 ● 2017年07月  ベンチャー系の人材紹介会社に入社 ○ 大手通信会社の案件でサービス開発 PJで要件調整やマルチベンダとの折衝や調整を担当 ○ 社内に戻りディレクション業務と RPA開発チーム立ち上げをエンジニア兼務で担当 ● 2022年01月  日本仮想化技術に入社(8ヶ月目) ○ 開発環境構築を「かんたん」に、開発サイクルとリリースを「はやく」 ○ VS Codeを軸にした仕組み作りや自動化を中心に実験と検証 ○ 得たナレッジや気づきを弊社で開発を進めているDevOps支援サービスを反映 自己紹介 3

Slide 4

Slide 4 text

DevOpsとは 開発と運用が密に連携して協力しあう開発手法 4

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

DevOpsの4本柱 • 文化 • 仕組みを回していくうちに文化として受け 入れて徐々に定着させていく • 自動化 • 目の前の小さなが改善の積み上げよりも、 仕組みから変えることで大きな改善に繋が ることも • メトリクス • ブラックボックス化したシステムを言い訳に せず、どんどん情報収集する仕組み作り • 共有 • 自分自身で理解するよりも、他人に説明し て理解してもらうことの方が難しい • 自動化してツールとして共有することもあり 6

Slide 7

Slide 7 text

モバイルアプリ開発を始めるには 7

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

ネイティブアプリ開発 9

Slide 10

Slide 10 text

Android 10

Slide 11

Slide 11 text

● 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

Slide 12

Slide 12 text

歴代のコードネーム 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文字だけになった • コードネームはエンドユーザー向けの製品別名としては使われなくなっている

Slide 13

Slide 13 text

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などが含まれている

Slide 14

Slide 14 text

• 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 など)

Slide 15

Slide 15 text

• 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

Slide 16

Slide 16 text

APIレベル • Android プラットフォームのバージョンごとに提供されるフレームワーク API のリビジョンを一意に識別す る整数値 • Google側でサポートを求めるレベルが指定されてる 16 Google Play アプリの対象 API レベル要件 APIレベルとは

Slide 17

Slide 17 text

17 iOS / iPadOS / macOS / watchOS…

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

Xcode / Xcode Cloud ● Xcode ○ Appleが開発および提供している統合開発環境(IDE) ■ Appleのパソコンでしか使えない ■ AppleプラットフォームでAppを開発、テスト、配信するために必要なものが全て含まれている ○ 最新バージョンは、Xcode14 ○ Gitも一緒にインストールされる ○ App Storeからダウンロード ● Xcode Cloud(ベータ版) ○ Xcodeに組み込まれたCI/CDサービス ○ ビルドや複数の自動テストを並列実行、テスターへのAppの配信などが行える ○ 先日ベータ版の招待が届いたので、検証中 19

Slide 20

Slide 20 text

サマリ 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

Slide 21

Slide 21 text

デベロッパーアカウント 21

Slide 22

Slide 22 text

• 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 が使用できるようになる

Slide 23

Slide 23 text

公開・配布可能なファイル形式 23

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

クロスプラットフォームアプリ 25

Slide 26

Slide 26 text

今回はFlutter + Dart + VS Code 26

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

バックエンド 28

Slide 29

Slide 29 text

全体構成(1/3) 29

Slide 30

Slide 30 text

● Python + FastAPI ○ FastAPIは、PythonでRESTfulなAPI開発をするためのWebフレームワーク ● コーディング規約は、PEP8を使用 ○ VS Codeでレコメンドされるもの ● テストフレームワーク ○ pytest ● Docker環境 ○ APIサーバー:Pythonイメージをベース ○ DBサーバー:PostgreSQLイメージをベース 30 バックエンド環境の概要

Slide 31

Slide 31 text

バックエンド環境の構築について詳しく知りたい方は 31 https://speakerdeck.com/ismt7/vs-codedeshi-meruwebapurikesiyonkai-fa-ru-men?slide=27

Slide 32

Slide 32 text

フロントエンド 32

Slide 33

Slide 33 text

全体構成(2/3) 33

Slide 34

Slide 34 text

● Flutter + Dart ○ どちらもGoogleによって開発されたもの ○ Flutter ■ SDK(Software Development Kit) ■ クロスプラットフォームなアプリケーション開発が可能 ○ Dart ■ Webアプリやモバイルアプリのクライアント開発向けに設計された プログラミング言語 ■ ネイティブコードまたは、 JavaScriptにコンパイルできる ● 使用するネイティブ言語 ○ Android:Kotlin、iOS:Swift ● コーディング規約 ○ Dartガイドラインはこちら ● テストフレームワーク ○ Dartが標準で提供しているライブラリを使用 ○ 単体テスト、コンポーネントテスト、 E2Eテスト ● 実行環境 ○ 各種シミュレーター(エミュレーター) フロントエンド(モバイル)環境の概要 34

Slide 35

Slide 35 text

● 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

Slide 36

Slide 36 text

Flutter Studio • 非公式なUIエディターツールはあれこれ存在している • ツールで生成したコードをコピペして持っていくような流れ • https://flutterstudio.app/ 36

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

CI/CD 39

Slide 40

Slide 40 text

CI/CD環境の概要 ● GitHub Actionsとは ○ ビルド、テスト、デプロイなどのワークフローをGitHubから直接実行できる自動化ツール ● 無料プランで2,000分の無料枠が毎月与えられる[1] ● ワークフロー > ジョブ >ステップで構成[2] ○ 作成個数に制限は実質なし ○ 実行時間の上限は、ワークフロー: 35日間。ジョブ:最大6時間。 ■ 上限に到達した場合は、途中でキャンセルされて正常に完了しない ○ APIリクエストの上限は、 1,000件/h ○ 同時実行ジョブ数の上限 は、無料プランで全体の合計が 20個まで(macOSは最大5個まで) ● ジョブマトリックス:最大 256のジョブ ● ワークフロー実行キュー: 10秒間隔で500まで 40

Slide 41

Slide 41 text

全体イメージ 41

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

• 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クレジット

Slide 44

Slide 44 text

弊社メンバーのブログ記事(9/26公開) 44 https://devops-blog.virtualtech.jp/entry/20220926/1664160391

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

Fastlane 46

Slide 47

Slide 47 text

CI/CD環境の概要(Fastlane) ● Fastlaneは、iOS および Android アプリのベータ展開とリリースを自動化するツール ○ スクリーンショットの生成、コード署名の処理、アプリケーションのリリースなど ● macOSは正式サポート。WindowsとLinuxは部分的にサポート ○ GitHub Actions上では、Android側のビルドにUbuntu Runnerを使用しているが現状は問題なく使えている ● MITライセンス 47

Slide 48

Slide 48 text

主なコマンド ● 「gem install fastlane」or「brew install fastlane」 ○ Fastlaneの実行環境を構築 ○ Macに標準で入っている Rubyの使用は推奨しない (ドキュメントより) ■ 依存関係管理まわりが複雑で競合が発生する可能性がある ○ anyenv > rbenv > rubyなどで別に用意する ● fastlane init ○ 初期プロジェクトを作成 ○ (project)/androidと(project)/iosのそれぞれで実行する ● fastlane (レーン名) ○ Fastfileで定義したレーンの内容を実行する 48

Slide 49

Slide 49 text

● Fastfile[1] ○ fatslane (レーン名)コマンドで実行する自動化のシナリオが書かれているファイル ○ .(プロジェクト名)/(プラットフォーム名)/fastfileに格納されている ○ Rubyの構文を使用している ○ AppfileやMatchfileに記載した情報は自動で Actionに渡される ○ Fastfileなどに直接センシティブな情報を記載すると ログ上に出力される場合があるので注意 ● Appfile[2] ○ Fastfileが処理される際に読み込まれる設定ファイル ■ Apple IDやアプリ識別子 など ● Matchfile[3] ○ Fsatlane Matchコマンドを使用する際に読み込まれる設定ファイル 主なファイル 49

Slide 50

Slide 50 text

主に使用している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 にアップロード

Slide 51

Slide 51 text

モバイルアプリが リリースされるまで 51

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

アプリへの署名 53

Slide 54

Slide 54 text

Android側 54

Slide 55

Slide 55 text

• APK をデバイスにインストールしたり更新したり する前に、証明書を使用してすべての APK に デジタル署名する必要がある • AABを使用してリリースする場合は、Playアプリ 署名によって処理が行われる アプリへの署名(Android側) アップロード署名 55 • Play Store Consoleにアップロードする際に必 要な署名 • keytoolコマンドで生成したものを使用する • 初回のみ画面上からアップロードする必要があ る アプリ署名

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

アップロード鍵 ● 公式ドキュメントより ○ 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

Slide 58

Slide 58 text

iOS側 58

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

Fastlaneでアップロードを自動化 60

Slide 61

Slide 61 text

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を使用

Slide 62

Slide 62 text

※逆順に説明しています ● 証明書の取得 ○ matchを使用 ○ 証明書を保持するための箱 (キーチェーン)が必要 ● Xcode署名の有効 ○ automatic_code_signingを使用 ● キーチェーンを作成 ○ create_keychainを使用 iOS側の事前準備の例 62

Slide 63

Slide 63 text

Fastlane Matchとは ● チーム全体で証明書とプロファイルを簡単に同 期できる仕組み ● GCPとAWSとGitから選択できる ○ GitはGitHubを通じて共有する ● CI/CDを1メンバーとして扱うイメージで作成 63

Slide 64

Slide 64 text

おわり 64