用极狐GitLab为Android App创建自动化CICD
如何用极狐GitLab 为 Android App 创建自动化CI/CD?详细教程来了
提起 keystore,也许方圆 5 公里内的 Android 开发人员都会顿感小恐慌😨,尝试通过自动化 CI/CD 流水线来部署应用程序,其结果可能会泼你一盆冷水🥶,配置 Google Play 的访问权限及代码签名也是令人沮丧的一个难题。
别担心!GitLab/极狐Gitlab 移动端 DevOps 在此!它能够让这些流程变得简单、快速,接下来我会指导大家完成这一切。
极狐GitLab Mobile DevOps 是内置在极狐GitLab 内部的一系列功能特性,帮助移动端团队解决在 DevOps 实践中面临的巨大挑战。
本文我将演示如何使用极狐GitLab 和 fastlane 来设置自动化 CI/CD 流水线。
前提条件
- 一个 Google Play developer 账号:https://play.google.com/console
- 本地服务器上安装好 Ruby 和 Android Studio:https://docs.fastlane.tools/getting-started/android/setup/
参考项目
本次教程,我们将使用 https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/demo-projects/android_demo 作为 Android demo 项目进行演示。
安装 fastlane
如果你还没有安装 fastlane,第一步就是来安装 fastlane。
在项目根目录下创建一个 Gemfile ,写入如下内容:
source "https://rubygems.org" gem "fastlane"
接着,进入项目根目录,在命令终端执行如下命令,此命令将会安装 fastlane 和所有依赖:
bundle install.
初始化 fastlane
fastlane 安装完成,开始设置项目。
依旧在项目根目录下,在命令行终端中执行如下命令:
bundle exec fastlane init
你将会被要求输入包名和对应信息。当提示输入 JSON 密钥文件时,可以先跳过这一步;对关于元数据管理的问题,可以直接回答“no”。
执行上述命令将会在项目下新建一个叫做 fastlane 的文件夹,其包含两个文件:Appfile 及 Fastfile:
- Appfile 文件包含应用程序所需的配置信息;
- Fastfile 文件包含稍后进行替换的样例代码。
关于 Appfile 的详细配置信息,可查看 fastlane 的文档:https://docs.fastlane.tools/advanced/Appfile/。
代码签名
创建一个 keystore
接下来,创建一个用于代码签名的 keystore 和配置文件。
执行如下命令,在项目根目录下创建一个叫做 release-keystore.jks 的 keystore:
keytool -genkey -v -keystore release-keystore.jks \ -storepass password -alias release -keypass password \ -keyalg RSA -keysize 2048 -validity 10000
接着,使用 Gradle 创建一个配置文件。
在项目根目录下创建一个名为 release-keystore.properties 的文件,内容如下:
storeFile=../release-keystore.jks keyAlias=release keyPassword=password storePassword=password
注意:定要确保将上面的文件都添加到 .gitignore 文件中,以便它们不会被提交到版本控制系统中。
配置 Gradle
配置 Gradle 来使用新创建的 keystore。
在 app/build.gradle文件中,添加如下内容:
1. 在 plugins 下方,添加:
def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('release-keystore.properties') if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) }
2. 在 Build Types 上方,添加:
signingConfigs { release { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null storePassword keystoreProperties['storePassword'] } }
3. 在 release build type 中添加 signingConfig:
signingConfig signingConfigs.release
上传 keystore 到极狐GitLab 安全文件
接下来,需要把 keystore 文件上传到极狐GitLab 以便进行 CI/CD 构建:
- 在导航栏顶部,选择菜单 → 项目,找到你的项目;
- 在左侧导航栏,选择设置 → CI/CD;
- 在安全文件部分,选择展开;
- 选择上传文件;
- 找到要上传的文件,选择打开,然后开始上传文件,当上传完成后会在列表中看到对应的文件。
将 release-keystore.jks 文件和 release-keystore.properties 文件都上传上去:
创建 CI/CD 流水线
配置已就绪,接下来将 .gitlab-ci.yml文件内容及下面的 fastlane/Fastfile 文件拷贝到项目中。
此 .gitlab-ci.yml ¹ 包含运行测试、构建及 beta 的所有配置。fastlane/Fastfile ² 是一个简单的样例,可以针对特定项目配置进行定制化。
注意:此 fastlane 配置用到了插件。查看指导文档 ³ 来学习如何给项目配置 fastlane 插件。
在 Google Play 控制台创建一个应用
接下来,在本地创建一个应用构建,将其上传到 Google Play 控制来以寻求一个新的应用条目。
在本地执行如下命令:
bundle exec fastlane build
此命令将创建一个签名的应用构建,位于:
build/outputs/bundle/release/app-release.aab
随着签名应用构建就绪,登录到 Google Play 控制台并创建一个新应用,然后和初始化构建关联起来。
配置 Google Play 集成
最后一步就是在极狐GitLab 上完成 Google Play 集成。要实现这步,首先需要创建一个 Google 服务账号。
创建 Google 服务账号
跟随配置指南 ⁴ 在 Google 云平台上设置一个服务账号并且授权此账号可以访问 Google Play 项目。
使能 Google Play 集成
通过提供包名及刚刚为服务账号生成的 JSON key 文件来完成 Google Play 集成的配置,详情可以查看配置指南 ⁴ 。
这是一个简化的 CI/CD 配置,只创建了三个 CI/CD Job 来使用极狐GitLab Runner 执行 fastlane 中的每个部分。所有 CI/CD 流水线都会运行测试和构建 Job,但是只会在主分支的 CI/CD 流水线上执行 beta Job。Beta Job 也可以手动触发,因此你可以控制何时将 beta 发版推送到 Google Play。
所有配置完成,提交所有变更并将其推送到项目中,CI/CD 流水线会被触发,然后你就可以看到对应的工作在执行中了。
参考:
1. .gitlab-ci.yml:
https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/demo-projects/android_demo/-/blob/main/.gitlab-ci.yml
2. fastlane/Fastfile:
https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/demo-projects/android_demo/-/blob/main/fastlane/Fastfile
3. 指导文档:
https://docs.fastlane.tools/plugins/using-plugins/
4. 配置指南:
https://docs.gitlab.com/ee/user/project/integrations/google_play.html?_gl=1*1rdsq3v*_ga*MTA1MjA4NTY0LjE2MzQ4MDA1NDU.*_ga_ENFH3X7M5Y*MTY4NzIyNzY0MS40MDMuMS4xNjg3MjMxNDYxLjAuMC4w
#极狐Gitlab#