Jenkins 视图如何用正则表达式只显示匹配的任务,以及如何排除特定前缀?
【免费下载链接】jenkinsJenkins automation server项目地址: https://gitcode.com/GitHub_Trending/je/jenkins
当一个 Jenkins 实例里任务(job)数量很多时,手动一个个勾选任务加入视图并不现实。Jenkins 的 List 视图(ListView)提供了一个"使用正则表达式向视图中包含任务"的选项:配置后,正则表达式会被应用到所有任务名上,只有匹配的任务才会显示在该视图中。如果还想反过来排除某类前缀的任务(例如所有test*开头的任务),Jenkins 的帮助文档给出了基于负向前瞻(negative lookahead)的写法。本文基于仓库中的帮助文档与ListView源码,说明这条配置路径的具体做法与验证方式。
在哪里配置:视图的 Jobs 区域
List 视图的配置页面由 configure-entries.jelly 渲染,其中 Jobs 区域包含:
- Recurse in subfolders复选框:控制是否递归包含子文件夹(ItemGroup)内的任务;
- 一个名为
useincluderegex的可选区块,标题为"Use a regular expression to include jobs into the view",勾选后展开一个"Regular expression"文本框(表单字段名includeRegex)。
这个文本框右侧的帮助链接指向 includeregex.html,其正文说明了正则的语义和排除写法:
If configured, the regular expression will be applied to all job names. Those that match the regular expression will be shown in this view. Tip: to exclude certain patterns, use negative lookahead. For example, to display all jobs not namedtest something, use:
(?!test.*).*
也就是说:只要启用了该选项,表达式就作用于所有任务名,匹配者进入视图;这是"只显示匹配任务"的正向用法。
正则如何匹配任务名
查看 ListView.java 的实现,有几个直接影响写法的事实:
- 整名匹配:正则通过
Pattern.compile(includeRegex)编译(setIncludeRegex),随后用includePattern.matcher(itemName).matches()判断,即任务名必须从头到尾完整匹配表达式,而不是部分包含。因此"只显示以build-开头的任务"应写成build-.*,而不是build-。 - 与手动勾选的任务是并集:
getItems()先收集视图中显式保存的任务名(jobNames),再把正则匹配到的任务追加进来,最后用LinkedHashSet去重。所以正则不会"替换"已勾选的任务,而是额外纳入匹配项。 - Recurse 影响匹配范围:勾选 Recurse in subfolders 时,正则在子文件夹的任务上按相对于父级组的名字(
getRelativeNameFrom)匹配;不勾选时只在直接子级上匹配。如果你的任务放在文件夹里,需要确认这项勾选状态是否符合预期。
排除特定前缀:负向前瞻写法
要排除某前缀的任务时,帮助文档给出的文档示例是:显示所有不以test开头的任务,表达式为:
(?!test.*).*这是一个负向前瞻:test.*开头的名字被!(...)排除,其余名字由末尾的.*匹配。如果你的前缀不是test而是例如dev-,按同样结构替换即可写成(?!dev-.*).*——这一推理由文档示例的前瞻结构而来,文档本身只演示了test前缀这一种。
注意该示例来自 Jenkins 帮助文档,展示的是"如何排除"的方法,实际效果取决于你的任务命名。
保存后如何验证
配置是否生效可以从两个层面核对:
- 语法校验:提交表单时,
ListView.DescriptorImpl.doCheckIncludeRegex会再次Pattern.compile你填写的表达式;如果出现PatternSyntaxException,页面会直接显示异常信息作为错误(FormValidation.error(pse.getMessage())),配置不会按无效正则保存。也就是说,非法正则在界面上就会被指出,并能看到 Java 给出的具体报错。 - 视图结果:保存后打开该视图,列表中只应出现满足正则的任务(以及显式勾选的任务)。可以故意写一个过窄的表达式(如只匹配某个确切任务名)来确认"其余任务确实不再出现",再改回目标表达式。
另外,readResolve中有一段旧数据兼容逻辑:如果配置文件中已保存的正则在加载时编译失败,Jenkins 会将其置空并上报到OldDataMonitor,而不是让视图崩溃。若你在"Old data"诊断里看到与视图相关的报告,可先检查该视图的正则是否已被清空。
小结与边界
- 该功能只适用于 List 视图(
ListView),配置入口是其配置页面的 Jobs 区域。 - 表达式必须同时满足:Java
java.util.regex语法 +matches()整名匹配语义。 - 排除前缀用负向前瞻
(?!prefix.*).*;正向包含用普通的prefix.*形式。 - 正则与显式勾选的任务取并集展示,想彻底"只看正则"时,需保证没有额外勾选的任务。
更多背景可参考 ListView.java 中getItems()的完整匹配逻辑,以及测试用例 ListViewTest.java 中setIncludeRegex("p.*")等用法示例。
【免费下载链接】jenkinsJenkins automation server项目地址: https://gitcode.com/GitHub_Trending/je/jenkins
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考