Renovate多allowedVersions规则叠加问题:如何让两规则同时生效?
问题与解决方案
背景与问题
公司预设仓库company-preset-repo的default.json中有一条规则,用于排除版本含.redhat-的Maven依赖:
{ "matchManagers": ["maven"], "matchPackageNames": [ "commons-io:commons-io", "org.apache.commons:commons-lang3", "org.apache.httpcomponents:httpclient", "com.cronutils:cron-utils", "com.jayway.jsonpath:json-path", "com.thoughtworks.xstream:xstream", "javax.xml.bind:jaxb-api", "net.sf.jopt-simple:jopt-simple", "org.jsoup:jsoup", "org.yaml:snakeyaml" ], "allowedVersions": "!/\\.redhat-/" }
团队自定义的Renovate预设default.json继承了上述预设,同时添加规则阻止commons-io等依赖被替换为20030203.000550这类格式的版本:
{ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "description": [ "Default preset for my team" ], "gitAuthor": "some@email", "extends": [ "local>company-preset-repo" ], "packageRules": [ { "matchPackagePatterns": [ "^org.apache.commons:", "^commons-beanutils:", "^commons-cli:", "^commons-collections:", "^commons-io:" ], "allowedVersions": "/^\\d{1,2}\\.\\d{1,2}(\\..*)?$/" } ] }
当前遇到的问题:Renovate推送了commons-io:commons-io版本2.11.0.redhat-00001的更新请求,需要让两条规则同时生效——仅当版本不含.redhat-且不是20030203.000550这类格式时,才允许更新。
解决方案
可以实现,核心是让两条allowedVersions规则逻辑与(同时满足),以下是两种可行方案:
方案一:合并规则条件
修改团队预设的packageRules,针对重叠的依赖单独创建规则,将两个条件合并到同一个allowedVersions表达式中:
{ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "description": [ "Default preset for my team" ], "gitAuthor": "some@email", "extends": [ "local>company-preset-repo" ], "packageRules": [ // 保留原有针对其他commons类依赖的规则 { "matchPackagePatterns": [ "^org.apache.commons:", "^commons-beanutils:", "^commons-cli:", "^commons-collections:" ], "allowedVersions": "/^\\d{1,2}\\.\\d{1,2}(\\..*)?$/" }, // 针对commons-io单独设置合并后的规则 { "matchPackageNames": ["commons-io:commons-io"], "allowedVersions": "/^\\d{1,2}\\.\\d{1,2}(\\..*)?$/ && !/\\.redhat-/" } ] }
通过&&组合两个正则条件,要求版本同时符合:
- 遵循
x.y(.*)的格式(排除无小版本号的20030203.000550类版本) - 不包含
.redhat-字符串
方案二:使用数组形式组合条件
利用Renovate的数组式allowedVersions特性,数组内的所有条件需同时满足:
{ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "description": [ "Default preset for my team" ], "gitAuthor": "some@email", "extends": [ "local>company-preset-repo" ], "packageRules": [ { "matchPackagePatterns": [ "^org.apache.commons:", "^commons-beanutils:", "^commons-cli:", "^commons-collections:", "^commons-io:" ], // 数组内的条件需同时满足 "allowedVersions": [ "/^\\d{1,2}\\.\\d{1,2}(\\..*)?$/", "!/\\.redhat-/" ] } ] }
验证效果
修改后,Renovate会自动过滤两类版本:
- 格式为
20030203.000550的非标准版本 - 包含
.redhat-后缀的版本
仅同时满足格式合法且不含.redhat-的版本会被推送更新。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

