实用教程|如何使用 TeamCity 为 Android 项目构建 CI/CD 管道
进一步了解或试用TeamCity,请咨询JetBrains授权代理-龙智。

JetBrains TeamCity 是一个用于构建可靠管道的 CI/CD 平台。它可与流行的 Android 开发工具无缝集成,并具有人性化界面来配置构建和测试的各个阶段。
了解 Android CI/CD 管道
Android 开发的有效 CI/CD 管道包含标准 DevOps 管道中的所有步骤,并通过附加流程(如工件签名和自动部署到 Google Play 商店的内部轨道)对其进行了增强。下面是典型 Android CI/CD 管道中涉及的所有步骤的快速概览:
使用 TeamCity 构建管道
现在,您已经了解一般的 CI/CD 管道结构,我们来使用 TeamCity 构建一个管道。以下各部分将指导您设置 TeamCity、创建针对您的 Android 项目量身定制的构建配置、运行集成自动化测试,以及最后配置应用的打包和部署。
设置 TeamCity:
访问 TeamCity Cloud 实例后,您看到的初始视图将如下所示:

TeamCity Cloud 仪表板

Create Project(创建项目)页面
如果您手头没有 Android 项目,可以使用以下仓库学习本教程:
bash
https://github.com/krharsh17/android-app-teamcity

创建项目时验证连接
clean
和 build
)。
选择自动建议的构建步骤
完成后,会出现一个小横幅,上面写着您现在可以运行项目中的第一个构建。点击右上角的 Run(运行)开始第一个构建:

开始您的第一个构建
点击按钮后,构建将加入队列,等待构建代理变得可用。您可以点击顶部导航窗格中的 Projects(项目),然后选择正在运行的构建,以查看其属性和状态:

正在运行的构建的详细信息

安装 GitHub Web 挂钩
如果愿意,您可以进行以上操作。不过,在本教程中并不需要这样做。
配置构建工件:
Free
和 Paid
)。这两种版本各有两种构建变体(debug
和 release
)。这意味着 build
任务的结果将包括四个二进制文件,每种可能的版本和变体组合对应一个文件。我们来配置管道,以便在管道运行结束后提取这些工件并使其可供访问。


build
任务时,Gradle 生成的工件会存储在 app/build/outputs/apk
中。因此,您需要在 Artifact paths(工件路径)下输入以下内容:
app/build/outputs/apk/*/*/* => output
app/build/outputs/apk
后添加 /*/*/*
是因为构建后生成的 APK 二进制文件的完整路径如下所示:app/build/outputs/apk/<flavor>/<variant>/app-<flavor>-<variant>-unsigned.apk.
<variant>
、<flavor>
和二进制文件名的所有可能值,我们使用了通配符 *
。 =>
是 Ant 样式路径的一个特征,用于分隔输出和输入目录。output
是存储最终二进制文件的文件夹名称。

自定义测试:
build
还负责对所有生成的构建工件运行单元测试。不过,在某些情况下,您可能只想在应用的几个变体上运行测试。在这种情况下,您需要将 clean build
任务替换为适合您的用例的任务。clean build
替换为 assembleFreeRelease testFreeReleaseUnitTest
。为此,请点击顶部导航窗格中的 Projects(项目),然后点击 Android App Teamcity(Android 应用 Teamcity)下的 Build(构建)。在下一个页面上,与上一步的操作一样,点击右上角的 Edit configuration(编辑配置)按钮。

clean build
替换为 assembleFreeRelease testFreeReleaseUnitTest
:





管理多个构建:


https://github.com/krharsh17/android-app-teamcity
),然后点击 Proceed(继续):



clean build
Gradle 任务,因此不要勾选此页面上的任何复选框。点击表上方的 configure build steps manually(手动配置构建步骤)链接。
clean test%env.FLAVOR%%env.VARIANT%
:

assemble%env.FLAVOR%%env.VARIANT%
。此步骤将为应用的给定版本和变体生成构建工件。
app/build/outputs/apk/*/*/* => output
,与上一个配置相同。
env.FLAVOR
,值为 Free
。添加另一个形参 env.VARIANT
,它的两个值为 Release
和 Debug
。


打包和部署:
build.gradle.kts
文件中的插件块中:
kt
id("com.github.triplet.play") version "3.9.1"
play {}
块,内容如下:
kt
play {
serviceAccountCredentials.set(file("play_config.json"))
track.set("internal")
releaseStatus.set(ReleaseStatus.DRAFT)
defaultToAppBundles.set(true)
}
play_config.json
的文件中的服务账号凭据,在将二进制文件推送到 Play 管理中心时将轨道设置为 internal
,并将发布状态设置为 DRAFT
,并默认使用应用捆绑包代替 APK。bundleFreeRelease
作为要运行的 Gradle 任务:

# Create the keystore file from the environment variables
echo %env.ANDROID_KEYSTORE_FILE% > keystore.jks.b64
base64 -d -i keystore.jks.b64 > app/keystore.jks
# Sign the AAB using the keystore and credentials retrieved from the environment variables
jarsigner
-keystore app/keystore.jks
-storepass %env.KEYSTORE_STORE_PASSWORD%
-keypass %env.KEYSTORE_KEY_PASSWORD%
-signedjar release.aab
app/build/outputs/bundle/freeRelease/app-free-release.aab
%env.KEYSTORE_KEY_ALIAS%
# Create the GCP service account credentials file from the environment variables
echo %env.PLAY_CONFIG_JSON% > play_config.json.b64
base64 -d -i play_config.json.b64 > app/play_config.json
# Use GPP to publish the app bundle
./gradlew publishFreeBundle --artifact-dir release.aab

bash
ANDROID_KEYSTORE_FILE
KEYSTORE_KEY_ALIAS
KEYSTORE_KEY_PASSWORD
KEYSTORE_STORE_PASSWORD
PLAY_CONFIG_JSON

KEYSTORE_KEY_ALIAS
、KEYSTORE_KEY_PASSWORD
和 KEYSTORE_STORE_PASSWORD
,请随意点击 Edit(编辑)并在相应的对话框中提供它们的值:
ANDROID_KEYSTORE_FILE
和 PLAY_CONFIG_JSON
,您首先需要使用 openssl 等工具将文件转换为 Base64,然后将 Base64 编码的内容粘贴到这些变量的值字段中。BUILD SUCCESSFUL
消息:

最佳做法和提示
现在,您可以使用 TeamCity 为 Android 设置自己的管道,以下是您可以考虑实施的一些关键最佳做法,以确保您的管道高效快速:
结论
在本文中,您了解了如何使用 JetBrains TeamCity 为 Android 开发项目构建和管理详细的 CI/CD 管道。您探索了 Android CI/CD 管道从代码迁出和版本控制集成到签名、部署和监控等各个关键阶段。您了解了 TeamCity 如何促进每个阶段并简化开发工作流。最后,您还将学习一些关键的最佳做法,以确保您的管道高效运行。
本博文英文原作者:Olga Bedrina
关于 TeamCity

TeamCity 是一款强大的持续集成和部署服务器,面向以 DevOps 为中心的团队提供开箱即用的测试智能、构建问题的实时报告以及无与伦比的可扩展性。安装和部署 TeamCity,几分钟之内即可开始构建您的 DevOps 管道。TeamCity 提供本地部署和基于云的版本。