このチュートリアルでは、Google Cloud でサーバーレス モバイル配信パイプラインを作成する方法について説明します。
- 最初に、ローカルマシンで Gradle コマンドを使用してビルドし、配信できるテスト用 Android アプリケーションを設定する手順を示します。これらのコマンドにより Android アプリケーション パッケージ(APK)がビルドされて Firebase App Distribution にアップロードされます。これにより、ベータ版テスターへの配布が可能になります。
- 次に、このプロセスを自動化するために、Cloud Build 用の Android Builder をインストールし、ビルドトリガーを設定して、ソースコードに変更を加えた Android アプリケーションのビルドと配布を自動的にトリガーします。
目標
- 署名付き APK をビルドするビルドタスクを作成する。
- Firebase App Distribution を使用して新しいビルドを配布するビルドタスクを作成する。
- 必要な Android SDK 依存関係を含む Android Builder をインストールする。
- Android Builder を使用して署名付き APK を作成し、Firebase App Distribution を使用して配布するビルドトリガーを Google Cloud で作成する。
費用
このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。
Android Builder のベースイメージは約 1.9 GB です。料金計算ツールの見積もりでは、2 GB 環境のストレージ費用は 1 か月あたり約 $.05 です。Android Builder のベースイメージのビルドにかかる時間は約 11 分で、費用は $.03 です。追加のビルドにかかる時間はそれぞれ約 5 分で、費用は $.02 です。詳細については、Cloud Build の料金をご覧ください。
始める前に
- Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
-
Compute Engine API を有効にします。
- Google Cloud CLI をインストールします。
-
gcloud CLI を初期化するには:
gcloud init
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
-
Compute Engine API を有効にします。
- Google Cloud CLI をインストールします。
-
gcloud CLI を初期化するには:
gcloud init
- Gradle がパソコンにインストールされていることを確認します。
- Android Studio がパソコンにインストールされていることを確認します。
- Git がパソコンにインストールされていることを確認します。
このチュートリアルの前提条件は次のとおりです。
- 実行 OS が macOS か Linux であること。手順の一部は Windows 環境にも適用できますが、このチュートリアルではその場合の完全な手順は説明していません。
- Android での開発、Android Studio、Gradle、Git について一定の知識があること。
署名付き Android ベータ版ビルドをローカルで動作させる
このセクションでは、Android Studio でテスト用 Android アプリケーションを設定します。このアプリケーションは、パソコンのターミナル ウィンドウで実行されている Gradle ビルドタスクを使用してビルドし、配信できます。
ビルドするテスト用 Android アプリケーションの作成
Android Studio で、空のアクティビティを使用する新しい Android プロジェクトを作成します。
次のスクリーンショットは、このタスクを行うウィザードのステップを示しています。
パソコンのターミナル ウィンドウから、テスト アプリケーションを作成したディレクトリに移動します。
cd ${HOME}/android-apps/TestAndroidBuild
そのディレクトリで Git リポジトリを初期化します。
git init && git checkout -b develop
.gitignore
ファイルを編集して、Git がソースコード リポジトリに push してはならないファイルと拡張子の名前を追加します。cat >> .gitignore <<EOF google-services.json app-distro.json keystore.properties EOF
アプリケーションをリポジトリに commit します。
git add -A git commit -m "empty application"
プロジェクトを使用するように Google Cloud CLI を構成します。
[PROJECT_NAME]
には、選択または作成したプロジェクトの名前を使用します。PROJECT=[PROJECT_NAME] gcloud config configurations create $PROJECT gcloud config config set project $PROJECT
Android アプリケーション用の Cloud Source Repositories のリポジトリを作成します。
gcloud source repos create android-application
その Cloud Source Repositories のリポジトリを Android アプリケーション用のリモート リポジトリとして追加します。
git remote add google \ https://source.developers.google.com/p/${PROJECT}/r/android-application
Firebase をアプリケーションに追加する
Firebase コンソールに移動します。
[プロジェクトを追加] をクリックします。
[プロジェクト名を入力] で、先ほど作成した Google Cloud プロジェクトを選択します。
です。
Firebase Blaze 料金プランを確認します。
Google アナリティクスを有効にするかどうかを選択します。このチュートリアルでは、Google アナリティクスを使用する必要はありません。
Firebase プロジェクトの作成が完了するのを待ち、[続行] をクリックします。
Android プロジェクトに Firebase を追加する手順に沿って Firebase を Android アプリケーションに追加します。
google-services.json
ファイルが次のディレクトリに移動されていることを確認します。{HOME}/android-apps/TestAndroidBuild
Firebase Crashlystics を Android プロジェクトに追加するには、Firebase Crashlytics の使用を開始するの手順に従います。
プロジェクトのアプリレベルのディレクトリに移動します。
cd {HOME}/android-apps/TestAndroidBuild/app
Firebase 管理者の役割を持つ Google Cloud サービス アカウントを作成します。
gcloud iam service-accounts create app-distro --display-name=app-distro APP_DISTRO_SA=$(gcloud iam service-accounts list --filter="displayName:app-distro" --format='value(email)') gcloud projects add-iam-policy-binding $PROJECT --role roles/firebase.admin --member serviceAccount:$APP_DISTRO_SA gcloud iam service-accounts keys create app-distro.json $APP_DISTRO_SA
署名鍵とキーストアを作成する
プレリリース版 Android アプリを配布するには、Java キーストア(.jks
)ファイルに保存されている証明書を使用してアプリに署名する必要があります。
ターミナル ウィンドウで、アプリケーションの親ディレクトリに移動します。
cd ${HOME}/AndroidStudioProjects/TestAndroidBuild
アプリケーションに署名するための Java キーストアと鍵を作成し、
keystore.properties
ファイルを作成して、キーエイリアス、パスワード、キーストア ファイルの相対パスをそのファイルに保存します。JKS_PASSWORD=$(openssl rand -base64 12) keytool -genkey -noprompt -keystore ../signing/android.jks \ -alias android-key \ -dname "CN=example.com, OU=IT, O=Example, L=Sunnyvale, S=California, C=US" \ -storepass ${JKS_PASSWORD} \ -keypass ${JKS_PASSWORD} cat > ../signing/keystore.properties <<EOF storeFile=../signing/android.jks storePassword=${JKS_PASSWORD} keyPassword=${JKS_PASSWORD} keyAlias=android-key EOF
Android シークレット ファイルを暗号化してソース リポジトリに追加する
鍵管理サービスを有効にします。
gcloud services enable cloudkms.googleapis.com
鍵を格納するキーリングを作成します。
gcloud kms keyrings create my-app --location=global
シークレットを格納する鍵を作成します。
gcloud kms keys create android-builder \ --location=global \ --keyring=my-app \ --purpose=encryption
Cloud Build サービス アカウントに暗号化 / 復号のロールを追加します。
CLOUDBUILD_ACCOUNT=$(gcloud projects get-iam-policy $PROJECT \ --filter="(bindings.role:roles/cloudbuild.builds.builder)" \ --flatten="bindings[].members" \ --format="value(bindings.members[])" | tail -1) gcloud kms keys add-iam-policy-binding android-builder --location=global \ --keyring=my-app --member="${CLOUDBUILD_ACCOUNT} \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
keystore.properties
ファイルを暗号化します。gcloud kms encrypt --plaintext-file=signing/keystore.properties \ --ciphertext-file=signing/keystore.properties.enc --location=global \ --keyring=my-app --key=android-builder
署名ファイルをソース リポジトリに追加します。
git add signing git commit -m "encrypted signing information"
google-services.json
ファイルを暗号化します。gcloud kms encrypt --plaintext-file=app/google-services.json \ --ciphertext-file=app/google-services.json.enc --location=global \ --keyring=my-app --key=android-builder
google-services.json.enc
ファイルをソース リポジトリに追加します。git add app/google-services.json.enc git commit -m "encrypted application account"
app-distro.json
ファイルを暗号化します。gcloud kms encrypt --plaintext-file=app-distro.json \ --ciphertext-file=app-distro.json.enc \ --location=global \ --keyring=my-app --key=android-builder
app-distro.json.enc
ファイルをソース リポジトリに追加します。git add app-distro.json.enc git commit -m "encrypted service account"
Firebase App Distribution を追加する
- Gradle を使用して Android アプリをテスターに配布するの手順に沿って、Firebase App Distribution をアプリケーションに追加します。
Firebase 配布グループを作成する
Firebase コンソールに移動します。
Firebase 用に作成したアプリをクリックします。名前は Cloud プロジェクト名に似ています。
[App Distribution] をクリックします。
[テスター] をクリックします。
[テスターを追加] をクリックします。
メールアドレスを入力します。
[ テスター グループを作成] をクリックします。
beta-testers という名前を入力します。
[テスターを追加] をクリックします。
beta-testers グループにメールアドレスを追加します。
署名と Firebase 配布の構成が含まれるように build.gradle ファイルを更新する
以下の太字の行で
{HOME}/AndroidStudioProjects/TestAndroidBuild/build.gradle
ファイルを更新します。buildscript { ext.kotlin_version = '1.3.41' repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.5.0' classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version' classpath 'com.google.firebase:firebase-appdistribution-gradle:2.0.0' classpath 'com.google.gms:google-services:4.3.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } }
次のスニペットを
{HOME}/AndroidStudioProjects/TestAndroidBuild/app/build.gradle
ファイルに追加します。android { // ... def debugKeystorePropertiesFile = rootProject.file("signing/keystore.properties") def keystoreProperties = new Properties() keystoreProperties.load(new FileInputStream(debugKeystorePropertiesFile)) //... android { //... signingConfigs { debug { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile file(keystoreProperties['storeFile'].trim()) storePassword keystoreProperties['storePassword'] } } buildTypes { debug { firebaseAppDistribution { releaseNotesFile="release-notes.txt" groups="beta-testers" } } // ... packagingOptions { exclude "app-distro.json" } } }
Gradle ファイルのテストの依存関係を修正する
${HOME}/AndroidStudioProjects/TestAndroidBuild/app/build.gradle
ファイルに次の太字の行があることを確認します。dependencies { //... androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' }
パソコンでアプリのビルドと配布をする
ターミナル ウィンドウで、テスト アプリケーションの親ディレクトリに移動します。
{HOME}/AndroidStudioProjects/TestAndroidBuild
アプリをビルドして配布します。
gradle assembleDebug appDistributionUploadDebug
リンクを含むメールが配信グループに送信され、ユーザーはそのリンクをクリックしてアプリケーションをインストールできます。
変更したビルドをソース リポジトリに保存する
ソース リポジトリに対する変更を commit します。
git add app/build.gradle && git commit -m "Update build for distribution."
Cloud Build での Android ビルドの作成
この段階で、Android アプリケーションをビルドして配信する有効な Gradle ビルドタスクが作成されています。このセクションでは、Cloud Source Repositories のリポジトリのマスター ブランチに変更が行われるたびにこれらのビルドタスクが実行されるように Cloud Build を設定します。
PROJECT
環境変数を設定します。export PROJECT=$(gcloud config get-value project)
Android Builder がビルド間の依存関係の保存に使用するストレージ バケットを作成します。
gsutil mb gs://$PROJECT-cache-bucket
Android Builder が Android ビルド番号をインクリメントするために使用するストレージ バケットを作成します。
gsutil mb gs://$PROJECT-config-bucket
Android Builder がアーティファクトを保存するために使用するストレージ バケットを作成します。
gsutil mb gs://$PROJECT-artifact-bucket
Android Builder を作成する
ターミナル ウィンドウで、コミュニティ ビルダーのリポジトリのクローンを Android アプリケーションのディレクトリの外側にあるディレクトリに作成します。
git clone https://github.com/GoogleCloudPlatform/cloud-builders-community
GitHub リポジトリには、コミュニティで維持されるビルダーが含まれます。
tar
ビルダーが含まれているディレクトリに移動します。cd cloud-builders-community/tar
tar
ビルダーをプロジェクトに追加します。gcloud builds submit --config=cloudbuild.yaml
Android Builder が含まれているディレクトリに移動します。
cd ../android
対象とする SDK バージョンを置換として指定して Android Builder を作成します。
gcloud builds submit --config=cloudbuild.yaml \ --substitutions=_ANDROID_VERSION=28
Android アプリケーションのビルドトリガーを作成する
このセクションでは、前のセクションで作成した Android Builder を使用するアプリケーション ビルドトリガーを作成して、Android アプリケーションのビルドと配信を行います。
ターミナル ウィンドウで、サンプルの
cloudbuild.yaml
ファイルを Android Builderexamples/
ディレクトリからテスト用 Android アプリケーション ディレクトリにコピーします。cd ${HOME}/android-apps/TestAndroidBuild cp ${HOME}/cloud-builders-community/android/examples/build-test-deploy-firebase-distro.yaml \ ./cloudbuild.yaml
新しい
cloudbuild.yaml
ファイルをソース リポジトリのdevelop
ブランチに追加します。git add cloudbuild.yaml && git commit -m "Add android builder to project."
Google Cloud コンソールで、[ビルドトリガー] ページに移動します。
[トリガーを作成] をクリックします。
android-application リポジトリを選択します。
[名前] に「android-application-build」と入力します。
[構成] で [Cloud Build 構成ファイル(YAML または JSON)] を選択します。
[cloudbuild.yaml location] に「
/cloudbuild.yaml
」と入力します。[項目を追加] をクリックします。これにより、ビルドの変数を設定できます。
次の表に示す各変数に対し、変数名(先頭のアンダースコアを含む)を入力し、プロジェクトの値を入力します。
変数 値 目的 _CONFIG_BUCKET
ビルド番号の格納に使用されるバケット。gs://[PROJECT_NAME]-config-bucket
ビルド番号の格納に使用されるバケットの URL です。 _CACHE_BUCKET
ビルド依存関係のキャッシュ保存に使用されるバケット。gs://[PROJECT_NAME]-cache-bucket
各ビルドで Gradle がインターネットから同じ依存関係をダウンロードしなくてすむようにします。 _ARTIFACT_BUCKET
ビルド アーティファクトを格納するために使用される Cloud Storage バケット。gs://[PROJECT_NAME]-artifact-bucket
Android Builder は、ビルド中に中間アーティファクトなどのアーティファクトをこの場所に格納します。 [トリガーを作成] をクリックします。
アプリケーション ビルドトリガーを実行する
この段階で、アプリケーション ビルドトリガーが正常に機能するかどうかをテストできます。アプリケーションが自分のメールに配信されることを確認します。
ターミナル ウィンドウで、テスト用 Android アプリケーション プロジェクトの最上位ディレクトリに移動します。
cd ${HOME}/android-apps/TestAndroidBuild
ビルドをトリガーするには、ソースコード リポジトリのマスター ブランチに push します。
git push google develop
Google Cloud コンソールで、Cloud Build ページに移動します。
作業中の最新のビルドをクリックして、アプリケーション ビルドのビルド出力を確認します。
クリーンアップ
チュートリアルが終了したら、Google Cloud で作成したリソースをクリーンアップして今後料金が発生しないようにします。次のセクションで、このようなリソースを削除または無効にする方法を説明します。
プロジェクトの削除
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- Google Cloud コンソールで、[リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
イメージ レジストリの削除
Android SDK イメージと Android アプリケーション イメージのイメージ レジストリを削除します。
- Google Cloud コンソールの左側のナビゲーション メニューで、[ツール] セクションまでスクロールし、[Container Registry] > [イメージ] の順にクリックします。
すべてのイメージを選択します。
[削除] をクリックします。
Cloud Storage バケットの削除
Android 署名情報と Fabric プロパティを含む Cloud Storage バケットを削除します。Cloud Shell で次のコマンドを使用します。プレースホルダは自分の値に置き換えます。
PROJECT
環境変数を設定します。export PROJECT=$(gcloud config get-value project)
ビルド用に作成されたストレージ バケットを削除します。
gsutil rm gs://$PROJECT-cache-bucket gsutil rm gs://$PROJECT-config-bucket gsutil rm gs://$PROJECT-artifact-bucket
ビルドトリガーを削除する
- ベースの Android SDK ビルドトリガーを削除します。
- Android ビルドトリガーを削除します。
Firebase からアプリケーションを削除する
Firebase コンソールに移動します。
チュートリアル用に作成した Firebase プロジェクトを選択します。名前は「PROJECT_NAME」のようになります。
設定メニューで [プロジェクトの設定] を選択します。
ページの一番下までスクロールし、
をクリックします。
次のステップ
- Android ドキュメントを詳しく検討する。
- Firebase ドキュメントを詳しく検討する。