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

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前增加如下步骤:
    sh 'bundle config mirror.https://rubygems.org https://gems.ruby-china.com'
    
    该配置无需修改代码库中的Gemfile,灵活度更高。
  • 强制优先使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:15:04