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

如何在Jenkins中阻止与上次成功提交相同的重复构建?

实现方案:相同提交时阻止Jenkins构建

当然可以实现这个需求,核心就是在Jenkinsfile里对比当前构建和上次成功构建的提交ID,一致就终止构建。下面是具体的配置代码和细节说明:

完整Jenkinsfile代码

pipeline {
    agent any
    stages {
        stage('校验提交是否重复') {
            steps {
                script {
                    // 获取当前构建的提交ID
                    def currentCommit = sh(
                        script: 'git rev-parse HEAD',
                        returnStdout: true
                    ).trim()
                    
                    // 获取上次成功构建的提交ID(如果存在)
                    def lastSuccessCommit = null
                    if (currentBuild.previousSuccessfulBuild) {
                        lastSuccessCommit = sh(
                            script: "git rev-parse ${currentBuild.previousSuccessfulBuild.revision}",
                            returnStdout: true
                        ).trim()
                    }
                    
                    // 对比判断,重复则终止构建
                    if (lastSuccessCommit && currentCommit == lastSuccessCommit) {
                        error('当前提交和上次成功构建的提交完全一致,终止本次构建')
                    } else {
                        echo '检测到新提交,继续执行构建流程'
                    }
                }
            }
        }
        // 这里放置你原本的构建阶段
        stage('正式构建') {
            steps {
                echo '执行编译、打包等任务...'
            }
        }
    }
}

关键细节解释

  • currentBuild.previousSuccessfulBuild:Jenkins内置对象,指向最近一次成功完成的构建。如果是项目第一次构建,这个值为null,此时不会触发终止逻辑,允许正常执行。
  • git rev-parse HEAD:通过git命令直接获取当前构建对应的提交哈希,比依赖环境变量更可靠(部分场景下环境变量可能未正确设置)。
  • error():抛出该错误会直接终止构建,并标记构建为失败状态,完全实现“阻止构建执行”的需求。
  • 手动构建也生效:该校验阶段会在所有构建触发方式下执行,包括手动点击“立即构建”,满足你对手动构建的限制要求。

简化写法(可选)

如果你的流水线是多分支类型,Jenkins会自动设置env.GIT_COMMIT环境变量,直接使用它即可获取当前提交ID,代码可简化为:

def currentCommit = env.GIT_COMMIT.trim()

内容的提问来源于stack exchange,提问作者Alexy Pulivelil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:17:00