サーバーレス モバイル配信パイプラインの作成

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

このチュートリアルでは、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 の料金をご覧ください。

始める前に

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。

  4. Compute Engine API を有効にします。

    API を有効にする

  5. Google Cloud CLI をインストールします。
  6. gcloud CLI を初期化するには:

    gcloud init
  7. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  8. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。

  9. Compute Engine API を有効にします。

    API を有効にする

  10. Google Cloud CLI をインストールします。
  11. gcloud CLI を初期化するには:

    gcloud init
  12. Gradle がパソコンにインストールされていることを確認します。
  13. Android Studio がパソコンにインストールされていることを確認します。
  14. Git がパソコンにインストールされていることを確認します。

このチュートリアルの前提条件は次のとおりです。

  • 実行 OS が macOS か Linux であること。手順の一部は Windows 環境にも適用できますが、このチュートリアルではその場合の完全な手順は説明していません。
  • Android での開発、Android Studio、Gradle、Git について一定の知識があること。

署名付き Android ベータ版ビルドをローカルで動作させる

このセクションでは、Android Studio でテスト用 Android アプリケーションを設定します。このアプリケーションは、パソコンのターミナル ウィンドウで実行されている Gradle ビルドタスクを使用してビルドし、配信できます。

ビルドするテスト用 Android アプリケーションの作成

  1. Android Studio で、空のアクティビティを使用する新しい Android プロジェクトを作成します。

    次のスクリーンショットは、このタスクを行うウィザードのステップを示しています。

    Android Studio ウィザード、ページ 1

    Android Studio ウィザード、ページ 2

    Android Studio ウィザード、ページ 3

    Android Studio ウィザード、ページ 4

  2. パソコンのターミナル ウィンドウから、テスト アプリケーションを作成したディレクトリに移動します。

    cd ${HOME}/android-apps/TestAndroidBuild
  3. そのディレクトリで Git リポジトリを初期化します。

    git init && git checkout -b develop
  4. .gitignore ファイルを編集して、Git がソースコード リポジトリに push してはならないファイルと拡張子の名前を追加します。

    cat >> .gitignore <<EOF
    google-services.json
    app-distro.json
    keystore.properties
    EOF
  5. アプリケーションをリポジトリに commit します。

    git add -A
    git commit -m "empty application"
  6. プロジェクトを使用するように Google Cloud CLI を構成します。[PROJECT_NAME] には、選択または作成したプロジェクトの名前を使用します。

    PROJECT=[PROJECT_NAME]
    gcloud config configurations create $PROJECT
    gcloud config config set project $PROJECT
  7. Android アプリケーション用の Cloud Source Repositories のリポジトリを作成します。

    gcloud source repos create android-application
  8. その Cloud Source Repositories のリポジトリを Android アプリケーション用のリモート リポジトリとして追加します。

    git remote add google \
        https://source.developers.google.com/p/${PROJECT}/r/android-application

Firebase をアプリケーションに追加する

  1. Firebase コンソールに移動します。

    Firebase コンソールに移動

  2. [プロジェクトを追加] をクリックします。

  3. [プロジェクト名を入力] で、先ほど作成した Google Cloud プロジェクトを選択します。

    Firebase Cloud プロジェクト メニュー です。

  4. Firebase Blaze 料金プランを確認します。

  5. Google アナリティクスを有効にするかどうかを選択します。このチュートリアルでは、Google アナリティクスを使用する必要はありません。

  6. Firebase プロジェクトの作成が完了するのを待ち、[続行] をクリックします。

  7. Android プロジェクトに Firebase を追加する手順に沿って Firebase を Android アプリケーションに追加します。

  8. google-services.json ファイルが次のディレクトリに移動されていることを確認します。

    {HOME}/android-apps/TestAndroidBuild

  9. Firebase Crashlystics を Android プロジェクトに追加するには、Firebase Crashlytics の使用を開始するの手順に従います。

  10. プロジェクトのアプリレベルのディレクトリに移動します。

    cd {HOME}/android-apps/TestAndroidBuild/app

  11. 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)ファイルに保存されている証明書を使用してアプリに署名する必要があります。

  1. ターミナル ウィンドウで、アプリケーションの親ディレクトリに移動します。

    cd ${HOME}/AndroidStudioProjects/TestAndroidBuild
  2. アプリケーションに署名するための 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 シークレット ファイルを暗号化してソース リポジトリに追加する

  1. 鍵管理サービスを有効にします。

    gcloud services enable cloudkms.googleapis.com
    
  2. 鍵を格納するキーリングを作成します。

    gcloud kms keyrings create my-app --location=global
    
  3. シークレットを格納する鍵を作成します。

    gcloud kms keys create android-builder \
        --location=global \
        --keyring=my-app \
        --purpose=encryption
    
  4. 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
    
  5. keystore.properties ファイルを暗号化します。

    gcloud kms encrypt --plaintext-file=signing/keystore.properties \
        --ciphertext-file=signing/keystore.properties.enc --location=global \
        --keyring=my-app --key=android-builder
    
  6. 署名ファイルをソース リポジトリに追加します。

    git add signing
    git commit -m "encrypted signing information"
    
  7. 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
    
  8. google-services.json.enc ファイルをソース リポジトリに追加します。

    git add app/google-services.json.enc
    git commit -m "encrypted application account"
    
  9. 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
    
  10. app-distro.json.enc ファイルをソース リポジトリに追加します。

    git add app-distro.json.enc
    git commit -m "encrypted service account"
    

Firebase App Distribution を追加する

Firebase 配布グループを作成する

  1. Firebase コンソールに移動します。

    Firebase コンソールに移動

  2. Firebase 用に作成したアプリをクリックします。名前は Cloud プロジェクト名に似ています。

  3. [App Distribution] をクリックします。

  4. [テスター] をクリックします。

  5. [テスターを追加] をクリックします。

  6. メールアドレスを入力します。

  7. [ テスター グループを作成] をクリックします。

  8. beta-testers という名前を入力します。

  9. [テスターを追加] をクリックします。

  10. beta-testers グループにメールアドレスを追加します。

署名と Firebase 配布の構成が含まれるように build.gradle ファイルを更新する

  1. 以下の太字の行で {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
        }
     }
    
  2. 次のスニペットを {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 ファイルのテストの依存関係を修正する

  1. ${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'
     }
    

パソコンでアプリのビルドと配布をする

  1. ターミナル ウィンドウで、テスト アプリケーションの親ディレクトリに移動します。

    {HOME}/AndroidStudioProjects/TestAndroidBuild

  2. アプリをビルドして配布します。

    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 を設定します。

  1. PROJECT 環境変数を設定します。

    export PROJECT=$(gcloud config get-value project)
    
  2. Android Builder がビルド間の依存関係の保存に使用するストレージ バケットを作成します。

    gsutil mb gs://$PROJECT-cache-bucket
    
  3. Android Builder が Android ビルド番号をインクリメントするために使用するストレージ バケットを作成します。

    gsutil mb gs://$PROJECT-config-bucket
    
  4. Android Builder がアーティファクトを保存するために使用するストレージ バケットを作成します。

    gsutil mb gs://$PROJECT-artifact-bucket
    

Android Builder を作成する

  1. ターミナル ウィンドウで、コミュニティ ビルダーのリポジトリのクローンを Android アプリケーションのディレクトリの外側にあるディレクトリに作成します。

    git clone https://github.com/GoogleCloudPlatform/cloud-builders-community
    

    GitHub リポジトリには、コミュニティで維持されるビルダーが含まれます。

  2. tar ビルダーが含まれているディレクトリに移動します。

    cd cloud-builders-community/tar
    
  3. tar ビルダーをプロジェクトに追加します。

    gcloud builds submit --config=cloudbuild.yaml
    
  4. Android Builder が含まれているディレクトリに移動します。

    cd ../android
    
  5. 対象とする SDK バージョンを置換として指定して Android Builder を作成します。

    gcloud builds submit --config=cloudbuild.yaml \
        --substitutions=_ANDROID_VERSION=28 

Android アプリケーションのビルドトリガーを作成する

このセクションでは、前のセクションで作成した Android Builder を使用するアプリケーション ビルドトリガーを作成して、Android アプリケーションのビルドと配信を行います。

  1. ターミナル ウィンドウで、サンプルの cloudbuild.yaml ファイルを Android Builder examples/ ディレクトリからテスト用 Android アプリケーション ディレクトリにコピーします。

    cd ${HOME}/android-apps/TestAndroidBuild
    cp ${HOME}/cloud-builders-community/android/examples/build-test-deploy-firebase-distro.yaml \ ./cloudbuild.yaml
    
  2. 新しい cloudbuild.yaml ファイルをソース リポジトリの develop ブランチに追加します。

    git add cloudbuild.yaml && git commit -m "Add android builder to project."
    
  3. Google Cloud コンソールで、[ビルドトリガー] ページに移動します。

    [ビルドトリガー] ページに移動

  4. [トリガーを作成] をクリックします。

  5. android-application リポジトリを選択します。

  6. [名前] に「android-application-build」と入力します。

  7. [構成] で [Cloud Build 構成ファイル(YAML または JSON)] を選択します。

  8. [cloudbuild.yaml location] に「/cloudbuild.yaml」と入力します。

  9. [項目を追加] をクリックします。これにより、ビルドの変数を設定できます。

  10. 次の表に示す各変数に対し、変数名(先頭のアンダースコアを含む)を入力し、プロジェクトの値を入力します。

    変数 目的
    _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 は、ビルド中に中間アーティファクトなどのアーティファクトをこの場所に格納します。
  11. [トリガーを作成] をクリックします。

アプリケーション ビルドトリガーを実行する

この段階で、アプリケーション ビルドトリガーが正常に機能するかどうかをテストできます。アプリケーションが自分のメールに配信されることを確認します。

  1. ターミナル ウィンドウで、テスト用 Android アプリケーション プロジェクトの最上位ディレクトリに移動します。

    cd ${HOME}/android-apps/TestAndroidBuild
  2. ビルドをトリガーするには、ソースコード リポジトリのマスター ブランチに push します。

    git push google develop
  3. Google Cloud コンソールで、Cloud Build ページに移動します。

  4. 作業中の最新のビルドをクリックして、アプリケーション ビルドのビルド出力を確認します。

クリーンアップ

チュートリアルが終了したら、Google Cloud で作成したリソースをクリーンアップして今後料金が発生しないようにします。次のセクションで、このようなリソースを削除または無効にする方法を説明します。

プロジェクトの削除

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには:

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

イメージ レジストリの削除

Android SDK イメージと Android アプリケーション イメージのイメージ レジストリを削除します。

  1. Google Cloud コンソールの左側のナビゲーション メニューで、[ツール] セクションまでスクロールし、[Container Registry] > [イメージ] の順にクリックします。
  2. すべてのイメージを選択します。

    すべてのイメージの選択

  3. [削除] をクリックします。

Cloud Storage バケットの削除

Android 署名情報と Fabric プロパティを含む Cloud Storage バケットを削除します。Cloud Shell で次のコマンドを使用します。プレースホルダは自分の値に置き換えます。

  1. PROJECT 環境変数を設定します。

    export PROJECT=$(gcloud config get-value project)
    
  2. ビルド用に作成されたストレージ バケットを削除します。

    gsutil rm gs://$PROJECT-cache-bucket
    gsutil rm gs://$PROJECT-config-bucket
    gsutil rm gs://$PROJECT-artifact-bucket
    

ビルドトリガーを削除する

  1. ベースの Android SDK ビルドトリガーを削除します。
  2. Android ビルドトリガーを削除します。

Firebase からアプリケーションを削除する

  1. Firebase コンソールに移動します。

  2. チュートリアル用に作成した Firebase プロジェクトを選択します。名前は「PROJECT_NAME」のようになります。

  3. 設定メニューで [プロジェクトの設定] を選択します。Firebase プロジェクトの設定

  4. ページの一番下までスクロールし、プロジェクトを削除 をクリックします。

次のステップ