
Renovate 对 Ruby Bundler 的自动化依赖更新支持从 Gemfile 提取到 Gemfile.lock 锁文件更新的完整指南【免费下载链接】renovateHome of the Renovate CLI: Cross-platform Dependency Automation by Mend.io项目地址: https://gitcode.com/GitHub_Trending/re/renovateRenovateMend.io 开源的跨平台依赖自动化工具内置了bundlermanager用于扫描仓库中的 Gemfile 并自动升级 Ruby 依赖同时在一个 commit 中同步更新Gemfile与Gemfile.lock。本文以 docs/usage/ruby.md 为核心结合 lib/modules/manager/bundler 的源码实现与测试夹具系统讲解其工作原理、锁文件更新策略、私有源认证配置以及常见注意事项帮助你准确配置 Renovate 托管 Ruby 项目的依赖升级。Bundler 支持概述Renovate 支持升级 Bundler 的 Gemfile 及配套的Gemfile.lock文件。从 lib/modules/manager/bundler/index.ts 可以看到该 manager 的注册信息默认文件匹配模式为/(^|/)Gemfile$/即只在仓库根目录及各子目录中匹配名为Gemfile的文件不匹配Gemfile.lock后者作为锁文件被单独处理声明锁文件名为[Gemfile.lock]并开启supportsLockFileMaintenance锁文件维护支持默认版本方案versioning为 Ruby 版本方案rubyVersioning.id支持的数据源为 RubygemsDatasource 与 RubyVersionDatasource分类为ruby。也就是说只要你的仓库里有 GemfileRenovate 的bundlermanager 就会自动接管它的依赖提取与更新。工作原理Renovate 对 Bundler 项目的依赖更新遵循以下流程扫描仓库在仓库中查找所有Gemfile文件匹配模式见上文managerFilePatterns。提取依赖从 Gemfile 中解析出已有依赖及其版本约束。这一步由 lib/modules/manager/bundler/extract.ts 的extractPackageFile完成它通过正则逐行解析gem声明、ruby版本声明、source源、group/platforms/if代码块以及git:/github:/path:等特殊来源的依赖。解析新版本Renovate 在 Rubygems.org或配置的其他源上解析该依赖检查是否存在满足约束的新版本。数据源实现位于 lib/modules/datasource/rubygems。生成 PR创建一个 PR在同一个 commit中同时更新Gemfile和Gemfile.lock。其中第 4 步的锁文件更新由 lib/modules/manager/bundler/artifacts.ts 的updateArtifacts负责它根据更新类型构造对应的bundler lock命令在沙箱中执行然后把新的Gemfile.lock作为 artifact 写入 PR。该函数支持递归重试默认 10 层当bundler lock输出中出现“依赖 X was resolved to”且该依赖不在本次更新名单内时会自动把新解析出的依赖加入更新集合重新执行见getResolvedPackages与recursionLimit逻辑。锁文件与版本约束行为Warnings原文档特别强调了两类需要留意的行为这两点直接决定你应选择怎样的rangeStrategy。使用update-lockfile时更新所有 gem当配置rangeStrategy: update-lockfile时Gemfile 中列出的所有gem 都会被更新即使它们没有显式版本约束。这是因为该策略的目标只是刷新锁文件而bundler lock --update会重新解析整个依赖图。从 artifacts.ts 可以看到当config.isLockFileMaintenance为 true 时执行bundler lock --update而在常规更新路径中也会按 patch/minor/major 分组构造bundler lock --patch --update deps、bundler lock --minor --update deps、bundler lock --update deps命令。使用其他 rangeStrategy 时无版本约束的依赖不更新使用其他rangeStrategy选项时Renovate 不会更新没有版本约束的依赖。例如gem some-gem, ~ 1.2.3当存在满足~ 1.2.3的新版本时some-gem会被更新但gem some-gem不会更新。原因在于 extract.ts 的解析逻辑gemMatchRegex只有在gem声明后带有,与版本字符串时才会捕获currentValue没有版本约束的 gem 不会生成currentValue因而无法参与版本比较与升级决策。如果你希望始终获取最新可用版本可以显式放宽约束例如gem some-gem, 0锁文件解析与已锁版本提取阶段还会读取锁文件。getLockFilePathcommon.ts会优先使用Gemfile 路径.lock如子目录下的Gemfile.lock否则回退到根目录的Gemfile.lock。locked-version.ts 的extractLockFileEntries负责解析锁文件中的GEM段、去平台后缀如-x86_64-linux并记录每个 gem 的锁定版本供 Renovate 判断依赖是否已是最新。updateLockedDependencyupdate-locked.ts则用于检查锁文件中目标依赖是否已经更新到新版本返回already-updated/unsupported/update-failed。支持的 Gemfile 语法与解析范围从源码正则与测试夹具fixtures可以看出Renovate 的bundlermanager 能解析以下常见写法全局source https://rubygems.org与变量形式的source :rubygemssource ... do ... end块内按独立源解析的 gem见 Gemfile.sourceBlock此时registryUrls会指向块内声明的源group :development, :test do ... end分组分组成员会被标记对应的depTypes见 Gemfile.rails 与 Gemfile.sourceGroupplatforms :ruby do ... end、if ENV[...]条件块ruby ~ 1.5.3形式的 Ruby 版本声明会被提取为depName: ruby的依赖使用 RubyVersionDatasourcegem x, git: https://..., ref: ...、github: owner/repo, branch: ...等 git 来源依赖转为 GitRefsDatasource提取currentDigest/currentValuegem x, path: ...路径依赖标记为skipReason: internal-package不参与更新Gemfile 中的变量赋值如RUBY_VERSION 3.2.2会被记录并用于解析变量引用的 source。仓库中的 Gemfile.mastodon、Gemfile.webpacker 等夹具覆盖了这些组合场景可作为实际 Gemfile 兼容性的参考样例。私有 RubyGems 源认证hostRules如果你的 Gemfile 依赖私有 registry 中的 gem且该私有源与 Renovate 所在平台GitHub/GitLab 等不在同一主机上需要通过hostRules为 Bundler 配置认证详见 lib/modules/manager/bundler/readme.md{ hostRules: [ { matchHost: private-registry.company.com, hostType: rubygems, token: abc123 } ] }关键注意点hostType为必填字段必须设置为rubygems如果同一个 registry 同时服务多种包类型可能需要配置多条hostRules除了token也可以使用usernamepassword组合。从实现看host-rules.ts 会筛选出带凭据的 rubygems 规则artifacts.ts 的buildBundleHostVariable会把这些凭据转换成 Bundler 可识别的环境变量变量名由BUNDLE_前缀加上域名大写化.变为__、-变为___构成例如private-registry.company.com对应BUNDLE_PRIVATE___REGISTRY__COMPANY__COM值为username:password或 token 本身。这样在执行bundler lock时Bundler 就会用该凭据访问私有源。此外执行时还会设置GEM_HOME指向 Renovate 的缓存目录并将 ruby/bundler 的工具版本约束写入toolConstraints见getRubyConstraint、getBundlerConstraint它们会依次读取配置的constraints、Gemfile 中的ruby声明、.ruby-version/.tool-versions以及锁文件中的BUNDLED WITH。为避免把明文密钥提交到仓库建议自托管场景把hostRules放在自托管配置文件self-hosted config中而不是仓库配置文件里使用 Mend Renovate App 场景使用encrypted配置选项加密敏感值。注意从源码看当锁文件更新因缺少凭据失败时如输出包含 Please supply credentials for this source 或 Authentication is requiredRenovate 会跳过该分支并缓存错误BUNDLER_INVALID_CREDENTIALS以避免生成无法应用的 PR——因此为私有源配置正确的hostRules是保证 PR 可用的前提。锁文件维护与依赖分组更新bundlermanager 支持锁文件维护lock file maintenance。在updateArtifacts中锁文件维护模式下执行bundler lock --update整体刷新锁文件常规依赖更新按更新类型分组执行patch 更新bundler lock --patch --update depsminor 更新bundler lock --minor --update depsmajor 更新bundler lock --update deps若postUpdateOptions中启用了bundlerConservative上述命令会追加--conservative参数尽量缩小更新范围若bundler本身在更新名单中会先执行bundler lock --update --bundler若ruby版本发生变化则执行bundler lock重新解析。这些细节说明 Renovate 会把更新范围精细地传达给 Bundler尽量只影响目标依赖而非无差别刷新整个依赖图。启用 Renovate托管 App 方式在 GitHub 上安装 Renovate App 并授权对应仓库即可自动启用安装后默认会对匹配的 Gemfile 生效。自托管方式克隆 Renovate 仓库后按 docs/usage/getting-started/installing-onboarding.md 与 docs/usage/self-hosted-experimental.md 配置运行bundlermanager 已内置在默认配置中无需额外启用。实践建议小结如果你的 Gemfile 中存在大量无版本约束的 gem且希望它们都保持最新请选用rangeStrategy: update-lockfile或为这些 gem 显式写出版本下限如 0。依赖私有 RubyGems 源时务必配置hostType: rubygems的hostRules并将凭据放在自托管配置或使用encrypted加密。涉及git:/github:引用的 gemRenovate 会按 Git 引用branch/tag/ref跟踪更新path:本地路径依赖会被跳过。锁文件更新依赖仓库环境中的ruby与bundler可执行文件Renovate 会根据约束自动准备对应版本的工具因此确保锁文件中的BUNDLED WITH与实际 bundler 版本一致有助于稳定生成 PR。更完整的配置选项说明可参考 docs/usage/configuration-options.md 与 docs/usage/configuration-templates.mdbundlermanager 的全部实现与测试位于 lib/modules/manager/bundler可作为深入理解其解析与更新逻辑的第一手资料。【免费下载链接】renovateHome of the Renovate CLI: Cross-platform Dependency Automation by Mend.io项目地址: https://gitcode.com/GitHub_Trending/re/renovate创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考