Azure DevOps中Ruby+Fastlane安装耗时过长,如何缩短流程?
我来分享几个亲测有效的方法,帮你把这个安装步骤的时间砍下来——毕竟流水线卡在这里太耽误事儿了~
1. 直接跳过Gem文档安装(立竿见影的优化)
你提到文档安装就花了232秒,这完全是没必要的开销!Gem默认会安装文档,但在流水线环境里根本用不上。可以通过两种方式跳过:
方式一:给每个Gem命令加参数
修改你的安装脚本:
# 安装bundler时跳过文档 gem install bundler --no-document # 安装Fastlane时跳过文档 gem install fastlane --no-document # Bundle安装也跳过文档 bundle install --retry=3 --jobs=4 --no-document
方式二:全局设置环境变量(更省心)
在所有安装命令前加一行,让所有Gem安装自动跳过文档:
export GEM_SKIP_DOCS=1
这样后续所有gem install和bundle install都会默认不装文档,不用每个命令单独加参数。
2. 去掉不必要的bundle update --bundler
bundle update会检查并更新所有依赖到最新版本,这不仅慢,还可能引入版本兼容问题。如果你的项目已经有Gemfile.lock文件(正常项目都会有),完全可以固定版本安装:
- 先查看
Gemfile.lock里的bundler版本,比如是2.4.20,直接指定版本安装:gem install bundler -v 2.4.20 --no-document - 然后直接执行
bundle install即可,不需要bundle update --bundler,这样能省掉大量的版本检查和下载时间。
3. 缓存Gem依赖(避免重复安装)
Azure DevOps提供了缓存任务,可以把已经安装好的Gem缓存起来,后续流水线运行时直接复用,不用重新安装所有69个Gem。
比如用Cache@2任务缓存vendor/bundle目录(推荐把bundle安装到项目目录下,方便缓存):
steps: - task: Cache@2 inputs: key: 'gem | "$(Agent.OS)" | Gemfile.lock' path: 'vendor/bundle' cacheHitVar: 'CACHE_RESTORED' # 只有缓存没命中时才执行安装 - script: | gem install bundler --no-document # 配置bundle把依赖安装到vendor/bundle目录 bundle config set path 'vendor/bundle' bundle install --retry=3 --jobs=4 --no-document gem install fastlane --no-document condition: ne(variables.CACHE_RESTORED, 'true')
第一次运行会缓存,后续只要Gemfile.lock没变化,就能直接用缓存,速度会快很多。
4. 使用预构建的容器镜像(终极提速)
如果你的流水线用容器作业,可以直接用已经预装Ruby和常用依赖的官方镜像,比如微软提供的Azure Pipelines Ruby镜像:
pool: vmImage: 'ubuntu-latest' # 选择对应版本的Ruby镜像,比如3.2版本 container: mcr.microsoft.com/azure-pipelines/ruby:3.2
这种镜像里已经有Ruby、bundler等基础工具,你只需要安装Fastlane或者项目特有的Gem,省去了从头安装Ruby环境的时间。如果需要更贴合项目的环境,还可以自己构建一个包含所有所需Gem的自定义镜像,每次流水线直接拉取即可,安装步骤基本秒完成。
5. 检查是否有多余Gem依赖(可选)
因为你不是Ruby开发者,可以简单检查下Gemfile里的依赖,看看有没有Fastlane用不到的冗余项。比如如果你的Fastlane脚本只做打包、上传App Store,有些用于测试、代码分析的Gem可能可以去掉。不过这个需要稍微了解下每个Gem的作用,或者先试试前面几个方法,优化效果已经足够明显了。
先从跳过文档和缓存这两个方法开始试,应该能立刻把安装时间砍半甚至更多!
内容的提问来源于stack exchange,提问作者user63898

