创建无服务器移动交付流水线

本教程介绍如何在 Google Cloud 中创建无服务器移动交付流水线:

  • 首先,本教程将指导您设置一个测试 Android 应用,您可以在本地计算机上使用 Gradle 命令构建和分发该应用。这些命令会构建 Android 应用程序包 (APK),并将其上传到 Firebase 应用分发,以便分发到 Beta 版测试人员。
  • 接下来,为自动执行此过程,您需要安装适用于 Cloud BuildAndroid Builder 并设置构建触发器,以通过更改源代码自动触发 Android 应用的构建和分发。

目标

  • 创建用于构建带签名的 APK 的构建任务。
  • 创建使用 Firebase 应用分发来分发新构建的构建任务。
  • 使用所需的 Android SDK 依赖项安装 Android Builder。
  • 在 Google Cloud 中创建构建触发器,该触发器使用 Android Builder Docker 构建带签名的 APK 并使用 Fabric 应用分发进行分发。

费用

本教程使用 Google Cloud 的以下收费组件:

基础 Android Builder 映像大约为 1.9 GB。根据价格计算器的估算,2 GB 环境的存储费用约为每月 0.05 美元。构建基础 Android Builder 映像大约需要 11 分钟,成本为 0.03 美元。每个额外的构建应该花费大约 5 分钟,费用为 0.02 美元。如需了解详情,请参阅 Cloud Build 价格

准备工作

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册一个新帐号

  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到项目选择器页面

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 启用 Compute Engine API。

    启用 API

  5. 安装并初始化 Cloud SDK
  6. 确保您的计算机上安装了 Gradle
  7. 确保您的计算机上安装了 Android Studio
  8. 确保您的计算机上安装了 Git

本教程假定:

  • 您使用的操作系统是 macOS 或 Linux。此处介绍的一些过程也适用于 Windows 环境,但本教程未提供此种用例的完整说明。
  • 您对 Android 开发、Android Studio 以及 Gradle 和 Git 有一定的了解。

在本地运行带签名的 Android Beta 版构建

在本部分中,您将在 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 不应该推送到源代码库的文件名和扩展名:

    cat >> .gitignore <<EOF
    google-services.json
    app-distro.json
    keystore.properties
    EOF
  5. 将应用提交到代码库:

    git add -A
    git commit -m "empty application"
  6. 配置 gcloud 命令行工具以使用您的项目。对于 [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. 输入项目名称 (Enter your project name) 下,选择您之前创建的 Google Cloud 项目:

    Firebase 云项目菜单

  4. 确认 Firebase Blaze 结算方案。

  5. 选择是否要启用 Google Analytics(分析)。在本教程中,无需使用分析功能。

  6. 等待 Firebase 项目完成创建,然后点击继续

  7. 按照将 Firebase 添加到您的 Android 项目中的说明,将 Firebase 添加到您的 Android 应用。

  8. 确保您的 google-services.json 文件已移至以下目录:

    {HOME}/android-apps/TestAndroidBuild

  9. 按照 Firebase Crashlytics 使用入门中的说明将 Firebase Crashlystics 添加到您的 Android 项目。

  10. 将目录更改为项目的应用级目录:

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

  11. 创建一个具有 Firebase Admin 角色的 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 应用分发

创建 Firebase 分发组

  1. 转到 Firebase 控制台:

    转到 Firebase 控制台

  2. 点击您为 Firebase 创建的应用。该名称与 Cloud 项目的名称类似。

  3. 点击应用分发 (App Distribution)。

  4. 点击测试人员 (Testers)。

  5. 点击添加测试人员 (Add Testers)。

  6. 输入您的电子邮件地址。

  7. 点击创建测试人员组 (Create a tester group)。

  8. 输入名称 beta-testers

  9. 点击添加测试人员 (Add testers)。

  10. 将您的电子邮件地址添加到 beta-testers 组。

更新 build.gradle 文件以添加签名和 Firebase 分发配置

  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
    

    将向分发组发送一封电子邮件,其中包含可供用户安装应用的链接。

保存对源代码库中的构建所做的更改

  • 提交对源代码库所做的更改:

    git add app/build.gradle && git commit -m "Update build for distribution."
    

在 Cloud Build 中创建您的 Android 构建

至此,您已经完成了构建和分发 Android 应用的 Gradle 构建任务。在本部分中,您将设置 Cloud Build,以便在 Cloud Source Repositories 代码库的主分支发生更改时运行这些构建任务。

  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. 创建 Android Builder,将目标 SDK 版本作为替代值进行传递:

    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. 在 Cloud Console 中,转到构建触发器页面:

    转到“构建触发器”页面

  4. 点击创建触发器

  5. 选择 android-application 代码库。

  6. 对于名称,输入 android-application-build

  7. 构建配置下,选择 cloudbuild.yaml

  8. cloudbuild.yaml 位置下,输入 /cloudbuild.yaml

  9. 点击添加一项。在此处您可以为构建设置变量。

  10. 对于下表中的每个变量,输入变量名称(包括前导下划线),然后输入项目中的值。

    变量 目的
    _CONFIG_BUCKET
    用于存储构建号的存储分区。
    gs://[PROJECT_NAME]-config-bucket 将用于存储构建号的存储分区的网址。
    _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. 要触发构建,请推送到源代码库的主分支。

    git push google develop
  3. 在 Cloud Console 中,转到 Cloud Build 页面。

  4. 点击正在进行的最新构建以查看应用构建的构建输出。

清理

完成本教程后,您可以清理在 Google Cloud 上创建的资源,以免这些资源将来产生费用。以下部分介绍如何删除或关闭这些资源。

删除项目

为了避免产生费用,最简单的方法是删除您为本教程创建的项目。

要删除项目,请执行以下操作:

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”页面

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除映像注册表

删除 Android SDK 映像和 Android 应用映像的映像注册表。

  1. 在 Cloud Console 的左侧导航菜单中,滚动到工具部分,然后点击 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 构建触发器。

从 Firebse 中删除应用

  1. 访问 Firebase 控制台

  2. 选择您为本教程创建的 Firebase 项目。其名称应类似于 [PROJECT_NAME]。

  3. 从设置菜单中选择“项目设置”。Firebase 项目设置

  4. 滚动到页面底部,然后点击 删除项目

后续步骤