使用 GitLab CI 自动构建 Android
为 Capacitor 应用设置 CI/CD 可能会很复杂和耗时。以下是您需要了解的内容:
前置条件
开始之前,您需要设置:
- 具有管理员访问权限的 GitLab 账户
- 已在 Google Play 商店发布并正确签名的应用
- Android 签名密钥和 keystore 文件
- Google Cloud Console 项目,已启用 Play Store API
- 具有适当权限的服务账户
- 对 GitLab CI/CD 工作流程的理解
- Fastlane 配置的知识
- 维护和调试管道所需的时间
Capgo Build for CI/CD by Capgo
跳过Fastlane、Gradle runner、keystore和上传脚本的维护。 Capgo Build 从您的CI/CD管道中运行已有的签名原生Android构建:
- 与您的管道兼容:在GitLab CI、GitHub Actions、Jenkins或本地脚本中触发Capgo Build后,
npx cap sync. - 从CI密钥中签名:在CI密钥中保留Android密钥库、密钥别名、密码和Play Console服务账户JSON。
- 无原生运行器维护:Capgo Build提供维护的Android构建环境,因此您不需要管理SDK镜像、Gradle缓存问题或Fastlane通道。
- artifact和提交:下载签名的artifact用于QA或通过Capgo CLI提交发布版本。
定价
- Capgo 计划从每月 12 美元开始
- 包括 OTA 更新和每月约 15 个本机构建
- 额外的构建分钟通过信用额度按分钟计费
手动设置指南
您需要做的就是:
在帖子中遵循以下步骤
- 复制 Fastlane 文件
- 将您的机密存储在 GitLab 加密机密中
- 创建并存储 Google Play 服务帐户密钥
- 存储您的 Android 签名密钥
- 设置您的 GitLab 工作流 .yml 文件
1. 复制 Fastlane 文件
Fastlane 是一款 Ruby 库,用于自动化常见的移动开发任务。使用 Fastlane,可以配置自定义的“道线”,这些道线包含一系列的“动作”,这些动作执行您通常使用 Android Studio 执行的任务。您可以在 Fastlane 中做很多事情,但在本教程中,我们将仅使用一小部分核心动作。
在项目根目录创建一个 Fastlane 文件夹,并复制以下文件: Fastlane
default_platform(:android)
KEYSTORE_KEY_ALIAS = ENV["KEYSTORE_KEY_ALIAS"]
KEYSTORE_KEY_PASSWORD = ENV["KEYSTORE_KEY_PASSWORD"]
KEYSTORE_STORE_PASSWORD = ENV["KEYSTORE_STORE_PASSWORD"]
platform :android do
desc "Deploy a beta version to the Google Play"
private_lane :verify_changelog_exists do |version_code: |
changelog_path = "android/metadata/en-US/changelogs/#{version_code}.txt"
UI.user_error!("Missing changelog file at #{changelog_path}") unless File.exist?(changelog_path)
UI.message("Changelog exists for version code #{version_code}")
end
private_lane :verify_upload_to_staging do |version_name: |
UI.message "Skipping staging verification step"
end
lane :beta do
keystore_path = "#{Dir.tmpdir}/build_keystore.keystore"
File.write(keystore_path, Base64.decode64(ENV['ANDROID_KEYSTORE_FILE']))
json_key_data = Base64.decode64(ENV['PLAY_CONFIG_JSON'])
previous_build_number = google_play_track_version_codes(
package_name: ENV['DEVELOPER_PACKAGE_NAME'],
track: "internal",
json_key_data: json_key_data,
)[0]
current_build_number = previous_build_number + 1
sh("export NEW_BUILD_NUMBER=#{current_build_number}")
gradle(
task: "clean bundleRelease",
project_dir: 'android/',
print_command: false,
properties: {
"android.injected.signing.store.file" => "#{keystore_path}",
"android.injected.signing.store.password" => "#{KEYSTORE_STORE_PASSWORD}",
"android.injected.signing.key.alias" => "#{KEYSTORE_KEY_ALIAS}",
"android.injected.signing.key.password" => "#{KEYSTORE_KEY_PASSWORD}",
'versionCode' => current_build_number
})
upload_to_play_store(
package_name: ENV['DEVELOPER_PACKAGE_NAME'],
json_key_data: json_key_data,
track: 'internal',
release_status: 'completed',
skip_upload_metadata: true,
skip_upload_changelogs: true,
skip_upload_images: true,
skip_upload_screenshots: true,
)
end
lane :build do
gradle(
task: "clean bundleRelease",
project_dir: 'android/',
print_command: false,
properties: {
"android.injected.signing.store.file" => "#{keystore_path}",
"android.injected.signing.store.password" => "#{KEYSTORE_STORE_PASSWORD}",
"android.injected.signing.key.alias" => "#{KEYSTORE_KEY_ALIAS}",
"android.injected.signing.key.password" => "#{KEYSTORE_KEY_PASSWORD}",
})
end
lane :prod_release do
build_gradle = File.read("../android/app/build.gradle")
verify_changelog_exists(version_code: build_gradle.match(/versionCode (\d+)/)[1])
verify_upload_to_staging(version_name: build_gradle.match(/versionName '([\d\.]+)'/)[1])
supply(
track_promote_to: 'beta',
skip_upload_apk: true,
skip_upload_aab: true,
skip_upload_metadata: false,
skip_upload_changelogs: false,
skip_upload_images: false,
skip_upload_screenshots: false
)
end
end
在 GitLab CI/CD 变量中存储您的机密
GitLab 提供了一个存储加密 CI/CD 变量的方式,类似于 GitHub 的仓库机密。要安全地存储您的敏感信息。
- 转到您的 GitLab 项目的设置。
- 导航到 CI/CD > 变量
- 添加以下变量:
- ANDROID_KEYSTORE_FILE:用于签署 Android 构建的 base64 编码文件。这个文件将是与您的上传密钥相关联的 keystore 文件(如果使用 Play App Signing),或您的应用签名密钥。
.jks或.keystore文件 - KEYSTORE_KEY_PASSWORD: 与密钥库文件相关的密码
- KEYSTORE_KEY_ALIAS: 密钥库别名
- KEYSTORE_STORE_PASSWORD: 私钥密码
- DEVELOPER_PACKAGE_NAME: 你的 Android 应用 ID,如 com.example.app
- PLAY_CONFIG_JSON: 基于 64 位的服务帐户密钥 JSON。
创建 Google Play 服务帐户密钥
为了生成密钥,请遵循以下步骤: PLAY_CONFIG_JSON 访问 Google Cloud 控制台
- 创建一个新项目或选择一个现有的项目 启用 Google Play Android 开发者 __CAPGO_KEEP_0__
- Creating a Google Play Service Account Key
- Enable the Google Play Android Developer API
- 创建服务账户:
- 转到 “IAM & Admin” > “服务账户”
- 点击 “创建服务账户”
- 为其命名和描述
- 点击 “创建并继续”
- 跳过角色赋予并点击 “完成”
- 生成 JSON 密钥:
- 在列表中找到您的服务账户
- 点击三点菜单 > “管理密钥”
- 点击 “添加密钥” > “创建新密钥”
- 选择 JSON 格式
- 点击 “创建”
- 在 Google Play 控制台中,授予服务帐户对应用程序的访问权限:
- 前往 Google Play 控制台
- 导航到“用户和权限”
- 点击“邀请新用户”
- 输入服务帐户电子邮件(以 @*.iam.gserviceaccount.com 结尾)
- 授予“发布到生产环境”权限
- 点击“邀请用户”
- 将 JSON 密钥转换为 base64:
base64 -i path/to/your/service-account-key.json | pbcopy - 将 base64 编码的字符串添加到 GitLab 中作为
PLAY_CONFIG_JSON变量
设置您的 GitLab CI/CD pipeline
创建一个 .gitlab-ci.yml 文件在你的项目根目录中来定义你的 CI/CD pipeline。以下是如何结构你的 pipeline 的一个例子:
image: mingc/android-build-box:latest
stages:
- build
- upload_to_capgo
- build_and_upload_android
build:
stage: build
tags:
- saas-linux-xlarge-amd64
cache:
- key:
files:
- bun.lockb
paths:
- .node_modules/
script:
- npm install
- npm run build
artifacts:
paths:
- node_modules/
- dist/
only:
- master
upload_to_capgo:
stage: upload_to_capgo
tags:
- saas-linux-xlarge-amd64
script:
- npx @capgo/cli@latest bundle upload -a $CAPGO_TOKEN -c dev
dependencies:
- build
when: manual
only:
- master
build_and_upload_android:
tags:
- saas-linux-xlarge-amd64
stage: build_and_upload_android
cache:
- key:
files:
- android/gradle/wrapper/gradle-wrapper.properties
paths:
- ~/.gradle/caches/
script:
- npx cap sync android
- npx cap copy android
- bundle exec fastlane android beta # We do create a tag for the build to trigger XCode cloud builds
dependencies:
- build
when: manual
only:
- master
触发 Pipeline
每当你推送一个新的标签到你的 GitLab 仓库,GitLab CI/CD 将自动触发定义的 pipeline,它将使用 Fastlane 构建并部署你的 Android 应用程序。
确保根据你的项目结构和需求调整路径和依赖项。这一设置将帮助你在 GitLab CI/CD 上自动部署你的 Android 应用程序。
结论
通过使用 mingc/android-build-box Docker 镜像配置 GitLab CI/CD,你可以自动化 Android 应用程序的构建过程,使你的开发流程更加高效和可靠。这一自动化将释放你的时间,让你专注于应用开发的核心方面,从而帮助你更高效地交付高质量的 Android 应用程序。
Keep going from Automatic Capacitor Android build with GitLab
如果你正在使用 Automatic Capacitor Android build with GitLab 来规划 CI/CD 自动化,连接它与 Capgo CI/CD 来规划产品工作流程在 Capgo CI/CD 中, Capgo 原生构建 为产品工作流程在 Capgo 原生构建中 Capgo 集成 为产品工作流程在 Capgo 集成中 CI/CD 集成 CI/CD 集成的实现细节 GitHub 动作集成 为 GitHub 动作集成的实现细节