開発以外のメンバーに実機テストをしてもらう場合にTestFlightだけで配信してたけど、流石に面倒なのと、ステージング環境用にビルドしたアプリを本番用とは別アプリとして配信したいので、App Distributionで配信することにした。
ひとまずローカル環境でfastlaneを使ってApp Distributionに配信できるようにしたので、備忘録。
#1.環境を分けてビルド
基本的には@mono0926さんの記事で大体できるはず。とても丁寧に書かれていて、ありがとうございます。
Flutterで環境ごとにビルド設定を切り替える — iOS編
1個注意点として、ステージング用に別アプリにする場合、Identifiersをそれ用に用意しないといけない。
例えば、com.test.app
が本番用だとして、com.test.app.stg
みたいなIdentifiersをAppleDeveloperで作成しておく必要がある。普段iOS開発してると当たり前かもだけど、そうじゃないと忘れがち。
#2.fastlaneのインストール
fastlane周りの設定を行う。
$ sudo gem install fastlane -NV
gemでインストールしようとしたところ、Failed to build gem native extension.
のエラーが出てインストールできなかった。色々調べて、行ったことは以下。
$ xcode-select --install
- AppleDevelopersからCommand Line Toolsをダウンロード(バージョンはmacOS_10.14_for_Xcode_10.3)してインストール
$ open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
- rbenvでRubyのバージョンを更新(2.3.0 -> 2.6.5)
こんな感じでなんとかfastlaneのインストールと実行ができるようになった。
#3.Fastfileを作る
Flutterの公式ドキュメントを参考にしつつ、fastlaneの設定をする。
$ flutter build ios --release --flavor staging --target lib/main_staging.dart
$ cd ios
$ fastlane init
fastlane/Fastfile
とfastlane/Appfile
ができるので、Appfileのapp_identifier
やteam_id
、apple_id
を確認する。
TestFlightにアップしたい場合はFASTLANE_PASSWORD
の環境変数にiTunesConnectのパスワードを設定しておく。
iOS側のFastfileはこんな感じ。今回はステージング環境用のビルドなのでschemeはStagingを指定している。
fastlane_version "2.28.3"
default_platform :ios
platform :ios do
desc "Submit a new Staging Build to Firebase AppDistribution"
lane :staging do
gym(
scheme: "Staging",
export_options: {
method: "ad-hoc"
}
)
end
end
これで下記のコマンドでipaファイルを出力できるようになる。
$ fastlane staging
##4.Firebase App Distributionにアップする
ipaは作れるようになったので、次はApp Distributionにアップできるようにしていく。
まずはプラグインの追加。Gemfileを作るか聞かれるので、yと答えておく。
$ fastlane add_plugin firebase_app_distribution
[✔] 🚀
[17:42:46]: Get started using a Gemfile for fastlane https://docs.fastlane.tools/getting-started/ios/setup/#use-a-gemfile
[17:42:47]: Plugin 'fastlane-plugin-firebase_app_distribution' was added to './fastlane/Pluginfile'
[17:42:47]: It looks like fastlane plugins are not yet set up for this project.
[17:42:47]: fastlane will create a new Gemfile at path 'Gemfile'
[17:42:47]: This change is necessary for fastlane plugins to work
[17:42:47]: Should fastlane modify the Gemfile at path 'Gemfile' for you? (y/n)
y
[17:43:00]: Successfully modified 'Gemfile'
[17:43:00]: Make sure to commit your Gemfile, Gemfile.lock and Pluginfile to version control
Installing plugin dependencies...
Successfully installed plugins
これで、Gemfile
とGemfile.lock
、fastlane/Pluginfile
が作成される。あとはFastfileにfirebase_app_distributionのアクションを追加する。
fastlane_version "2.28.3"
default_platform :ios
platform :ios do
desc "Submit a new Staging Build to Firebase App Distribution"
lane :staging do
gym(
scheme: "Staging",
export_options: {
method: "ad-hoc"
}
)
+ firebase_app_distribution(
+ app: "(Firebase上のアプリ ID)",
+ groups: "dev",
+ release_notes: "from fastlane",
+ firebase_cli_path: `which firebase`.strip()
+ )
end
end
app
にはFirebaseのアプリIDを指定する。Settingsから確認することができる。
groups
はApp Distributionでのテスターのグループを指定する。
あとは、firebase_app_distributionの実行にfirebase-toolsのバージョン7.4.0以上が必要なので、インストールする。今回はローカルからのアップなので、Firebaseへのログインもしておく。
$ npm install -g firebase-tools
$ firebase login
firebase login
するとブラウザでログイン画面が開かれるので、アカウントを選んでログインする。ちなみにCI等で実行する場合はfirebase login:ci
で取得したトークンをFIREBASE_TOKEN
の環境変数に設定すると良いらしい。
以上で準備は整ったので、fastlaneを実行する。Gemfileを作ったので、bundle exec
から起動する。
$ bundle exec fastlane staging
##おわり
以上でApp Distributionでアプリが配信されるようになる。
今回はローカルでやったので、署名周りをflutter側で行ったけど、この辺りもfastlaneに任せてGithub ActionsでCDできるようにしたいところ。
##参考記事
- https://medium.com/flutter-jp/flavor-b952f2d05b5d
- https://qiita.com/skycat_me/items/0a0f5e3982fbfca14444
- https://qiita.com/fuwamaki/items/a9745e1242e24430eb4c#fastlane%E3%82%92%E7%94%A8%E3%81%84%E3%81%9Ffirebase-app-distribution%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E6%96%B9%E6%B3%95
- https://note.com/watura/n/nf49c04e54d09
- https://kouki.hatenadiary.com/entry/2019/10/02/094358