Renovate配置疑问:如何在同一PR更新镜像版本并保留摘要固定?
问题:Renovate配置导致版本更新失效,无法同时保留镜像版本更新与摘要固定
我配置了Renovate,但现在会生成两个PR(摘要更新得等版本合并后才触发)。我的核心需求是更新镜像版本的同时保留镜像摘要固定的安全性,但添加"docker:pinDigests"配置后,版本更新功能直接停了,请问我的配置哪里有问题?
镜像声明示例(Kubernetes)
image: ghcr.io/stirling-tools/s-pdf:0.25.1@sha256:c510d267ad6c2d4062f0b6ead3ce4201a888a07ba1c685359d4ba09a4c48cb26
我的Renovate配置
{ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "labels": ["dependencies", "renovate"], "ignorePaths": [ "Kubernetes/secrets_raw" ], "minimumReleaseAge": "7 days", "extends": [ "config:recommended", "config:base" ], "helm-values": { "fileMatch": [ "\\.ya?ml$" ] }, "kubernetes": { "fileMatch": [ "\\.ya?ml$" ] }, "argocd": { "fileMatch": [ "\\.ya?ml$" ] },"docker": { "fileMatch": [ "Dockerfile", ".*\\.dockerfile$", "Dockerfile.*", "\\.ya?ml$" ] }, "regexManagers": [ { "description": "Process custom dependencies", "fileMatch": [ "\\.ya?ml$" ], "matchStrings": [ "datasource=(?<datasource>\\S+) depName=(?<depName>\\S+)( versioning=(?<versioning>\\S+))?\n.*?\"(?<currentValue>.*)\"\n" ], "datasourceTemplate": "{{#if datasource}}{{{datasource}}}{{else}}github-releases{{/if}}", "versioningTemplate": "{{#if versioning}}{{{versioning}}}{{else}}semver{{/if}}" }, { "fileMatch": [ "\\.ya?ml$" ], "matchStrings": [ "image: (?<depName>[^:\\s]+):(?<currentValue>[^@\\s]+)@sha256:(?<digest>[a-fA-F0-9]+)" ], "datasourceTemplate": "docker", "versioningTemplate": "docker" } ] }
解答
问题根源
- 重复解析冲突:同时启用了
kubernetes内置管理器和自定义regexManagers解析镜像,加上docker:pinDigests后,Renovate的逻辑出现冲突——内置Kubernetes管理器已能处理带摘要的镜像版本更新,自定义正则重复抓取同一镜像,导致优先级混乱,版本更新逻辑被阻断。 docker:pinDigests逻辑冲突:该预设用于自动添加/更新镜像摘要,但多个管理器处理同一依赖时,Renovate无法判断执行版本更新还是仅更新摘要,最终导致版本更新功能失效。
解决方案
1. 移除冲突的自定义正则管理器
删掉regexManagers中专门解析镜像的条目,kubernetes内置管理器已完全支持解析Kubernetes YAML中的带摘要镜像,无需自定义正则重复处理。
2. 正确启用docker:pinDigests
在extends数组中添加"docker:pinDigests",同时调整docker管理器的fileMatch,去掉\\.ya?ml$,避免和kubernetes管理器冲突。
修改后的配置示例
{ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "labels": ["dependencies", "renovate"], "ignorePaths": [ "Kubernetes/secrets_raw" ], "minimumReleaseAge": "7 days", "extends": [ "config:recommended", "config:base", "docker:pinDigests" ], "helm-values": { "fileMatch": [ "\\.ya?ml$" ] }, "kubernetes": { "fileMatch": [ "\\.ya?ml$" ] }, "argocd": { "fileMatch": [ "\\.ya?ml$" ] }, "docker": { "fileMatch": [ "Dockerfile", ".*\\.dockerfile$", "Dockerfile.*" ] }, "regexManagers": [ { "description": "Process custom dependencies", "fileMatch": [ "\\.ya?ml$" ], "matchStrings": [ "datasource=(?<datasource>\\S+) depName=(?<depName>\\S+)( versioning=(?<versioning>\\S+))?\n.*?\"(?<currentValue>.*)\"\n" ], "datasourceTemplate": "{{#if datasource}}{{{datasource}}}{{else}}github-releases{{/if}}", "versioningTemplate": "{{#if versioning}}{{{versioning}}}{{else}}semver{{/if}}" } ] }
效果说明
修改后,Renovate会通过kubernetes管理器直接识别带摘要的镜像,当有新版本发布时,会生成单个PR,同时更新镜像的版本标签和对应的最新摘要,既满足版本更新需求,又保留了摘要固定的安全性,不会再生成两个分开的PR。
内容的提问来源于stack exchange,提问作者user8802521
相关产品推荐
相关产品推荐

