实用教程|如何使用 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 提供本地部署和基于云的版本。


