You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab Android流水线JDK安装缓存及提速优化咨询

Android GitLab流水线提速优化方案

问题现状

你的Android应用GitLab流水线运行正常,但每个阶段都重复执行JDK 17的安装步骤,导致整体运行速度缓慢。原配置如下:

image: fabernovel/android:api-33-v1.7.0

stages:
  - test
  - build
  - beta

cache:
  key:
    files:
      - Gemfile.lock
  paths:
    - vendor/bundle

before_script:
  - apt-get update && apt-get install -y openjdk-17-jdk
  - jenv add /usr/lib/jvm/java-17-openjdk-amd64
  - jenv global 17.0
  - bundle check --path vendor/bundle || bundle install --path vendor/bundle --jobs $(nproc)

test:
  image: fabernovel/android:api-33-v1.7.0
  tags:
    - docker-ansible
  stage: test
  cache:
    key:
      files:
        - gradle/wrapper/gradle-wrapper.properties
    paths:
      - cache/caches/
      - cache/notifications/
      - cache/wrapper/

  script:
    - bundle exec fastlane test

build:
  image: fabernovel/android:api-33-v1.7.0
  tags:
    - docker-ansible
  stage: build
  cache:
    key:
      files:
        - gradle/wrapper/gradle-wrapper.properties
    paths:
      - cache/caches/
      - cache/notifications/
      - cache/wrapper/
  variables:
    SECURE_FILES_DOWNLOAD_PATH: './'
  script:
    - apt update -y && apt install -y curl
    - curl -s https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/download-secure-files/-/raw/main/installer | bash
    - bundle exec fastlane build
  artifacts:
    paths:
      - app/build/outputs/bundle/release/app-release.aab

beta:
  image: fabernovel/android:api-33-v1.7.0
  tags:
    - docker-ansible
  stage: beta
  script:
    - bundle exec fastlane beta
  when: manual
  allow_failure: true
  only:
    refs:
      - main

核心优化:解决JDK重复安装问题

每次通过apt安装JDK是最大的耗时点,最优方案是提前把JDK 17预装到自定义镜像中,彻底避免每个Job重复执行安装步骤:

  1. 编写Dockerfile基于原镜像扩展:
FROM fabernovel/android:api-33-v1.7.0

# 预装JDK 17和curl,同时清理apt缓存减小镜像体积
RUN apt-get update && apt-get install -y --no-install-recommends openjdk-17-jdk curl \
    && rm -rf /var/lib/apt/lists/*

# 提前配置jenv指向JDK 17
RUN jenv add /usr/lib/jvm/java-17-openjdk-amd64 \
    && jenv global 17.0
  1. 将该镜像推送到GitLab容器注册表或私有镜像仓库,例如命名为your-project/android-build:api-33-jdk17

  2. 在gitlab-ci.yml中替换全局镜像为自定义版本,并删除before_script中JDK相关的安装步骤

其他缓存与提速优化建议

  • 移除重复镜像配置:全局已指定镜像,每个Job无需重复声明image字段
  • 合并全局缓存规则:把bundle依赖和Gradle缓存的配置提到全局,避免每个Job重复编写
  • 优化制品存储:为构建产物设置过期时间,避免占用过多存储空间
  • 预装常用工具:如果频繁使用download-secure-files工具,可将其安装步骤也加入自定义镜像,进一步减少Job执行时间
  • 启用分布式缓存:若使用GitLab Premium/Ultimate版本,可开启分布式缓存,提升跨Runner的缓存命中率

优化后的完整配置

# 使用预装JDK17的自定义镜像
image: your-project/android-build:api-33-jdk17

stages:
  - test
  - build
  - beta

# 全局缓存:同时管理bundle依赖和Gradle缓存
cache:
  - key:
      files:
        - Gemfile.lock
    paths:
      - vendor/bundle
    policy: pull-push
  - key:
      files:
        - gradle/wrapper/gradle-wrapper.properties
    paths:
      - cache/caches/
      - cache/notifications/
      - cache/wrapper/
    policy: pull-push

before_script:
  # 仅保留bundle依赖检查与安装步骤
  - bundle check --path vendor/bundle || bundle install --path vendor/bundle --jobs $(nproc)

test:
  tags:
    - docker-ansible
  stage: test
  script:
    - bundle exec fastlane test

build:
  tags:
    - docker-ansible
  stage: build
  variables:
    SECURE_FILES_DOWNLOAD_PATH: './'
  script:
    # 自定义镜像已预装curl,无需重复安装
    - curl -s https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/download-secure-files/-/raw/main/installer | bash
    - bundle exec fastlane build
  artifacts:
    paths:
      - app/build/outputs/bundle/release/app-release.aab
    expire_in: 1 week  # 设置制品过期时间,自动清理存储空间

beta:
  tags:
    - docker-ansible
  stage: beta
  script:
    - bundle exec fastlane beta
  when: manual
  allow_failure: true
  only:
    refs:
      - main

内容的提问来源于stack exchange,提问作者Josip Maričević

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 06:41:29