Renovate helm-requirements 管理器全指南:自动更新 Helm v2 requirements.yaml 中的 Chart 依赖
2026/9/13 19:15:57 网站建设 项目流程

Renovate helm-requirements 管理器全指南:自动更新 Helm v2 requirements.yaml 中的 Chart 依赖

【免费下载链接】renovateHome of the Renovate CLI: Cross-platform Dependency Automation by Mend.io项目地址: https://gitcode.com/GitHub_Trending/re/renovate

helm-requirements是 Renovate 内置的依赖管理器(Manager),专门用于解析 Helm v2 时代的requirements.yaml文件,自动发现并更新其中的 Chart 依赖版本。本文基于该管理器在仓库中的实现与默认配置,系统讲解其依赖提取原理、仓库别名(registryAliases)解析机制、各类跳过规则,以及如何为私有 Helm 仓库配置凭据,帮助你在实际仓库中开箱即用地维护 Helm Chart 依赖。

helm-requirements 管理器是什么

在 Renovate 的模块体系中,Manager 负责“提取依赖”。helm-requirements管理器针对 Helm v2 的 Chart 依赖清单文件requirements.yaml(Helm v3 则使用Chart.yaml,由helmv3管理器负责)。其模块元信息定义在 lib/modules/manager/helm-requirements/index.ts 中:

  • displayNameHelm v2 Chart Dependencies,即该管理器定位为 Helm v2 的 Chart 依赖管理;
  • categories['helm', 'kubernetes'],归属 Helm 与 Kubernetes 生态;
  • supportedDatasources:仅支持helm数据源(HelmDatasource),所有依赖都会通过 Helm Chart 仓库的index.yaml进行版本查询;
  • managerFilePatterns/(^|/)requirements\.ya?ml$/,默认匹配任意目录下名为requirements.yamlrequirements.yml的文件。

因此,只要仓库中存在requirements.yaml,Renovate 就会自动启用该管理器进行扫描,无需额外配置即可开始提取依赖。

默认 registryAliases:stable仓库别名

helm-requirements管理器在defaultConfig中定义了一个默认的仓库别名(registryAlias):

{ "registryAliases": { "stable": "https://charts.helm.sh/stable" } }

在 Helm v2 时代,requirements.yaml的依赖条目通过repository字段指定 Chart 来源。很多存量 Chart 会使用@stable这类以@开头的别名写法(对应 Helm 客户端中helm repo add添加的命名仓库),而非直接书写完整 URL。Renovate 需要知道这些别名背后的真实地址,才能去对应仓库拉取index.yaml做版本查询。上述默认配置即把stable别名映射到官方 stable 仓库https://charts.helm.sh/stable

如果项目中的requirements.yaml使用了其他仓库别名(例如自建的 ChartMuseum、公司内网仓库别名),则必须在 Renovate 配置中显式补充registryAliases对象。注意:别名对应的值必须是格式合法的 URI(properly formatted URIs),例如https://charts.example.com,否则 Renovate 无法解析该依赖的来源仓库。

一个完整的配置示例:

{ "registryAliases": { "stable": "https://charts.helm.sh/stable", "internal": "https://charts.company.com" } }

别名解析的源码细节

在 lib/modules/manager/helm-requirements/extract.ts 中可以看到别名解析的实际逻辑。当某个依赖的repository字段以@alias:开头时,Renovate 会去掉前缀,得到别名的名字,然后在配置的registryAliases中查找:

  • 命中别名:将该依赖的registryUrls替换为别名对应的真实 URL,继续正常提取;
  • 未命中别名:将该依赖标记为skipReason: 'placeholder-url'(占位符 URL,无法查询版本)。

这里需要特别说明两种前缀的差异:

  • @name:去掉首字符@slice(1)),对应 Helm v2 中形如repository: @stable的写法;
  • alias:name:去掉前 6 个字符alias:slice(6)),对应形如repository: alias:internal的写法。

两者最终都落在registryAliases的同一套映射表上,因此只要你配置的别名键名正确,两种写法都能被解析。extract.spec.ts中的测试用例resolves aliased registry urls验证了这两种前缀均可被正确解析为真实的registryUrls(参见 lib/modules/manager/helm-requirements/extract.spec.ts)。

requirements.yaml 的提取逻辑

提取入口是extractPackageFile()函数,其工作流程如下(对应 lib/modules/manager/helm-requirements/extract.ts):

  1. 使用parseSingleYaml()将文件内容解析为 YAML 文档;若解析失败,记录 debug 日志并返回null(该文件不产生任何依赖);
  2. 检查文档中是否存在dependencies数组;若不存在,返回null
  3. 遍历dependencies数组中的每个条目,提取name(依赖名)、version(当前版本)与repository(仓库地址);
  4. 对每个条目做字段校验与仓库解析,生成PackageDependency对象;
  5. 最终返回{ deps, datasource: 'helm' },将整组依赖统一交给helm数据源处理。

其中version字段还做了类型兼容处理:如果 YAML 中版本号写成了数字(例如version: 0.9),会被转换为字符串"0.9",确保后续版本比较逻辑拿到的是字符串类型(测试用例ensure that currentValue is string专门验证了这一行为)。

一个被正常提取的requirements.yaml示例如下:

dependencies: - name: redis version: 0.9.0 repository: https://charts.helm.sh/stable/ - name: postgresql version: 0.8.1 repository: https://charts.helm.sh/stable/

提取后产生的依赖对象为:

[ { "depName": "redis", "currentValue": "0.9.0", "registryUrls": ["https://charts.helm.sh/stable/"] }, { "depName": "postgresql", "currentValue": "0.8.1", "registryUrls": ["https://charts.helm.sh/stable/"] } ]

跳过规则:什么样的依赖不会被更新

并不是requirements.yaml中列出的每个条目都会被更新。extract.ts会对每个依赖做严格校验,不符合条件的条目会被标记skipReason,并在日志与 Dependency Dashboard 中说明原因。下表汇总了全部跳过场景(均可在 lib/modules/manager/helm-requirements/extract.spec.ts 的测试用例中找到对应验证):

skipReason触发条件说明
invalid-name缺少name字段无法确定依赖名,无法发起查询
invalid-version缺少version字段没有当前版本,无法判断升级方向
no-repository缺少repository字段不知道 Chart 来源仓库
placeholder-urlrepository@/alias:开头且别名未在registryAliases中配置别名无法解析为真实 URI
invalid-urlrepository无法被解析为合法 URL例如写了无法识别的字符串
local-dependencyrepository协议为file:本地路径依赖无法远程查询版本

其中invalid-urllocal-dependency的判定位于else分支(extract.ts):Renovate 使用parseUrl()校验仓库地址,若url.protocol === 'file:'则视为本地依赖。这些规则保证了只有“来源明确、可远程查询”的依赖才会进入版本比对环节,避免对无效条目发起无意义的网络请求。

值得注意的是,跳过是逐条独立的:同一份文件中某个依赖无效,不会影响其他依赖的正常提取。测试用例skips only invalid dependences展示了同一文件里四条依赖各自得到不同skipReason或正常提取的结果。

底层数据源:HelmDatasource 如何查询版本

提取出的依赖最终交给helm数据源(HelmDatasource)做版本查询。其核心逻辑在 lib/modules/datasource/helm/index.ts 中:

  • 数据源会访问 Chart 仓库根路径下的index.yaml,从中按 Chart 名称查找版本列表(getReleases()读取repositoryData[packageName]);
  • getRepositoryData()对同一仓库的index.yaml结果做了缓存(以仓库地址为 key),避免重复拉取;
  • 仓库地址默认会被补上尾部斜杠(ensureTrailingSlash)后再拼接index.yaml

另外,该数据源支持s3://协议的仓库地址,即 Chart 存放在 Amazon S3(或 S3 兼容后端)的场景,Renovate 会通过 AWS SDK 签名请求读取index.yaml(详见 lib/modules/datasource/helm/readme.md)。这意味着requirements.yaml中形如下面的依赖也可以被正常解析:

dependencies: - name: my-chart version: 1.0.0 repository: s3://my-bucket/charts

S3 仓库的凭据可通过两种方式提供:设置环境变量走 AWS 默认凭据链,或在hostRules中配置hostType: "helm"matchHost指向 bucket 名、username为 Access Key ID、password为 Secret Access Key。

自定义 versioning

默认情况下,helm-requirements提取的依赖使用helm版本方案(lib/modules/versioning/helm/index.ts),该方案基于 npm/SemVer 版本规则实现(...npm),支持范围(range)表达式以及bumpwidenreplace等范围更新策略。对绝大多数 SemVer 风格的 Chart 版本,开箱即用即可正确判断 major/minor/patch。

如果某些依赖的版本号并不遵循 SemVer(例如使用了日期版本、或带有自定义前缀),可以通过 Renovate 的packageRules为特定依赖覆盖版本方案。完整的 versioning 机制说明见 docs/usage/modules/versioning/index.md,一个典型示例是使用正则自定义版本方案:

{ "packageRules": [ { "matchManagers": ["helm-requirements"], "matchPackageNames": ["foo/bar"], "versioning": "regex:^(?<compatibility>.*)-v?(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)?$" } ] }

私有 Helm 仓库的凭据配置

如果你的 Chart 存放在私有 Helm 仓库(如自建的 ChartMuseum),则需要为helm数据源配置访问凭据。Renovate 的版本查询全部通过自身发起的 HTTP(S) 请求完成,凭据通过hostRules提供。仓库文档指向的私有包支持说明位于 docs/usage/getting-started/private-packages.md,其中 Helm 的推荐配置如下(放在自托管全局配置config.js中):

module.exports = { hostRules: [ { matchHost: 'your.host.io', hostType: 'helm', username: '<your-username>', password: process.env.SELF_HOSTED_HELM_CHARTS_PASSWORD, }, ], };

几点实践建议:

  • hostTypehelm,与helm-requirements管理器使用的数据源 ID 保持一致;
  • 凭据优先通过环境变量注入(如上面的process.env.SELF_HOSTED_HELM_CHARTS_PASSWORD),避免把明文密码写死在配置文件中;
  • 如果只需要对单个仓库配置凭据,也可以把上述hostRules写进该仓库的renovate.json
  • S3 仓库的凭据同样复用hostRuleshostType: "helm"),这是数据源实现中通过hostRules.find()查找的(参见 lib/modules/datasource/helm/index.ts)。

与 helmv3 管理器的区别

仓库中还提供了针对 Helm v3 的helmv3管理器(lib/modules/manager/helmv3/index.ts),两者定位互补:

维度helm-requirements(Helm v2)helmv3(Helm v3)
目标文件requirements.yaml/requirements.ymlChart.yaml
数据源helmhelmdocker
锁文件Chart.lock(支持锁文件维护)
默认registryAliasesstablehttps://charts.helm.sh/stable相同

两者都默认把stable别名映射到官方 stable 仓库,且commitMessageTopic均为helm chart {{depName}}。如果你的仓库同时存在两类文件,Renovate 会自动分别用对应的管理器处理。

相关参考

  • 管理器入口与默认配置:lib/modules/manager/helm-requirements/index.ts
  • 依赖提取实现:lib/modules/manager/helm-requirements/extract.ts
  • 提取逻辑测试:lib/modules/manager/helm-requirements/extract.spec.ts
  • Helm 数据源说明:lib/modules/datasource/helm/readme.md
  • 版本方案总览:docs/usage/modules/versioning/index.md
  • 私有包与凭据配置:docs/usage/getting-started/private-packages.md

【免费下载链接】renovateHome of the Renovate CLI: Cross-platform Dependency Automation by Mend.io项目地址: https://gitcode.com/GitHub_Trending/re/renovate

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询