如何用声明式Jenkins Pipeline按提交信息标签跳过指定阶段?
用声明式Jenkins Pipeline实现提交标签触发阶段跳过的需求
当然可以用声明式Pipeline搞定这个需求!之前用changelog指令达不到预期,是因为它的匹配能力有限,没法处理连字符和下划线等价的场景,不过我们可以用when块里的expression结合Groovy代码来实现更灵活的逻辑。
核心思路
- 获取提交信息:通过Jenkins内置的
currentBuild.changeSets获取本次构建的所有提交变更 - 统一字符匹配规则:把提交消息里的连字符
-替换成下划线_,这样#no-unittest和#no_unittest就可以用同一个规则匹配 - 区分大小写检查:直接检查处理后的消息是否包含目标标签(比如
#no_unittest),确保只有完全匹配大小写的标签才会触发跳过 - 多提交场景覆盖:遍历所有提交,只要其中一个提交包含目标标签,就跳过对应阶段
完整的声明式Pipeline代码示例
agent any // 定义辅助函数复用标签检查逻辑 def shouldSkipStage(String targetTag) { // 遍历所有变更集里的提交 for (changeSet in currentBuild.changeSets) { for (entry in changeSet.items) { // 将提交消息中的-替换为_,统一匹配规则 def processedMsg = entry.msg.replace('-', '_') // 检查是否包含目标标签(区分大小写) if (processedMsg.contains(targetTag)) { return true } } } return false } stages { stage('Build') { when { // 提交信息不含#no_build/#no-build时才执行Build阶段 expression { !shouldSkipStage('#no_build') } } steps { sh 'npm build' } } stage('Unittest') { when { branch 'master' // 同时满足:在master分支,且提交信息不含#no_unittest/#no-unittest expression { !shouldSkipStage('#no_unittest') } } steps { sh 'python unittest.py' } } } }
关键细节说明
- 辅助函数复用:
shouldSkipStage函数可以避免重复写遍历和匹配逻辑,后续要加其他跳过标签(比如#no_deploy)直接调用这个函数就行 - 字符等价处理:通过
replace('-', '_')把所有连字符转成下划线,不管提交里写的是-还是_,都能被同一个标签规则匹配 - 严格大小写区分:我们没有做任何大小写转换,所以只有完全匹配的标签(比如
#no_unittest而不是#No_Unittest或#NO_UNITTEST)才会触发跳过,完全符合你的要求 - 多提交兼容:如果一次推送包含多个提交,只要其中任何一个提交带有目标标签,就会跳过对应阶段,覆盖了实际开发中的常见场景
为什么不用changelog指令?
changelog指令的匹配是基于简单字符串或正则,但它无法在匹配前对文本做预处理(比如替换字符),所以没法优雅地处理-和_等价的情况。用expression结合Groovy代码就灵活多了,能实现各种自定义逻辑。
内容的提问来源于stack exchange,提问作者chocho.boss
相关产品推荐
相关产品推荐

