【Flutter】FastlaneとGithub Actionsで実現する継続デリバリー(CD)
iOS
Key Players
Provisioning profiles:
Signing Certificates:
Bundle Identifiers:Appleがアプリを特定するのに使うアプリID
fastlane 参考
- match:
- gym:
- cert
- sign
Key Concepts
Code signing
Code Signing
の背景知識
リリースに必要な- iOSアプリでは「誰がそのアプリを作ったのか?」と「署名後、第三者に改変されていないか?」を保証する為にアプリに制作者の署名が必要となる
- この署名を
Code Signing
と呼び、この際に用いられるのがProvisioning Profile
とCertificate
である - どちらもApple Developerアカウントを持つ事で生成する事が出来る
Certificate
-
Certificate
は開発用Apple Development
と配布用(リリース用)Apple Distribution
がある - プッシュ通知を使いたい場合は
Certificate
作成時点で明確に指定する必要がある - 手動ではMacにデフォルトで入っているキーチェーンアクセスアプリから証明書を要求する
CertificateSigningRequest.certSigningRequest
というcsrファイルを作成し、それを使ってcer形式の証明書ファイルが生成される - この証明書をダウンロードし、自身のMacのキーチェーンアクセスに登録する
- コード署名にはこの証明書から
Sigining Identity
と呼ばれる.p12ファイルが必要となる - .p12ファイルは秘密鍵と証明書のペアになっている
- 先のcsrファイル作成時に秘密鍵と公開鍵のペアが生成されており、その秘密鍵を.p12ファイルにアタッチしてるような形
- キーチェーンアクセスに登録された証明書から .p12ファイル を書き出せる
- 書き出す際に任意のパスワードを要求されるので入力したパスワードは忘れずに控えておく
Bundle Identifier
と「Identifiers」で登録するApp ID
- プロジェクト作成時に定義する
Bundle Identifier
はAppleがアプリを特定するのに使うアプリの識別子(ID) - アプリをリリースするにはこの
Bundle Identifier
をAppleに登録する必要があり、Apple Developerアカウントの「Identifiers」で行う事が出来る - 「Identifiers」のタブから「App IDs」として登録する事で自分の作成しているアプリのIDを正式に登録する事になる
- 作成時にPush通知などアプリが使う機能(
Entitlements
)の登録も行う
Provisioning Profile
- アプリに関する様々な設定を含むファイルで 1) Certificate , 2) APP ID と 3)このアプリをインストール可能なDevice ID で構成される
- 使用する環境によって
Provisioning Profile
の設定も異なり、開発用Development
, 限定公開用Ad Hoc
, (エンタープライズ用Enterprise
)と配布(リリース)用Distribution
を作成し、使う事になる - 開発中アプリの配布ではUDIDが登録されたデバイスでしかアプリをインストールする事が出来ない
- 配布用アプリではどんなデバイスでもインストール出来る必要があるので配布用プロビジョニングプロファイルではデバイス情報は含まれていない
Code Sigining
- 署名行為はXcodeや後述のfastlaneなどでアプリをビルド(アーカイブ)する際に行われ、手動で行う事はない
参考
fastlane
公式:https://docs.fastlane.tools/
必要な情報
Appfileに設定しておくと良い
- Bundle id
- Team name
- Apple user name
- App name
以上の情報がコマンド実行時に必要になる事が多いが、Appfile
に定義しておく事で、「CLIからの実行」、「カスタムレーンからの実行」どちらでも省略する事が出来る
fastlaneに用意されているコマンド
-
produce
:AppStoreConnectとApple Developer Portalの両方にアプリを作成してくれる
- CLIから実行もしくはfastlaneファイルに定義したカスタムレーン(カスタムコマンド)から実行する事が出来る
-
cert
: -
sign
: -
match
:チームで証明書、プロビジョニングプロファイルを管理する際に使う
- プライベートレポジトリで証明書、プロビジョニングプロファイルを管理する
-
cert
とsign
が個人で証明書、プロビジョニングファイルを管理する為に使われるのに対して、複数に証明書、プロビジョニングファイルを管理するのに有効 -
match appstore
など叩く事で、プライベートレポジトリから証明書と秘密鍵がローカルのKeychainにインストールされ、プロビジョニングファイルは~/Library/MobileDevice/Provisioning Profiles.
にインストールされる
-
gym
: -
deliver
: -
pilot
:
produce
produce(
username: "username",
app_identifier: "com.example.app",
app_name: "MyApp",
language: "English",
app_version: "1.0",
sku: "com.example.app",
team_name: "team_name"
)
sku
match
gym
deliver
pilot
参考
Github Actionsからfastlaneを実行する
今回はtest flightと合わせて、firebase app distributionへのデリバリーも行うworkflowを作成する
事前準備
- App Store Connectにアプリを作成 (
fastlane produce
が簡単) - App Store Connect API Keyの発行
- matchの初期設定をする (match用のgitレポジトリを作成、matchの初期設定を行う)
- match用のGitレポジトリの
Personal Access Token
の発行
使用するfastlane actions
-
create_keychain
:証明書やプロビジョニングプロファイルを管理するgitレポジトリにアクセスする為のkeychainの作成 公式 -
match
:keychainにストアしたアカウント名とパスワードで証明書やプロビジョニンプロファイルをダウンロード 公式 -
gym
:アプリをリリース用、もしくはテスト配布用にビルド。以前はbuild_app
と呼ばれていたがエイリアスとしてgym
になった。 公式 -
firebase_app_distribution
:fastlane用のapp_distributionプラグインを以下コマンドでインストールする事で使える 公式
$ fastlane add_plugin firebase_app_distribution
-
app_store_connect_api_key
:他のactionでapi keyを使える様に変数に格納する(ex.upload_to_app_store
で必要) 公式 -
deliver
:testflightの配布ではなく、単純にアーカイブしたipaファイルをappStoreにアップロードする。以前はupload_to_app_store
と呼ばれていたがエイリアスとしてdeliver
になった 公式 -
pilot
:testflightの配布。以前はupload_to_testflight
と呼ばれていたがエイリアスとしてpilot
になった。 公式
用意するカスタムレーン
開発版をApp Distribution配信する
※ dev,stg,prodとflavorを分けている事を想定devのアプリはapp store connectに存在しない為、app distribution
を使用
流れ:
- create_keychain
- match
- gym
- firebase_app_distribution
リリース版をTestFlight配信する
※ TestFlightで最終的な動作テストを行い、問題が無い事を確認してから審査へ提出したいので、fastlaneでは審査提出までは含めていない
流れ:
- create_keychain
- match
- gym
- app_store_connect_api_key
- pilot
Workflowの流れ
iOSのデプロイのみ。actionsはmacos-latestで実行する。
- Xcodeのバージョンを指定してインストール
- firebase toolsのインストール:app distributionへの配信で必要となる
- bundlerのインストール:fastlane実行に必要となる
- bundle install:ローカルのGemfileにfastlaneを
gem "fastlane"
を記述しておく事でfastlaneをインストール - flutter build ios:アーカイブ前のiosファイルをビルドする。(後にfastlane内のgymでアーカイブされる)
- 用意したカスタムレーンの実行
- (optional) git tagを打つ
- (optional) 自動でrelease noteを作成する
必要な環境変数
こちらに記述有り
- keychainインストール用に使うユーザー名
- keychainインストール用に使うパスワード
-
FASTLANE_USER
:fastlaneのユーザー名 -
FASTLANE_PASSWORD
:fastlaneのパスワード -
MATCH_PASSWORD
:match初回実行時に設定を求められたパスフレーズ -
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD
:CIからappStoreやtestFlightへアップロードする際に必要となるパスワード -
FASTLANE_SESSION
:fastlane spaceauth
を使って事前に発行。2段階認証などを通す為に必要。 公式 ➡︎ App Store Connect APIを使う場合は不要 APP_STORE_CONNECT_API_KEY_ID
APP_STORE_CONNECT_API_KEY_ISSUER_ID
APP_STORE_CONNECT_API_KEY_CONTENT
※ FASTLANE_SESSION
を使うか、App Store Connect APIを使うかの2つの方法があり、どちらか一方で良いみたい (https://qiita.com/watanave/items/6e1982dfb9631172895d#2ファクタ認証の回避方法)
Github Actionsを使ったversion, build numberの更新
cider: https://pub.dev/packages/cider
- ciderの導入
$ flutter pub global activate cider
- CI/CD用にpubspec.yamlにも追記
dev_dependencies:
cider: ^0.1.1
参考
オマケ:slackへ通知する
fastlane produce
)と証明書、プロビジョニングプロファイルの管理(fastlane match
)
アプリの登録(Fastlaneの初期化
※以下全てiosディレクトリで行う
手順
-
ios/Gemfile
にfastlaneを追加 bundle install
-
fastlane init
→fastlane/Appfile
,fastlane/Fastfile
が生成される -
fastlane match init
→fastlane/Matchfile
が生成される
アプリの登録
リリース版をTestFlight配信する
fastlaneで行う事
- create_keychain
- match
-
gymflutter build ipa
コマンドを実行する為、gymは使わない - app_store_connect_api_key
- pilot
Workflowの流れ
必要な環境変数とその取得方法
※ 変数名は任意で変えて問題ない
FASTLANE_PASSWORD
:
下記変数はApp Store Connect > Users and Access(ユーザーとアクセス) > App Store Connect APIで取得する事が出来る
-
APP_STORE_CONNECT_API_KEY_ISSUER_ID
:上記画面のissuer ID -
APP_STORE_CONNECT_API_KEY_ID
:上記画面のキーID -
APP_STORE_CONNECT_API_KEY_CONTENT
:上記手順に従ってAPI Keyを生成した際に取得出来るp8ファイルの中身。作成時に一度だけ取得可能。-----BEGIN PRIVATE KEY-----
で始まり、-----END PRIVATE KEY-----
で終わる。そこまで含める。
参考
fastlne deliverやpilotでAppStoreConnectにアプリをアップロード出来ないトラブル
Androidの継続デリバリー
必要となるAPIキー
ANDROID_KEY_JKS_BASE64
ANDROID_STORE_PASSWORD
ANDROID_KEY_ALIAS
ANDROID_KEY_PASSWORD
GOOGLE_SERVICE_ACCOUNT_KEY_JSON_BASE64
参考
デプロイのActionsに承認機能を付ける
flutter build ipaについて
参考
fastlane matchの代替:Cloud managed certificates