GitLab CI报错:bundle无法找到本地已安装的指定gem
故障原因分析
核心问题是镜像构建时安装的gem版本与测试阶段代码要求的版本不匹配,具体细节如下:
1. 镜像构建未锁定依赖版本
镜像构建日志显示安装的是较新的gem版本:
+ bundle install Fetching gem metadata from https://rubygems.org/............ Resolving dependencies... [... stuff removed] Installing passenger 6.0.15 with native extensions Fetching rack-protection 3.0.2 Installing rack-protection 3.0.2 Fetching sinatra 3.0.2 Installing sinatra 3.0.2 Fetching sinatra-contrib 3.0.2 Installing sinatra-contrib 3.0.2 Bundle complete! 6 Gemfile dependencies, 16 gems now installed.
但测试阶段报错要求的是旧版本:
/usr/local/bundle/gems/bundler-2.3.23/lib/bundler/definition.rb:508:in `materialize': Could not find passenger-6.0.14, sinatra-2.2.1, sinatra-contrib-2.2.1, haml-5.2.2, mustermann-1.1.2, rack-protection-2.2.1, tilt-2.0.10 in locally installed gems (Bundler::GemNotFound)
这说明构建backoffice image时,你没有将项目的Gemfile.lock文件复制到镜像中,仅执行了bundle install。如果Gemfile里没有指定严格的版本约束(比如只写gem 'sinatra'而非gem 'sinatra', '2.2.1'),Bundler会自动拉取RubyGems上的最新兼容版本,导致镜像里的gem版本随时间推移自动更新。
2. 测试阶段依赖旧版本锁定文件
测试任务运行时,使用的是代码仓库中留存的旧版Gemfile.lock——该文件是几周前生成的,锁定了当时的gem版本。当Bundler根据这个旧锁文件检查镜像中的gem时,发现版本完全不匹配,因此抛出Bundler::GemNotFound错误。
验证建议
你可以通过以下操作确认问题:
- 查看当前代码仓库内的
Gemfile.lock,确认其中的gem版本是否与测试报错的版本一致 - 检查镜像构建的CI步骤,确认是否遗漏了将
Gemfile.lock复制到镜像中的操作
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

