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重复执行安装步骤:
- 编写
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
将该镜像推送到GitLab容器注册表或私有镜像仓库,例如命名为
your-project/android-build:api-33-jdk17在
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ć
相关产品推荐
相关产品推荐

