【Flutter】ビルド,リリース,テスターへデプロイ(Flutter,VSCode, Build, Release,Deploy,Tester)

flutter

1. 概要

前回に続き、リリースビルドしてテスターに配布する所までやってみます。

  • keystore
  • android/key.properties
  • android/app/build.gradle
  • flutter build apk
  • firebase console
    • 「package_name」と「applicationId」を合わせる
      • jp.co.isub.puzzle_app
        • android/app/google-services.json
          • client – client_info – android_client_info – package_name
        • android/app/build.gradle
          • android – defaultConfig – applicationId
    • tester group
  • android/build.gradle
  • github actions
    • Settings – Secrets – Actions
    • workflows

対象としては開発を1年程やってて自分でFlutterのWidgetテストをやってみたい方になります。そのため細かい用語などの説明はしません。

2. キーストアの生成

Build and release an Android app | Flutter

2-1. アプリ名

  • Androidアプリとしてビルドするため、アプリ署名用のキーストアを生成
  • keytool
    • The keytool command might not be in your path—it’s part of Java, which is installed as part of Android Studio.
keytool -genkey -v -keystore C:\dev\keys\keystore.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias upload
  • 適切に答えてkeystore.jksを生成

3. アプリの署名

3-1. 生成した鍵を使ってアプリを署名するため、Androidアプリ用の設定を追加

  • 生成したキーストアの情報を記載したファイルをandroid/key.propertiesとして作成
storePassword=<password from previous step>
keyPassword=<password from previous step>
keyAlias=upload
storeFile=C:/dev/keys/keystore.jks
  • このkey.propertiesの内容をもとに、アプリを署名する設定を追加
    • android/app/build.gradleを編集
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
   signingConfigs {
       release {
           keyAlias keystoreProperties['keyAlias']
           keyPassword keystoreProperties['keyPassword']
           storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
           storePassword keystoreProperties['storePassword']
       }
   }
   buildTypes {
       release {
           signingConfig signingConfigs.release
       }
   }

4. APKファイルとしてAndroidアプリをビルド

4-1. ビルド

flutter build apk
PS C:\dev\workspace\flutter\puzzle_app> flutter build apk

 Building with sound null safety

Running Gradle task 'assembleRelease'...                           20.8s       
√  Built build\app\outputs\flutter-apk\app-release.apk (16.5MB).
PS C:\dev\workspace\flutter\puzzle_app>
  • ビルド前後

5. AndroidアプリへのFirebaseの追加

5-1. AndroidアプリへのFirebaseの追加

  • Android君をクリック
    • Androidパッケージ名
      • jp.co.isub.puzzle_app
        • 「applicationId」にもこのパッケージ名を設定
          • android/app/build.gradle
            • android – defaultConfig – applicationId
  • 「google-services.json」をダウンロード
  • 「android/app」に配置
プロジェクト レベルの build.gradle(<project>/build.gradle):
####################
buildscript {
  repositories {
    // Check that you have the following line (if not, add it):
    google()  // Google's Maven repository

  }
  dependencies {
    ...
    // Add this line
    classpath 'com.google.gms:google-services:4.3.10'

  }
}

allprojects {
  ...
  repositories {
    // Check that you have the following line (if not, add it):
    google()  // Google's Maven repository

    ...
  }
}

apply plugin: 'com.android.application'

// Add this line
apply plugin: 'com.google.gms.google-services'


dependencies {
  // Import the Firebase BoM
  implementation platform('com.google.firebase:firebase-bom:30.0.0')


  // Add the dependency for the Firebase SDK for Google Analytics
  // When using the BoM, don't specify versions in Firebase dependencies
  implementation 'com.google.firebase:firebase-analytics'


  // Add the dependencies for any other desired Firebase products
  // https://firebase.google.com/docs/android/setup#available-libraries
}
  • 完了

6. テスターグループを作成

6-1. GitHub Actions上でアプリを配信するテスターを指定するため、App Distributionの設定画面からグループを作成

  • グループ名
    • puzzle-app-group

7. GitHub Actions

7-1. テスト→ビルド→デプロイの流れを自動化し、テスターに実装したアプリを配布

  • 自動化ツール
    • GitHub Actionsを使う
  • テスターに対してアプリを配布するツール
    • Firebase App Distributionを使う

7-2. GitHubへプッシュ

  • GitHubのSecretsを設定
KEYSTOREbase64 C:/dev/keys/keystore.jks
STORE_PASSWORD適切に設定
KEY_PASSWORD適切に設定
FIREBASE_TOKENFirebase CLIをインストール後、firebase login:ci

  • KEYSTORE
    • ファイルをそのまま設定できないため、base64を使用
    • base64はGit Bashに同梱されている
    • 下記を参考
      • https://isub.co.jp/etc/front-dev-vscode-wsl-github/#git-install

  • Settings – Secrets – Actions

8. Workflowsを作成

8-1. GitHubの管理画面からworkflowを作成

  • set up a workflow yourself ->

# This is a basic workflow to help you get started with Actions

name: Flutter CI/CD

# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the main branch
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: subosito/flutter-action@v2
        with: 
          channel: 'stable'
      - run: flutter test
# This workflow contains a single job called "build"
  build:
    needs: test
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v3
      - uses: subosito/flutter-action@v2
        with:
          channel: 'stable'
      - uses: actions/setup-java@v1
        with:
          java-version: '11.x'
      - run: |
          KEYSTORE_PATH=$RUNNER_TEMP/keystore.jks
          echo -n $KEYSTORE | base64 --decode > $KEYSTORE_PATH
          
          KEY_PROPERTIES_PATH=android/key.properties
          echo "storePassword=$STORE_PASSWORD" >> $KEY_PROPERTIES_PATH
          echo "keyPassword=$KEY_PASSWORD"     >> $KEY_PROPERTIES_PATH
          echo "keyAlias=upload"               >> $KEY_PROPERTIES_PATH
          echo "storeFile=$KEYSTORE_PATH"      >> $KEY_PROPERTIES_PATH
        env:
          KEYSTORE: ${{ secrets.KEYSTORE }}
          STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }}
          KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
      - run: flutter build apk
      - uses: actions/upload-artifact@v3
        with:
          name: apk
          path: build/app/outputs/flutter-apk/app-release.apk

      # Runs a single command using the runners shell
      - name: Run a one-line script
        run: echo Hello, world!

      # Runs a set of commands using the runners shell
      - name: Run a multi-line script
        run: |
          echo Add other actions to build,
          echo test, and deploy your project.

      # Check test and build automatically
      - name: Check test and build automatically
        run: echo Automation!
  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/download-artifact@v2
        with:
          name: apk
      - run: curl -sL https://firebase.tools | bash
      - run: firebase appdistribution:distribute app-release.apk --app $APP_ID --groups $TESTER_GROUP
        env: 
          FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
          APP_ID: 1:YYYYYYYYYYYY:android:ZZZZZZZZZZZZZZZZZZZZZZ
          TESTER_GROUP: puzzle-app-group
  • 「APP_ID」は適切に設定
    • Firebase – プロジェクトの設定 – マイアプリ
  • Start commit
  • Commit new file

8-2. GitHub Actionsが実行される

  • ビルドが成功されるとデプロイされ、テストグループのメールにアプリが届く

9. Android実機でインストール&実行

  • テスターに届いたメールを開き、インストール&実行

10. 参考

投稿者プロフィール

Sondon
開発好きなシステムエンジニアです。
卓球にハマってます。

関連記事

  1. flutter

    Flutterのすゝめ

  2. flutter

    【Flutter】コード自動生成とGraphQLClientを使ってG…

  3. flutter

    【Flutter】状態管理(setState,Provider,Riv…

  4. 【Widget of the Week】#10 Table

  5. flutter

    【Flutter】開発環境構築(Flutter,VSCode,Wind…

  6. flutter

    【Flutter】Firebase Dynamic Linksを使う

最近の記事

  1. raspberrypi

制作実績一覧

  1. Checkeys