見出し画像

GithubアクションとFirebaseアプリ配布を使用してアプリをビルドし、テスターと共有する

この記事は弊社のフルスタックエンジニア:Suraj Subediが作成した記事です。

アプリストアにアプリを公開する場合、AndroidにはGoogle Playストア、iOSにはApple App Storeがあります。しかし、アプリをリリースする前に、社内ユーザーとアプリをテストするための別の環境が必要です。

複数のバージョンで作業し、それをビルドし、テスターと共有することは、自動化されていなければ、開発者とテスターの両方にとって大変な作業になる。そこで、ここではCI/CDツールを使ってどのようにプロセスをスムーズにするかを見ていく。

使用する道具

  1. アプリのビルド、バージョン管理、署名のためのGithub Action。

  2. Firebase App Distributionによるステージングでのアプリの共有。

前提条件

  1. ステージングにデプロイ可能なモバイルアプリ。

  2. アプリ配布用のFirebaseアカウント。

  3. Androidの場合:アプリは署名されている必要があり、key.propertiesとupload-keystore.jksの2つのファイルが必要です。

注:ワークフローを設定し、アプリをリリースする前に、まだ署名していない場合は、公式ガイドに従ってアプリに署名し、キーストアを生成してください。

Flutterの場合の公式ガイドはこちら:
https://docs.flutter.dev/deployment/android#sign-the-app

ステップ・バイ・ステップ・ガイド:

ステップ1:アプリを作成し、Github WorkFlowを設定する

  • このチュートリアルではFlutterを使用します。

  • プロジェクトのルートに.github/workflowsフォルダを作成し、拡張子.ymlの新しいファイルを作成する。

ステップ2:アプリを構築する環境を作るためのスクリプトを書く

1. ワークフローのトリガー

このワークフローは、コードが 「staging」 ブランチにプッシュされるたびに起動します。これにより、ステージング環境を更新したときに自動的にテストビルドが作成されるようになります。

on:
 push:
 branches:
 — “staging”

2. ビルド環境のセットアップ

このジョブは、GitHub Actionsが提供する最新バージョンのUbuntu上で実行されます。

jobs:
 build:
 runs-on: ubuntu-latest

3. コードをチェックアウトする

このステップでは、あなたのリポジトリを GitHub Actions runner にクローンし、以降のステップでコードを使えるようにします。

- name: Checkout code
 uses: actions/checkout@v2

4. Rubyのセットアップ

これはFlutterとFirebaseのツールの依存関係だ。

- name: Set up ruby env
 uses: ruby/setup-ruby@v1.138.0
 with:
 ruby-version: 3.2.1
 bundler-cache: true

5. Javaのセットアップ

AndroidアプリのビルドにはJavaが必要なので、このステップではランナーにJava 11をセットアップする。

- name: Set up Java
 uses: actions/setup-java@v2
 with:
 distribution: “zulu”
 java-version: “11

6. Flutterのセットアップ

このステップでは、ランナーにFlutterの安定版をインストールする。

- name: Set up Flutter
 uses: subosito/flutter-action@v2
 with:
 channel: “stable”

7. 秘密ファイルをデコードする

この手順では、GitHub リポジトリにシークレットとして保存されている機密ファイルをデコードして保存します:
-key.properties : Android アプリに署名するためのキー情報が含まれています。
- upload-keystore.jks : Android アプリに署名するためのキーストアファイル。
-google-application-credentials.json : Googleサービスで認証するための認証情報。

- name: Decode KEY properties
 env:
 KEY_PROPERTIES: ${{ secrets.KEY_PROPERTIES }}
 run: |
 echo "$KEY_PROPERTIES" | base64 - decode > android/key.properties
- name: Decode Keystore
 env:
 KEYSTORE: ${{ secrets.KEYSTORE }}
 run: |
 echo "$KEYSTORE" | base64 - decode > android/app/upload-keystore.jks
- name: Decode GOOGLE_APPLICATION_CREDENTIALS
 env:
 GOOGLE_APPLICATION_CREDENTIALS: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }}
 run: |
 echo "$GOOGLE_APPLICATION_CREDENTIALS" | base64 - decode > android/app/google-application-credentials.jsonyam

8. Flutterの依存関係を取得する

このステップでは、pubspec.yamlファイルで指定されたすべての依存関係を取得します。

- name: Get dependencies
 run: flutter pub get

9. アプリバンドル構築

このコマンドはFlutterアプリをリリースモードのAndroid App Bundle (AAB)にビルドします。フラグによって、すべてのアイコンが含まれ、アプリが最適化されすぎていないことが保証されます。

- name: Build APP Bundle
 run: flutter build appbundle — release — no-tree-shake-icons — no-shrink — no-pub

10. Firebase CLI のインストール

このステップでは、Firebase App Distribution を使用してアプリを配布するために必要な Firebase Command Line Interface をインストールします。

- name: “Install Firebase CLI”
 run: |
 curl -sL firebase.tools | bash

11. アプリを配布する

この最後のステップでは、Firebase App Distribution を使用してアプリを配布します:
GOOGLE_APPLICATION_CREDENTIALS環境変数を設定して Firebase で認証します。
- Firebase CLI を使ってアプリバンドルを配布します。
- アプリは 「our-tester」 グループに配布されます。
- GitHub secrets に保存されている Firebase Android App ID を使用します
- リリースノートとして 「Staging」 を追加します。

- name: Distribute app For testing
 env:
 FIREBASE_ANDROID_APP_ID: ${{ secrets.FIREBASE_ANDROID_APP_ID }}
 run: |
 export GOOGLE_APPLICATION_CREDENTIALS=”$(pwd)/android/app/google-application-credentials.json”
 firebase appdistribution:distribute build/app/outputs/bundle/release/app-release.aab \
 — groups “our-tester” \
 — app “$FIREBASE_ANDROID_APP_ID” \
 — release-notes “Staging”
```

このワークフローに従うことで、ステージングブランチに変更をプッシュするたびに、Flutterアプリをビルドしてテスターに配布するプロセスを自動化することができます。これにより時間を節約し、テストプロセスの一貫性を保つことができます。

ステップ3:Base64エンコードとGitHubシークレットのセットアップ

GitHub Actions ワークフローを使う前に、機密ファイルを準備して GitHub Secrets として安全に保管する必要があります。このプロセスでは、ファイルを Base64 エンコードしてから GitHub リポジトリのシークレットに追加します。

なぜBase64エンコーディングなのか?

Base64 エンコーディングはバイナリデータをテキスト形式に変換します。GitHub Secrets は文字列値しか受け付けないため、これが必要なのです。エンコードすることで、ファイルを文字列として保存し、ワークフローの実行中に元の形式にデコードすることができます。

エンコードするファイル

Flutterアプリの配布ワークフローでは、3つのファイルをエンコードする必要がある:
1. key.properties : Androidアプリに署名するためのキー情報を含む。2. upload-keystore.jks : Androidアプリに署名するためのキーストアファイル。
3.google-application-credentials.json : Googleサービスで認証するための認証情報。

エンコード処理

これらのファイルをBase64エンコードして.txtファイルとして保存するには、ターミナルで以下のコマンドを使用します:
macOSとLinuxの場合:

base64 key.properties > key.properties.txt
base64 upload-keystore.jks > upload-keystore.jks.txt
base64 google-application-credentials.json > google-application-credentials.json.txt

Windows(PowerShell)の場合: Vscodeでも同様にドロップダウンからbashターミナルを開くことができる。

これらのコマンドは、各ファイルの Base64 エンコードされた内容を含む新しい .txt ファイルを作成します。
エンコードしたファイルができたので、GitHub リポジトリに secret として追加します:
1. GitHubのリポジトリにアクセスします。
2. 設定」>「秘密と変数」>「アクション」をクリックする。
3. New repository secret」をクリックする。
4. 以下のシークレットを追加します:
- Name: KEY_PROPERTIES
Value: [Content of key.properties.txt]
- Name: KEYSTORE
Value: [Content of upload-keystore.jks.txt]
- Name: GOOGLE_APPLICATION_CREDENTIALS
Value: [Content of google-application-credentials.json.txt]
- Name: FIREBASE_ANDROID_APP_ID
Value: [Your Firebase Android App ID]

セキュリティへの配慮

  • これらの機密ファイルやBase64エンコードされたバージョンは、決してリポジトリにコミットしないでください。

  • これらのシークレットへのアクセスは、必要な人だけに制限しましょう。

  • 定期的に認証情報をローテーションし、対応する GitHub シークレットを更新しましょう。

  • .txt ファイルを GitHub Secret に追加したら、ローカルマシンから削除しましょう。

これらのステップに従うことで、機密情報が安全に保存され、リポジトリに公開されることなく GitHub Actions のワークフローで安全に使用できるようになります。
GitHub プロジェクトへの完全なリンクはこちら: https://github.com/Suraj-Subedi/firebase-distribution-example


協業開発及び開発パートナーをお探しのお客様へ

弊社は、ネパールに海外拠点を持ち、生成AI、モバイルアプリ、システム開発を中心に事業を展開する企業です。

自社サービスの開発経験を活かし、クライアント様と共に事業を創造することを重視し、創業以来、スタートアップから中小企業、大手企業、自治体まで、幅広い開発実績があります。プロダクトはユーザーが使いやすいように設計しており、企画から開発、保守運用まで対応しています。開発技術を厳選し限定することで、セキュリティ、プロダクトの品質向上に努めており、事業開発に関する課題を深く理解し、最適なご提案が可能です

お問い合わせはこちらから:
お問い合わせフォーム:https://readytowork.jp/ 

直通番号:080-8940-7169