【Flutter】FastlaneとFirebase App Distributionでテストアプリ配布を自動化する

image

はじめに

とあるプロジェクトに参画した時に、テストアプリ配布を全て手動で行なっており、テストフェーズに入った時に、非効率すぎてめちゃめちゃストレスになりました...
自動化したいなと思い、とりあえず無料で手っ取り早くできるものを模索した結果、fastlane と firebase app distribution を使用してテストアプリを配布を効率化することにしました。

事前準備

  • テストアプリ配布用(AdHock)の証明書
  • Firebase プロジェクトに app distribution を追加
  • Firebase のアプリ ID と CLI TOKEN の発行

fastlane インストール

fastlane を homebrew でインストール

https://formulae.brew.sh/formula/fastlane

brew install fastlane

iOS のセットアップ

ios ディレクトリで下記を実行

cd ios

/// fastlaneを初期化
/// fastlaneディレクトリが生成される
fastlane init

/// distriutionのプラグインを追加
fastlane add_plugin firebase_app_distribution

.env ファイルに必要な情報を設定

### iOSテストアプリ配布用設定
FIREBASE_APP_ID="" // Firebaseで登録されるアプリID
FIREBASE_CLI_TOKEN="" // FirebaseのCLI TOKEN
APP_IDENTIFIER="" // iosアプリのバンドルID
APPLE_ID="" // xcodeに設定のapple id
PROVISIONING="" // Provisioning Profile名
TEAM_ID="" // Signing Certificate チームID
GROUPS="" // distributionに登録のグループ名

Appfile に下記を追加

require 'dotenv'
Dotenv.load

app_identifier(ENV['APP_IDENTIFIER'])
apple_id(ENV['APPLE_ID'])
team_id(ENV['TEAM_ID'])

FastFile に下記を追加

基本的には.env ファイルの情報を入力しておけばコピペで実行できます

require 'dotenv'
Dotenv.load

default_platform(:ios)

platform :ios do
  desc "iosテストアプリ配布"
  lane :deploy do

    project_name = "Runner.xcodeproj"
    workspace_name = "Runner.xcworkspace"
    scheme_name = "Runner"
    output_directory = "build"
    ipa_path = "#{output_directory}/#{scheme_name}.ipa"
    release_notes_file = ENV['PWD'] + "/fastlane/release_note.txt"

    # flutter build
    Dir.chdir "../.." do
      sh("flutter", "clean")
      sh("flutter", "pub", "get")
      sh("flutter", "build", "ios", "--release", "--no-codesign")
    end

    # xcode archive
    build_app(
      workspace: workspace_name,
      export_options: {
        method: "ad-hoc",
        provisioningProfiles: {
          ENV['APP_IDENTIFIER'] => ENV['PROVISIONING']
        },
        signingStyle: "manual"
      },
      clean: true,
      export_xcargs: "-allowProvisioningUpdates",
      output_name: "#{scheme_name}.ipa",
      output_directory: "#{output_directory}"
    )

    # deploy
    firebase_app_distribution(
      app: ENV['FIREBASE_APP_ID'],
      firebase_cli_token: ENV['FIREBASE_CLI_TOKEN'],
      ipa_path: ipa_path,
      groups: ENV['GROUPS'],
      release_notes_file: release_notes_file,
    )
  end
end

android のセットアップ

android ディレクトリで下記を実行

cd android

/// fastlaneを初期化
/// fastlaneディレクトリが生成される
fastlane init

/// distriutionのプラグインを追加
fastlane add_plugin firebase_app_distribution

.env ファイルに必要な情報を設定

### androidテストアプリ配布用設定
FIREBASE_APP_ID=""
FIREBASE_CLI_TOKEN=""
PACKAGE_NAME="" // androidのapplicationId
GROUPS=''

Appfileに下記を追加

require 'dotenv'
Dotenv.load

json_key_file("")
package_name(ENV['PACKAGE_NAME'])

FastFile に下記を追加

基本的には.env ファイルの情報を入力しておけばコピペで実行できる

default_platform(:android)
platform :android do

desc "androidテストアプリ配布"
lane :deploy do

  apk_path = "../build/app/outputs/apk/release/app-release.apk"
  release_notes_file = ENV['PWD'] + "/fastlane/release_note.txt"
  
  # flutter build
  Dir.chdir "../.." do
    sh("flutter", "clean")
    sh("flutter", "pub", "get")
    sh("flutter", "build", "apk", "--release")
  end

  # deploy
  firebase_app_distribution(
          app: ENV['FIREBASE_APP_ID'], 
          firebase_cli_token: ENV['FIREBASE_CLI_TOKEN'], 
          android_artifact_type: "APK",
          android_artifact_path: apk_path,
          groups: ENV['GROUPS'],
          release_notes_file: release_notes_file,
      )
  end
end

release_note.txt を作成

リリースノートの作成も fastlane から可能です。 txt ファイルで作成する必要があります。

- XXXの実装を行いました。
- XXXの修正を行いました。

実行する

iOS

cd ios
fastlane ios deploy

android

cd android
fastlane android deploy

最後に

コマンドからテストアプリの自動化をしてみたい方はぜひやって見てください!
また、build numberを自動でインクリメントしたりなど、色々カスタマイズができるので、好みの形に実装するのがいいかと思います。

ソースコード全体はこちら↓ https://github.com/NoriakiSakata/fastlane_deploy_to_app_distribution/tree/master

お知らせ

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。

Read More
U30可茂ITインターンハッカソン

U30可茂ITインターンハッカソン

12月28,29日開催。2日間でアプリ開発の企画から完成までを目指す!U30可茂ITインターンハッカソンを開催します。

Read More

タグ

Flutter (112)初心者向け (28)イベント (18)Google Apps Script (15)Nextjs (12)可茂IT塾 (9)Firebase (7)riverpod (6)React (6)ChatGPT (5)vscode (5)デザイン (5)新卒 (4)就活 (4)Figma (4)Dart (4)JavaScript (4)お知らせ (4)FlutterWeb (3)Prisma (3)NestJS (3)Slack (3)TypeScript (3)ワーケーション (3)インターン (3)設計 (2)線型計画法 (2)事例 (2)Git (2)Image (2)File (2)Material Design (2)画像 (2)iOS (2)アプリ開発 (2)React Hooks (2)tailwindcss (2)社会人 (2)大学生 (2)RSS (1)Google (1)Web (1)CodeRunner (1)個人開発 (1)Android (1)Unity (1)WebView (1)Twitter (1)フルリモート (1)TextScaler (1)textScaleFactor (1)学生向け (1)supabase (1)Java (1)Spring Boot (1)shell script (1)正規表現 (1)パワーポイント (1)趣味 (1)モンスターボール (1)CSS (1)SCSS (1)Cupertino (1)ListView (1)就活浪人 (1)既卒 (1)保守性 (1)iPad (1)シェアハウス (1)スクレイピング (1)PageView (1)画面遷移 (1)flutter_hooks (1)Gmail (1)GoogleWorkspace (1)ShaderMask (1)google map (1)Google Places API (1)GCPコンソール (1)Google_ML_Kit (1)Vercel (1)Google Domains (1)DeepLeaning (1)深層学習 (1)Google Colab (1)コード生成 (1)GitHub Copilot (1)オンラインオフィス (1)オブジェクト指向 (1)クラスの継承 (1)ポリモーフィズム (1)LINE (1)Bitcoin (1)bitFlyer (1)コミュニティー (1)文系エンジニア (1)Freezed (1)ヒーター (1)作業効率 (1) (1)permission_handler (1)flutter_local_notifications (1)markdown (1)GlobalKey (1)ValueKey (1)Key (1)アイコン (1)go_router (1)debug (1)datetime_picker (1)Apple Store Connect (1)FlutterGen (1)デバッグ (1)Widget Inspector (1)VRChat (1)API (1)検索機能 (1)Shader (1)Navigator (1)メール送信 (1)FlutterFlow (1)Firebase App Distribution (1)Fastlane (1)Dio (1)CustomClipper (1)ClipPath (1)カスタム認証 (1)アニメーション (1)Arduino (1)ESP32 (1)経験談 (1)フリーランス (1)mac (1)csv (1)docker (1)GithubActions (1)Dialog (1)BI (1)LifeHack (1)ショートカット (1)Chrome (1)高校生 (1)キャリア教育 (1)非同期処理 (1)生体認証 (1)BackdropFilter (1)レビュー (1)getAuth (1)Algolia (1)コンサルティング (1)Symbol (1)

お知らせ

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。

Read More
U30可茂ITインターンハッカソン

U30可茂ITインターンハッカソン

12月28,29日開催。2日間でアプリ開発の企画から完成までを目指す!U30可茂ITインターンハッカソンを開催します。

Read More