如何让Jenkins流水线的Post操作仅在指定子目录有变更时执行
如何让Jenkins流水线的Post操作仅在指定子目录有变更时执行
嘿,我之前也碰到过一模一样的问题!Jenkins的post块默认会在整个流水线结束后无条件执行,不管前面的stage是不是因为目录变更才触发的。不过我们可以通过提前判断变更目录的方式,给post操作加上条件限制,具体做法如下:
解决方案思路
先在流水线里定义一个布尔变量,用来标记本次构建是否涉及目标子目录的变更。然后在post块里通过这个变量来控制是否发送Slack通知。
修改后的完整流水线代码
pipeline { agent any // 定义变量存储是否有目标子目录的变更 def hasSubdirChanges = false stages { // 新增一个检查变更的stage,也可以把这段逻辑放在agent后的script块里 stage('Check Subdirectory Changes') { steps { script { // 遍历所有变更集,检查是否有文件路径属于subdirectory目录 hasSubdirChanges = currentBuild.changeSets.any { changeSet -> changeSet.items.any { item -> item.paths.any { path -> path.path.startsWith('subdirectory/') } } } } } } stage('Building') { when { changeset "subdirectory/*"} steps { // 你的构建步骤 } } stage('Deploying to Dev') { when { changeset "subdirectory/*"} steps { // 你的部署步骤 } } } post { success { script { // 只有当目标子目录有变更时才发送成功通知 if (hasSubdirChanges) { slackSend channel: '#my-notif-channel', color: 'good', message: "Yay ! 子目录subdirectory的变更已成功构建并部署!" } } } failure { script { // 只有当目标子目录有变更时才发送失败通知 if (hasSubdirChanges) { slackSend channel: '#my-notif-channel', color: 'danger', message: "Nay ! 子目录subdirectory的变更构建或部署失败了!" } } } } }
代码解释
- 变量定义:我们先声明了
hasSubdirChanges变量,初始值为false,用来记录是否有目标目录的变更。 - 检查变更:在新增的
Check Subdirectory Changes阶段,用Groovy代码遍历本次构建的所有变更集,逐一检查每个变更的文件路径是否以subdirectory/开头,如果有任何一个符合条件,就把hasSubdirChanges设为true。 - Post块条件控制:在
post的success和failure分支里,我们用script块包裹条件判断,只有当hasSubdirChanges为true时,才会执行slackSend发送通知。
这样修改后,不管是Webhook触发还是手动触发的构建,只要目标子目录没有变更,就不会发送Slack通知啦!
备注:内容来源于stack exchange,提问作者SBO
相关产品推荐
相关产品推荐

