AWS EC2实例上Jenkins Pipeline运行bundle install异常缓慢问题求助
问题原因分析
- 实例资源不足:如果使用AWS免费 tier的低配置实例(如t2.micro),CPU、内存配额不足以支撑带原生扩展的gem(如nokogiri、pg等)的编译操作,资源耗尽后触发系统OOM,表现为进程无响应卡死。
- 网络链路异常:AWS默认网络到官方RubyGems源的链路延迟高、丢包率高,或系统优先走IPv6连接但实例未配置可用IPv6,导致连接反复超时重试,拉取gem包速度极慢。
- Docker容器资源受限:Pipeline使用Docker作为执行代理时,默认容器未分配足够的CPU、内存配额,编译操作资源不足触发卡顿。
- 无依赖缓存机制:每次Pipeline执行都会重新拉取全部gem、重新编译,无缓存复用机制拉长执行时间,也会放大网络、资源问题的影响。
- 特定gem兼容问题:部分gem版本与你使用的
ruby:2.6.6镜像存在兼容问题,编译阶段进入死循环无法结束。
解决方案
- 升级EC2实例规格:优先将实例调整至t3.small及以上配置,同时可手动添加1-2G的交换分区,避免编译阶段内存不足。手动执行任务时可通过
top、dstat命令监控资源占用,确认是否存在资源瓶颈。 - 替换RubyGems镜像源:无需将源改成不安全的http协议,直接在Pipeline中配置国内镜像源即可,在Build阶段的bundle install前增加如下步骤:
该配置无需修改代码库中的Gemfile,灵活度更高。sh 'bundle config mirror.https://rubygems.org https://gems.ruby-china.com' - 强制优先使用IPv4:在Pipeline的sh步骤中添加如下配置,避免IPv6连接超时问题:
sh 'echo "precedence ::ffff:0:0/96 100" >> /etc/gai.conf' - 调整Docker资源配额:修改Pipeline的Docker agent配置,为容器分配足够的编译资源,参考配置如下:
其中agent { docker { image 'ruby:2.6.6' args '--cpus 2 --memory 2g -v bundle_cache:/usr/local/bundle' } }-v bundle_cache:/usr/local/bundle参数会创建Docker volume缓存已安装的gem,下次执行无需重复下载编译,大幅缩短执行时间。 - 优化bundle install参数:调整安装命令增加重试机制、自动适配CPU核心数:
新增的sh 'bundle install --jobs $(nproc) --retry 3 --verbose'--verbose参数可以输出详细安装日志,方便定位具体卡在哪个gem的安装步骤,针对性处理兼容问题。 - 预编译问题gem:如果定位到是某一个原生gem编译卡顿,可以基于
ruby:2.6.6制作自定义镜像,提前预装对应gem的编译依赖和稳定版本,直接使用自定义镜像作为Pipeline的执行环境。
内容的提问来源于stack exchange,提问作者josegp
相关产品推荐
相关产品推荐

