見出し画像

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

この記事は弊社のフルスタックエンジニア:Suraj Subedi が作成した記事です。英語版はこちらをご覧ください。
Medium

アプリストアにアプリを公開する場合、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つのファイルが必要です。

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

ここでは、フラッターの場合の公式ガイドを紹介する:https://docs.flutter.dev/deployment/android#sign-the-app

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

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

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

  2. プロジェクトのルートに.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 リポジトリに秘密ファイルとして保存されている機密ファイルをデコードして保存します: 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 を使用してアプリを配布します。

  • - Firebase で認証するために GOOGLE_APPLICATION_CREDENTIALS 環境変数を設定します。

  •  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 Secret として安全に保存する必要があります。このプロセスでは、ファイルを 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ファイルとして保存するには、ターミナルで以下のコマンドを使用します:

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リポジトリにシークレットとして追加する必要があります:

  1. GitHubのリポジトリにアクセスする。

  2. Settings「 > 」Secrets and variables「 > 」Actions "をクリックしま

  3. New repository secret」をクリックする。

  4. 以下のシークレットを追加します:

  • 名前 KEY_PROPERTIESValue: [key.properties.txtの内容]。

  • 名前 KEYSTOREValue: [upload-keystore.jks.txtの内容]-。

  • 名前: GOOGLE_APPLICATION_CREDENTIALS値: [google-application-credentials.json.txtの内容]-。

  • 名前 FIREBASE_ANDROID_APP_IDValue: [あなたのFirebase AndroidアプリID]。

セキュリティへの配慮

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

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

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

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

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


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

弊社は、ネパールに海外拠点を持ち、生成AI、モバイルアプリ、システム開発を中心に事業を展開する企業です。
自社サービスの開発経験を活かし、クライアント様と共に事業を創造することを重視し、創業以来、スタートアップから中小企業、大手企業、自治体まで、幅広い開発実績があります。プロダクトはユーザーが使いやすいように設計しており、企画から開発、保守運用まで対応しています。開発技術を厳選し限定することで、セキュリティ、プロダクトの品質向上に努めており、事業開発に関する課題を深く理解し、最適なご提案が可能です
お問い合わせはこちらから:
お問い合わせフォーム:https://readytowork.jp/

直通番号:080-8940-7169