Android 项目 使用 GitLab Runner CI/CD 构建

Android 项目 使用 GitLab Runner CI/CD 构建

源码

.gitlab-ci.yml

  • 注意:示例项目将代码放在了 git 仓库的 android 文件夹中
  • 由于 GitLab Runner 运行在一台 2017 年的笔记本(4核8线程) 上,运行速度可能并不理想
  • 优化方案:Gradle Android SDK Docker Images
stages:
  - build

build-android:
  stage: build
  image: $BUILD_IMAGE
  variables:
    # 流水线作业运行的 Docker 镜像
    # 如果使用 gradle 命令,则需要使用 gradle 镜像
    # 如果使用 gradlew 命令, 则仅需要使用 JDK 镜像
    BUILD_IMAGE: registry.cn-qingdao.aliyuncs.com/xuxiaoweicomcn/gradle:9.1.0-jdk17
    # gradle 本地仓库路径
    GRADLE_USER_HOME: $CI_PROJECT_DIR/.gradle
    # android SDK 路径
    ANDROID_HOME: $CI_PROJECT_DIR/android-sdk-root
    # 编译时使用的安卓版本,它应该和 compileSdkVersion 一致。
    ANDROID_COMPILE_SDK: 33
    # 构建工具版本。应该是符合 buildToolsVersion。
    ANDROID_BUILD_TOOLS: 33.0.2
    # 从官方网站下载命令行工具的版本。
    # https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS}_latest.zip
    ANDROID_SDK_TOOLS: 9477386
  before_script:
    - cd android && echo "进入安卓项目文件夹"
    - echo $KEYSTORE_BASE64 | base64 -d > xuxiaowei.keystore
    - echo "storeFile=../xuxiaowei.keystore" > keystore.properties
    - echo "keyAlias=$KEYSTORE_ALIAS" >> keystore.properties
    - echo "storePassword=$KEYSTORE_PASSWORD" >> keystore.properties
    - echo "keyPassword=$KEYSTORE_PASSWORD" >> keystore.properties
    - install -d $ANDROID_HOME
    - |
      if [ ! -f "$ANDROID_HOME/cmdline-tools.zip" ]; then
        wget --no-verbose --output-document=$ANDROID_HOME/cmdline-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS}_latest.zip
      fi
    - |
      if [ ! -d "$ANDROID_HOME/cmdline-tools/tools" ]; then
        unzip -q -d $ANDROID_HOME/cmdline-tools $ANDROID_HOME/cmdline-tools.zip;
        mv -T $ANDROID_HOME/cmdline-tools/cmdline-tools $ANDROID_HOME/cmdline-tools/tools;
      fi
    - export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/cmdline-tools/tools/bin
    - sdkmanager --version
    - yes | sdkmanager --licenses > /dev/null || true
    - sdkmanager "platforms;android-${ANDROID_COMPILE_SDK}"
    - sdkmanager "platform-tools"
    - sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}"
  script:
    - gradle -version
    - gradle build -x test
    - ls -lh $CI_PROJECT_DIR/android/app/build/outputs/apk/*/*.apk
  after_script:
    - echo "无论流水线执行结果如何,最终都会执行删除 android 签名配置"
    - rm -rf android/keystore.properties
    - rm -rf android/xuxiaowei.keystore
  artifacts:
    name: "${CI_JOB_NAME}"
    expire_in: 7 days
    paths:
      - android/app/build/outputs/apk/*/*.apk
  cache:
    key: "${CI_JOB_NAME}"
    paths:
      - .gradle
      - android-sdk-root
  tags:
    - 911k-docker

项目变量配置

  • 注意隐藏密码隐藏签名文件Base64
  • 注意环境变量是否受保护
    • 受保护的环境变量仅能在受保护的分支/标签中使用

GitLab Runner 执行示例

  1. 首次运行,没有缓存,执行时间较长(7分 8秒
  2. 首次运行,会下载 Android 构建工具等软件
  3. 正常运行结束
    1. 会得到已经签名的 app-release.apk
    2. 无论流水线执行结果如何,最终都会执行删除 android 签名配置,防止泄密
    3. .gradleandroid-sdk-root 打包,缓存起来,方便下次使用
    4. android/app/build/outputs/apk/*/*.apk 上传到 Gitlab Artifacts,方便后续下载使用,默认保留 30天,本示例为保留 7 天。如果有需要,可以点击右侧的保持按钮,可以永久保留。点击下载可以下载所有 Artifacts,点击浏览可以选择性下载某个 Artifacts
  4. 后续执行时,存在缓存,执行速度较快(3分 0秒