概要
Flutterでアプリを開発したら、このように開発したアプリをユーザが使えるようにデプロイをします。Flutterの公式ドキュメントにはFlutterで開発したアプリをデプロイする方法について説明をしております。これを参考するとFlutterで開発したアプリをデプロイすることができます。
- アンドロイドデプロイ: https://docs.flutter.dev/deployment/android
- iOSデプロイ: https://docs.flutter.dev/deployment/ios
Fastlane
はネーティブで開発したアプリもハイブリッドアプリ(Flutter, React Nativeなど)も簡単にデプロイできるように手伝ってくれるツールです。
- Fastlane: https://fastlane.tools/
今回のブログポストではFastlane
を使ってFlutterで開発したアプリをデプロイする方法について説明します。
Fastlane
fastlane is the easiest way to automate beta deployments and releases for your iOS and Android apps. It handles all tedious tasks, like generating screenshots, dealing with code signing, and releasing your application.
Fastlane
はiOSとアンドロイドのテスト用のデプロイまたは、リリース用のデプロイを簡単に自動化してくれるツールです。デプロイだけではなく、スクリンショット、コードサイニング、アプリストア登録情報などを生成、管理することができるツールです。
今回のブログポストではスクリンショット、アプリストア登録情報などは登録されたと仮定して、テスト用・リリース用のデプロイを自動化する部分だけを扱う予定です。
スクリンショット、アプリストア登録情報生成など、他の機能も使いたい方は公式サイトを参考してください。
- 公式サイト: Fastlane
Flutterの公式サイトにもCI/CD
のためFastlane
を使う方法について案内してますので、公式ドキュメントも参考してみてください。
Fastlaneのインストール
Fastlane
を使ってFlutterで開発したアプリをデプロイするためにはFastlane
をインストールする必要があります。次のコマンドを使ってFastlane
をインストールしてください。
# Using RubyGems
sudo gem install fastlane -NV
# Alternatively using Homebrew
brew cask install fastlane
公式サイトではHomebrew
を使ってインストールする方法とRubyGems
を使ってインストールする方法を案内してます。
私は最初Homebrewを使ってインストールして、テストしてみましたが、うまく動作してない部分がありました。したがってRubyGemsを使ってインストールすることをお勧めします。もしHomebrewでうまく動作しなかったら、RubyGemsで再びインストールして試してみてください。
iOS
Flutterで開発したiOSアプリをFastlaneを使ってデプロイする方法について説明します。
iOSのためFastlaneの初期化
下記のコマンドを使ってiOSのためFastlaneを初期化します。
cd ios
fastlane init
このコマンドを実行すると下記のような画面が確認できます。
今回のブログポストではTestflight用とアプリストアにデプロイするための設定について見る予定です。したがって2
番または3
番を選択して進めばいいです。
2. Automate beta distribution to TestFlight
3. Automate App Store distribution
ここではTestflight用デプロイをするため2
番を選択して進めました。
2番を選択して進むと上のようにiOSのプロジェクトを選択する画面が確認できます。Flutterで開発したアプリをデプロイする予定なので、2
番を選択して進めます。
2番を選択して進むと、上のようにAppleログインのための画面が確認できます。iOSのアプリデプロイをするため使うApple store connect
のログインIDを入力します。
私は既にFastlaneを使ってログインをしたことがあるので、上のような画面が表示されます。最初Fastlaneを設定する方は2段階認証の手続きが表示されます。
上のような画面以外にも何回Continue by pressing Enter
を入力する画面が表示されます。Enter
キーを押して進めて設定を完了させます。
iOS用Fastlaneフォルダやファイル
iOSの設定を完了するとFlutterのiosフォルダ下に下記のようなフォルダやファイルが生成されることが確認できます。
|- fastlane
| |- Appfile
| |- Fastfile
|- Gemfile
|- Gemfile.lock
各フォルダやファイルを詳しく見てみましょう。
- fastlaneフォルダ: Fastlaneの設定や実行ファイルたちが入ってるフォルダです。
- Gemfile, Gemfile.lock: FastlaneはRubyで開発されてます。このファイルたちはRubyでライブラリを管理するためのファイルたちです。
Fastlaneを実行するため、設定内容が入ってるfastlane/Appfile
ファイルでコメントを消すと下記のようです。
app_identifier("io.github.dev-yakuza.kumoncho")
apple_id("[email protected]")
itc_team_id("119423059")
team_id("WFDJCJXQZ6")
Appfile
ファイルはiOSの自動デプロイのためのFastlane設定ファイルです。簡単なファイルなので、詳しい説明は省略します。
その次は実際アプリをデプロイするための実行ファイルであるfastlane/Fastfile
ファイルでコメントを消すと下記のようです。
default_platform(:ios)
platform :ios do
desc "Push a new beta build to TestFlight"
lane :beta do
increment_build_number(xcodeproj: "kumoncho.xcodeproj")
build_app(workspace: "kumoncho.xcworkspace", scheme: "kumoncho")
upload_to_testflight
end
end
ここで表示されたFastlaneを実行するためには次のコマンドを実行することができます。
# cd ios
fastlane beta
このようにFastlaneを実行するとiOSののbuild numberを上げて(increment_build_number
)、アプリをビルドした後(build_app
)、Testflight用でアップロードします。(upload_to_testflight
)
iOS用実行ファイル修正
基本的に提供されるfastlaneファイルでは完璧にデプロイ自動化をすることができません。したがって、iOS用デプロイを自動化するためfastlane/Fastfile
ファイルを下記のように修正します。
# frozen_string_literal: true
default_platform(:ios)
platform :ios do
def updateVersion(options)
if options[:version]
version = options[:version]
else
version = prompt(text: "Enter the version type or specific version\n(major, minor, patch or 1.0.0): ")
end
re = /\d+.\d+.\d+/
versionNum = version[re, 0]
if versionNum
increment_version_number(
version_number: versionNum
)
elsif version == 'major' || version == 'minor' || version == 'patch'
increment_version_number(
bump_type: version
)
else
UI.user_error!('[ERROR] Wrong version!!!!!!')
end
end
def certificate(options)
if options[:type] == 'github'
create_keychain(
name: 'ios_app_keychain',
password: '****************',
timeout: 1800,
default_keychain: true,
unlock: true,
lock_when_sleeps: false
)
import_certificate(
certificate_path: 'distribution.p12',
certificate_password: '****************',
keychain_name: 'ios_app_keychain',
keychain_password: '****************'
)
end
install_provisioning_profile(path: 'distribution.mobileprovision')
update_project_provisioning(
xcodeproj: 'Runner.xcodeproj',
target_filter: 'github',
profile: 'distribution.mobileprovision',
build_configuration: 'Release'
)
api_key = app_store_connect_api_key(
key_id: '**************',
issuer_id: '***********************',
key_filepath: 'distribution.p8'
)
api_key
end
desc 'Update version'
lane :version do |options|
updateVersion(options)
increment_build_number(xcodeproj: 'Runner.xcodeproj')
end
desc 'Submit review only'
lane :submit_review do |_options|
upload_to_app_store(
submit_for_review: true,
automatic_release: true,
force: true,
skip_metadata: true,
skip_screenshots: true,
skip_binary_upload: true
)
end
desc 'Push a new beta build to TestFlight'
lane :beta do |options|
api_key = certificate(options)
build_app(
workspace: 'Runner.xcworkspace',
scheme: 'Runner',
)
upload_to_testflight(api_key: api_key)
end
desc 'Push a new release build to the App Store'
lane :release do |options|
api_key = certificate(options)
build_app(
workspace: 'Runner.xcworkspace',
scheme: 'Runner',
)
upload_to_app_store(
force: true,
reject_if_possible: true,
skip_metadata: false,
skip_screenshots: true,
languages: ['en-US', 'ja','ko'],
release_notes: {
"default" => "bug fixed",
"en-US" => "bug fixed",
"ja" => "バグ修正",
"ko" => "버그 수정"
},
submit_for_review: true,
precheck_include_in_app_purchases: false,
automatic_release: true,
submission_information: {
add_id_info_uses_idfa: false,
export_compliance_encryption_updated: false,
export_compliance_uses_encryption: false
},
api_key: api_key
)
end
end
ユーザが入力したバージョンに合わせて、バージョンを修正する関数を定義しました。
platform :ios do
def updateVersion(options)
...
end
...
desc 'Update version'
lane :version do |options|
updateVersion(options)
increment_build_number(xcodeproj: 'Runner.xcodeproj')
end
...
end
Fastlaneコマンドを使ってデプロイするアプリのバージョンをアップデートすることができるversion
と言うコマンドを作りました。このコマンドは次のように実行してアプリのバージョンをアップデートすることができます。
# fastlane version version:1.0.0
# fastlane version version:major
# fastlane version version:minor
fastlane version version:patch
もし、パラーメータがを入力してない場合、ユーザの入力を待つようにしました。
def updateVersion(options)
if options[:version]
version = options[:version]
else
version = prompt(text: "Enter the version type or specific version\n(major, minor, patch or 1.0.0): ")
end
...
Fastlaneを使ってデプロイするためには認証書(Certification)とプロビジョニングファイル(Provisioning)、そしてアプリストアコネクションAPIキー(App store connect API key)が必要です。
このファイルたちが用意できたら次のようにcertificate
関数を使ってファイルを登録して、API
キーを返すようにして必要なところで使えるように作りました。
# frozen_string_literal: true
default_platform(:ios)
platform :ios do
...
def certificate(options)
if options[:type] == 'github'
create_keychain(
name: 'ios_app_keychain',
password: '****************',
timeout: 1800,
default_keychain: true,
unlock: true,
lock_when_sleeps: false
)
import_certificate(
certificate_path: 'distribution.p12',
certificate_password: '****************',
keychain_name: 'ios_app_keychain',
keychain_password: '****************'
)
end
install_provisioning_profile(path: 'distribution.mobileprovision')
update_project_provisioning(
xcodeproj: 'Runner.xcodeproj',
target_filter: 'github',
profile: 'distribution.mobileprovision',
build_configuration: 'Release'
)
api_key = app_store_connect_api_key(
key_id: '**************',
issuer_id: '***********************',
key_filepath: 'distribution.p8'
)
api_key
end
...
end
このように作ったAPI
キーは次のようにTestflightやアプリストアへデプロイする時活用されます。
# frozen_string_literal: true
default_platform(:ios)
platform :ios do
...
desc 'Push a new beta build to TestFlight'
lane :beta do |options|
api_key = certificate(options)
build_app(
workspace: 'Runner.xcworkspace',
scheme: 'Runner',
)
upload_to_testflight(api_key: api_key)
end
desc 'Push a new release build to the App Store'
lane :release do |options|
api_key = certificate(options)
build_app(
workspace: 'Runner.xcworkspace',
scheme: 'Runner',
)
upload_to_app_store(
force: true,
reject_if_possible: true,
skip_metadata: false,
skip_screenshots: true,
languages: ['en-US', 'ja','ko'],
release_notes: {
"default" => "bug fixed",
"en-US" => "bug fixed",
"ja" => "バグ修正",
"ko" => "버그 수정"
},
submit_for_review: true,
precheck_include_in_app_purchases: false,
automatic_release: true,
submission_information: {
add_id_info_uses_idfa: false,
export_compliance_encryption_updated: false,
export_compliance_uses_encryption: false
},
api_key: api_key
)
end
end
Testflight用のデプロイスクリプトを見ると、認証書を登録した後、アプリをビルどして、Fastlaneが提供するupload_to_testflight
関数を使ってデプロイすることが確認できます。
...
platform :ios do
...
desc 'Push a new beta build to TestFlight'
lane :beta do |options|
api_key = certificate(options)
build_app(
workspace: 'Runner.xcworkspace',
scheme: 'Runner',
)
upload_to_testflight(api_key: api_key)
end
...
end
アプリストア用でデプロイするコードもTestflight用と同じように認証書を登録した後、アプリをビルドします。その後、upload_to_app_store
関数を使ってアプリをデプロイするようにしました。
...
platform :ios do
...
desc 'Push a new release build to the App Store'
lane :release do |options|
api_key = certificate(options)
build_app(
workspace: 'Runner.xcworkspace',
scheme: 'Runner',
)
upload_to_app_store(
force: true,
reject_if_possible: true,
skip_metadata: false,
skip_screenshots: true,
languages: ['en-US', 'ja','ko'],
release_notes: {
"default" => "bug fixed",
"en-US" => "bug fixed",
"ja" => "バグ修正",
"ko" => "버그 수정"
},
submit_for_review: true,
precheck_include_in_app_purchases: false,
automatic_release: true,
submission_information: {
add_id_info_uses_idfa: false,
export_compliance_encryption_updated: false,
export_compliance_uses_encryption: false
},
api_key: api_key
)
end
end
upload_to_app_store
関数で使ったオプションは次のようです。
- force: Fastlaneが生成するHTML reportを生成されないようにします。
- reject_if_possible: 審査待機中バージョンがある場合、キャンセルします。
- skip_metadata: アプリストアの情報を登録するか決めます。自動デプロイする時、バージョンの修正内容を作成する必要があるので、情報を登録するように設定します。
- skip_screenshots: 私は既にデプロイしたアプリについてデプロイ自動化をしています。なので、スクリンショットを再びアップロードする必要はないです。
- languages: 現在ストアで登録されたアプリのローカライズを設定します。使える言語は
ar-SA, ca, cs, da, de-DE, el, en-AU, en-CA, en-GB, en-US, es-ES, es-MX, fi, fr-CA, fr-FR, he, hi, hr, hu, id, it, ja, ko, ms, nl-NL, no, pl, pt-BR, pt-PT, ro, ru, sk, sv, th, tr, uk, vi, zh-Hans, zh-Hant
で、詳しい内容は公式サイトを参考してください。(公式サイト) - release_notes: iOSはアプリを再びデプロイする時、Release notesを必ず作成する必要があります。私が使ってるスクリプトは3カ国語をサポートするアプリなので、defaultと3カ国語のRelease notesを作成するようにしました。
- submit_for_review: アプリ審査に提出するようにします。
- automatic_release: 審査後、アプリを自動デプロイするように設定します。この値が設定されないと、アプリ審査が通った後、開発者が手動でデプロイする必要があります。
- submission_information: デプロイ前、暗号化、広告があるかどうかなどを尋ねるオプションを設定します。
これ以外にもたくさんのオプションがあります。詳しい内容は公式サイトを参考してください。
iOS用Fastlaneを実行してTestflightへデプロイ
iOS用のFastlaneを使って自動でデプロイする準備が終わりました。次はFastlaneを使ってアプリを自動でデプロイしてみましょう。
下記のコマンドを使ってFlutterで作成したアプリをTestflightへデプロイします。
# cd ios
fastlane beta version:patch
デプロイが終わるまで、かなり時間がかかります。デプロイが終わったら下記のような画面が確認できます。
もちろんApp store connectのTestflightでも上手くデプロイされたことが確認できます。
iOS用Fastlaneを実行してアプリストアへデプロイ
次は下記のFastlaneコマンドを使ってFlutterで開発したアプリをアプリストアへデプロイしてみましょう。
# cd ios
fastlane release version:patch
デプロイが終わったら下記のような画面が確認できます。
またApp store connectにも上手くデプロイされたことが確認できます。
アンドロイド
次はFlutterで開発したアンドロイドアプリをFastlaneを使ってデプロイを自動化してみます。
API accessのためService Account生成
Fastlaneを使ってアンドロイドをデプロイする時、グーグルのAPIを使うのでGoogle Developer Service Account
を生成する必要があります。
Google Developer Service Accountを生成するため、下記のリンクを使ってグーグルプレイコンソール(Google Play Console)へ移動します。
- グーグルプレイコンソール: https://play.google.com/apps/publish/
グーグルプレイコンソールへ移動すると下記のような画面が確認できます。
左メニューのSettings
を選択します。そしてDeveloper account
下にあるAPI access
メニューを選択します。
上のような画面が見えたら、CREATE NEW PROJECT
ボタンを押して、新しいプロジェクトを生成します。
新しいプロジェクトが生成されたら、上のような画面が確認できます。下にあるCREATE SERVICE ACCOUNT
ボタンを選択すると、下記のような画面が確認できます。
上のような画面でGoogle API Console
リンクを選択します。選択したら、下記のような画面が確認できます。
上にあるCREATE SERVICE ACCOUNT
ボタンを選択します。選択したら下記のように新しいService accountを生成する画面が確認できます。
上のような画面で、Service account name
に名前を入力して、CREATE
ボタンを押してService accountを生成します。(私はService account nameにgoogle-play-fastlane-deploymentを入力しました。)
上のような画面が見えたら、Role
を選択してService Account User
を検索して選択します。RoleでService Account Userを設定したら、下にあるCONTINUE
ボタンを押して次に進みます。
上のような画面が見えたら、下にあるCREATE KEY
を選択してJSON
が選択された状態でCREATE
ボタンを押してキーを生成します。
CREATEボタンを押してキーを生成したらJSON形でファイルが自動でダウンロードされます。このファイルをFlutterプロジェクトのandroid
フォルダの中にコピーします。最後にDONE
ボタンを押してService Accountを生成します。
そして元の画面に戻って右下にあるDONE
ボタンを押してService Account生成を終了します。
そしたら以前と違って下記のような画面が確認できます。
次は権限を与えるため、右下のGRANT ACCESS
ボタンを選択します。
上のような画面が出たら下にスクロールしてADD USER
を選択してユーザを登録します。
アンドロイドのためFastlaneの初期化
次はアンドロイド用のFastlaneを生成しててみましょう。下記のコマンドを実行してアンドロイド用のFastlaneを生成します。
cd android
fastlane init
上のコマンドを実行したら下記のような画面が確認できます。
アンドロイドプロジェクトのPackage Name
を入力します。(ex> io.github.dev.yakuza.kumoncho)そしたら、次のようにJSONファイルのパスを入力する画面が確認できます。
Service Accountを生成した時、ダウンロードしたJSONファイルをandroid
フォルダへコピーしました。ここではこのパスを指定します。(ex> app-xxx.json
)
次はアンドロイドをデプロイする時、登録したストア情報(metadata)をダウンロードするかどうかを聞いてくれます。私は既にデプロイしたアプリを自動化してるので、ストアの情報を更新する必要がないです。したがって、n
を入力してストア情報をダウンロードしないようにしました。
上のような画面以外にも何回もContinue by pressing Enter
を入力する画面が表示されます。Enterキーを押して進めて設定を完了します。
アンドロイド用Fastlaneのフォルダやファイル
アンドロイドの設定を完了したらFlutterのandroidフォルダ下に下記のようなフォルダやファイルが生成されることが確認できます。
|- fastlane
| |- Appfile
| |- Fastfile
|- Gemfile
|- Gemfile.lock
各フォルダやファイルを詳しく見てみましょう。
- fastlaneフォルダ: Fastlaneの設定や実行ファイルが入ってるフォルダです。
- Gemfile, Gemfile.lock: FastlaneはRubyで開発されてます。このファイルたちはRubyでライブラリを管理するためのファイルたちです。
Fastlaneを実行するため設定内容が入ってるfastlane/Appfile
ファイルでコメントを消して確認すると下記のようです。
json_key_file("api-xxx.json")
package_name("io.github.dev.yakuza.kumoncho")
私たちが設定したPacakge NameとJSONファイルのパスが設定されたことが確認できます。次は、実際アプリをデプロイするための実行ファイルであるfastlane/Fastfile
ファイルでコメントを消すと下記のようです。
default_platform(:android)
platform :android do
desc "Runs all the tests"
lane :test do
gradle(task: "test")
end
desc "Submit a new Beta"
lane :beta do
gradle(task: "clean assembleRelease")
crashlytics
end
desc "Deploy a new version to the Google Play"
lane :deploy do
gradle(task: "clean assembleRelease")
upload_to_play_store
end
end
iOSとは違ってbeta
とdeploy
、二つのlaneが生成されたことが確認できます。このFastlaneも下記のようなコマンドで実行できます。
# cd android
fastlane beta
fastlane deploy
しかし、完璧な自動化のためにはFastfileを修正する必要があります。
アンドロイド用実行ファイル修正
基本的提供されるfastlaneファイルでは完璧に自動化をすることができないです。したがって、アンドロイド用デプロイを自動化するためfastlane/Fastfile
ファイルを下記のように修正します。
# frozen_string_literal: true
default_platform(:android)
platform :android do
def increment_version_code
path = '../app/build.gradle'
re = /versionCode\s+(\d+)/
s = File.read(path)
versionCode = s[re, 1].to_i
s[re, 1] = (versionCode + 1).to_s
f = File.new(path, 'w')
f.write(s)
f.close
end
def increment_version_number(bump_type: nil, version_number: nil)
path = '../app/build.gradle'
re = /versionName\s+("\d+.\d+.\d+")/
s = File.read(path)
versionName = s[re, 1].gsub!('"', '').split('.')
major = versionName[0].to_i
minor = versionName[1].to_i
patch = versionName[2].to_i
if bump_type == 'major'
major += 1
minor = 0
patch = 0
elsif bump_type == 'minor'
minor += 1
patch = 0
elsif bump_type == 'patch'
patch += 1
end
s[re, 1] = if version_number
"\"#{version_number}\""
else
"\"#{major}.#{minor}.#{patch}\""
end
f = File.new(path, 'w')
f.write(s)
f.close
increment_version_code
end
def updateVersion(options)
version = options[:version] || prompt(text: "Enter the version type or specific version\n(major, minor, patch or 1.0.0): ")
re = /\d+.\d+.\d+/
versionNum = version[re, 0]
if versionNum
increment_version_number(
version_number: versionNum
)
elsif %w[major minor patch].include?(version)
increment_version_number(
bump_type: version
)
else
UI.user_error!('[ERROR] Wrong version!!!!!!')
end
end
desc 'Update version'
lane :version do |options|
updateVersion(options)
end
desc 'Submit a new Beta'
lane :beta do |_options|
gradle(task: 'clean bundleRelease')
upload_to_play_store(
skip_upload_metadata: true,
skip_upload_screenshots: true,
skip_upload_images: true,
skip_upload_apk: true,
track: 'internal',
aab: '../build/app/outputs/bundle/release/app-release.aab'
)
end
desc 'Deploy a new version to the Google Play'
lane :release do |_options|
gradle(task: 'clean bundleRelease')
upload_to_play_store(
skip_upload_metadata: true,
skip_upload_screenshots: true,
skip_upload_images: true,
skip_upload_apk: true,
aab: '../build/app/outputs/bundle/release/app-release.aab'
)
end
end
追加した内容を詳しく見てみましょう。アンドロイドはiOSとは違ってアプリのバージョンをアップデートする機能を提供してないです。(私が見つけてないかもしれないです。もし、してる方はフィードバックお願いします。)したがって、アンドロイドのversionCodeとversionNameをアップデートする機能を実装しました。
platform :android do
def increment_version_code
...
end
def increment_version_number(bump_type: nil, version_number: nil)
...
end
def updateVersion(options)
...
end
...
end
バージョンをアップデートするupdateVersion
関数はiOS
で説明したので、詳しい説明は省略します。
ンドロイドのテスト用Fastlane
テスト用でアプリをデプロイするためのFastlaneを見てみましょう。
platform :android do
...
desc 'Submit a new Beta'
lane :beta do |_options|
gradle(task: 'clean bundleRelease')
upload_to_play_store(
skip_upload_metadata: true,
skip_upload_screenshots: true,
skip_upload_images: true,
skip_upload_apk: true,
track: 'internal',
aab: '../build/app/outputs/bundle/release/app-release.aab'
)
end
...
end
アンドロイドはGradleのclean
とbundleRelease
でアプリをビルドするようにしました。(assembleRelease
ではない)また、upload_to_play_store
の関数でtrack: 'internal'
を使ってinternal test用でデプロイするようにしました。
アンドロイドはiOSと違ってRelease notes(change log)を作成する必要がないので、スタアに関数流全ての機能はskipするように設定しました。
最後にbundleRelease
を使ってaabファイルを生成してアップロードする予定なので、skip_upload_apk
をtrue
で設定しました。
アンドロイドのグーグルプレイストア用Fastlane
次はグーグルストアへデプロイするためのFastlaneコードを見てみましょう。
...
platform :android do
...
desc 'Deploy a new version to the Google Play'
lane :release do |_options|
gradle(task: 'clean bundleRelease')
upload_to_play_store(
skip_upload_metadata: true,
skip_upload_screenshots: true,
skip_upload_images: true,
skip_upload_apk: true,
aab: '../build/app/outputs/bundle/release/app-release.aab'
)
end
end
iOSと同じようにするためlane :deploy
をlane :release
に名前を変更しました。upload_to_play_store
関数のtrack
パラメータがないこと以外にはbeta用と同じなので詳しい説明は省略します。
アンドロイド用Fastlaneの実行
Fastlaneを使ってアンドロイドで自動でデプロイする準備が終わりました。次はFastlaneを使ってアプリを自動デプロイしてみましょう。
下記のコマンドを使ってFlutterで作成したアプリをinternal testへデプロイしてみます。
# cd android
fastlane beta version:patch
デプロイが完了されるまで、少し時間が掛かります。デプロイが完了されると下記のような画面が確認できます。
もちろんPlay store consoleでもinternal testへ上手くデプロイされたことが確認できます。
そして次のコマンドを実行して実際デプロイをしてみます。
# cd android
fastlane release version:patch
デプロイが完了されたら下記のような画面が確認できます。
また、Google Play storeでも上手くデプロイされたことが確認できます。
gitignore
Fastlaneを使ってデプロイをすると、それによるファイルたちが生成されます。このファイル中でGitで管理する必要がないファイルたちを.gitignore
ファイルを開いて下記のように追加します。
...
# fastlane
ios/*.mobileprovision
ios/*.cer
ios/*.dSYM.zip
android/fastlane/README.md
ios/fastlane/README.md
完了
これでFastlaneを使ってFlutterで作成したアプリを自動でデプロイする方法について見てみました。今回のブログポストで説明した内容はもちろんNativeで開発したアプリでも活用できるので多くの方にお役に立つと思います。
私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!
アプリ広報
Deku
が開発したアプリを使ってみてください。Deku
が開発したアプリはFlutterで開発されています。興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。