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)。

我的问题是,我们可以设置不同的阶段,如 DevelopmentStagingProduction 指出不同的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 配置应该已经包含 debugrelease 构建类型。通过在您的应用程序模块的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-cishared 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 developmentstagingproduction,并让它们使用 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 中使用 Dockerfile

如何在 gitlab-ci.yml 中使用带有 SonarQube.Scanner.MSBuild.exe 的 Gitlab 变量