GItlab CI :- 如何使用 Gitlab-CI 在 Android 中创建多个 apk(如开发、登台和生产)?
Posted
技术标签:
【中文标题】GItlab CI :- 如何使用 Gitlab-CI 在 Android 中创建多个 apk(如开发、登台和生产)?【英文标题】:GItlab CI :- How to create the multiple apk(like development, staging and production) in Android using the Gitlab-CI? 【发布时间】:2021-02-14 20:37:28 【问题描述】:我可以通过 Gitlab 中的以下方法使用 Gitlab-CI 创建像 debug.apk
这样的单个构建(apk)。
在我的 .gitlab-ci.yml
里面,我已经完成了这个条目。请检查一次,
image: jangrewe/gitlab-ci-android
stages:
- build
before_script:
- export GRADLE_USER_HOME=$(pwd)/.gradle
- chmod +x ./gradlew
cache:
key: $CI_PROJECT_ID
paths:
- .gradle/
build:
stage: build
tags:
- dev-ci
script:
- ./gradlew assembleDebug
artifacts:
paths:
- app/build/outputs/
我已经创建了 docker
图像,并在 Gitlab 上的每次推送时都获得了构建(apk)。
我的问题是,我们可以设置不同的阶段,如 Development
、 Staging
和 Production
指出不同的BASE_URL
的应用程序。我也在文档中搜索过,但没有得到解决方案。请帮助我。谢谢
【问题讨论】:
您可以通过使用构建类型或构建风格来完成此操作,如here 所述。我认为构建类型是最好的情况。然后,在 CI 作业中,您需要执行三个单独的 assemble 命令来获取您的 APK:assembleDebug、assembleStaging、assembleRelease。编辑:使用风味/构建类型允许您定义其他源集,您可以在其中放置各种 URL。 @AlexanderHoffmann 你能给我举个例子吗,比如一个 apk 指向 Google URL,第二个指向 YAHOO,最后一个指向 ***。谢谢 【参考方案1】:@mles 解决方案有效,但它依赖于设置环境变量。这对于 CI 用例非常有用,但如果您也想在本地快速构建开发/暂存/发布版本,则应该使用构建类型或风格。查看Configure build variants 指南了解更多信息。
以下示例展示了如何使用构建类型来实现这一点,但使用风格也非常相似。
使用 gradle 构建类型和源集配置不同的 API 基本 URL
添加额外的构建类型
默认 gradle 配置应该已经包含 debug
和 release
构建类型。通过在您的应用程序模块的build.gradle
文件中的buildTypes
内添加此行来添加额外的staging
构建类型:
staging
initWith debug
您的 build.gradle 应如下所示:
android
...
defaultConfig
...
buildTypes
release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
staging
initWith debug
dependencies
...
之后执行 gradle 同步(通过按顶部带有 Elephant 徽标的“Sync Project with Gradle”按钮)。
添加额外的源集
您可以告诉 gradle 为特定构建配置打包特定代码和资源。在我们的示例中,我们将为每种构建类型创建一个包含基本 URl 的 ExampleConfig
文件。
object ExampleConfig
const val BASE_ULR = "http://example.com/"
在您的代码中,您只需引用此文件即可访问基本 URL。根据所选的构建类型,gradle 将自动使用文件的正确版本。
为此,在您的模块src
文件夹中添加以下文件夹(例如在\app\src
中):
debug/java
staging/java
release/java
在那里,创建 ExampleConfig
类/对象,其中包含具有不同值的 baseUrl
字符串。结果应如下所示:
它应该看起来像这样:
更改 CI 工作
在您的 CI 中,使用不同的配置调用 assemble 来构建不同的版本:
./gradlew assembleDebug
./gradlew assembleStaging
./gradlew assembleRelease
您示例中的最终 gitlab-ci 配置应如下所示:
image: jangrewe/gitlab-ci-android
stages:
- build
before_script:
- export GRADLE_USER_HOME=$(pwd)/.gradle
- chmod +x ./gradlew
cache:
key: $CI_PROJECT_ID
paths:
- .gradle/
build:
stage: build
tags:
- dev-ci
script:
- ./gradlew assembleDebug assembleStaging assembleRelease
artifacts:
paths:
- app/build/outputs/
【讨论】:
我用过下面@mles的yml,对吗?因为它现在正在工作。 @RavindraKushwaha 我也更新了配置。如果您使用不同的源集并在代码中指定 URL,则不必在yml
中指定 BASE_URL
。您可以像我展示的那样在一个构建步骤中执行各种 assemble
任务,或者像 @mles 建议的那样拆分它。
@Alexandra 你能帮我解决一个疑问,即如何创建 gitlab-ci 的 shared runner 因为现在构建正在生成依赖于系统意味着当我的系统打开时我正在构建,否则在创建构建时会失败。请帮助我..谢谢
我建议您创建一个新问题,因为这与 android 或您的初始问题无关。这也可以让其他人给你更好的答案
好吧,给我 30 分钟的时间。会发布新问题。但是你知道吗?你明白我的意思吗?请告诉我,我会详细说明【参考方案2】:
在.gitlab-ci.yml
中设置BASE_URL
:
image: jangrewe/gitlab-ci-android
stages:
- build
before_script:
- export GRADLE_USER_HOME=$(pwd)/.gradle
- chmod +x ./gradlew
cache:
key: $CI_PROJECT_ID
paths:
- .gradle/
development:
stage: build
tags:
- dev-ci
script:
- ./gradlew assembleDevelopment
artifacts:
paths:
- app/build/outputs/
variables:
BASE_URL: "https://***.com"
staging:
stage: build
tags:
- dev-ci
script:
- ./gradlew assembleStaging
artifacts:
paths:
- app/build/outputs/
variables:
BASE_URL: "https://yahoo.com"
production:
stage: build
tags:
- dev-ci
script:
- ./gradlew assembleProduction
artifacts:
paths:
- app/build/outputs/
variables:
BASE_URL: "https://google.com"
您必须在 gradle 文件中创建 Android Flavor development
、staging
、production
,并让它们使用 BASE_URL
环境变量。
或者,就像Alexander Hoffmann 建议的那样,在您的 gradle 文件中执行所有这些操作,而不在 .gitlab-ci.yml
中设置变量。
【讨论】:
谢谢@mles.. 我的 .yml 文件的 BASE_URL 与 Android Flavours 有什么关系?请指导我。谢谢 请google如何在gradle中使用环境变量。 感谢您的宝贵建议,它有效 请您编辑您的 yml 文件,因为它是无效的,我已经编辑了 yml 并创建了风味,它可以工作感谢您的建议再次 能否请您指导我有关 android 的 Jenkins CI-CD 配置。我只想配置我的远程服务器来创建我的 apk 和测试,请帮助我谢谢以上是关于GItlab CI :- 如何使用 Gitlab-CI 在 Android 中创建多个 apk(如开发、登台和生产)?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Gitlab CI 构建 Java Maven 项目?
如何使用 gitlab-ci.yml 在 gitlab 中更新 JSON 文件的内容?
如何让 gitlab-runner 从指定文件中读取而不是 .gitlab-ci.yml?
如何使用预定义的 GitLab CI 变量和流式传输到 GitLab Pipeline 日志的 Tekton 日志直接从 GitLab CI 触发 Tekton Pipeline
如何在 gitlab-ci.yml 中使用带有 SonarQube.Scanner.MSBuild.exe 的 Gitlab 变量