You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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的变更构建或部署失败了!"
                }
            }
        }
    }
}

代码解释

  1. 变量定义:我们先声明了hasSubdirChanges变量,初始值为false,用来记录是否有目标目录的变更。
  2. 检查变更:在新增的Check Subdirectory Changes阶段,用Groovy代码遍历本次构建的所有变更集,逐一检查每个变更的文件路径是否以subdirectory/开头,如果有任何一个符合条件,就把hasSubdirChanges设为true。
  3. Post块条件控制:在post的success和failure分支里,我们用script块包裹条件判断,只有当hasSubdirChanges为true时,才会执行slackSend发送通知。

这样修改后,不管是Webhook触发还是手动触发的构建,只要目标子目录没有变更,就不会发送Slack通知啦!

备注:内容来源于stack exchange,提问作者SBO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 13:00:34