如何在Jenkins Groovy中获取构建触发类型与工作副本状态并跳过无变更自动构建
Jenkins Groovy脚本实现无变更时跳过自动构建
一、判断构建触发类型(手动/自动)
通过currentBuild.getBuildCauses()获取构建触发原因,不同触发类型对应不同的Cause类:
- 手动触发:对应
hudson.model.Cause$UserIdCause - SCM自动触发(如Git提交触发):对应
hudson.scm.SCMTrigger$SCMTriggerCause - 定时自动触发:对应
hudson.triggers.TimerTrigger$TimerTriggerCause
示例函数(Pipeline中使用)
// 判断是否为手动触发 def isManualTrigger() { return currentBuild.buildCauses.any { cause -> cause.toString().contains('UserIdCause') } } // 判断是否为自动触发(SCM/定时) def isAutoTrigger() { return currentBuild.buildCauses.any { cause -> cause.toString().contains('SCMTriggerCause') || cause.toString().contains('TimerTriggerCause') } }
二、检查工作副本变更状态并跳过自动构建
方式1:利用Pipeline内置变更集判断
直接通过currentBuild.changeSets获取本次构建的变更集,结合自动触发条件终止构建:
pipeline { agent any stages { stage('前置检查') { steps { script { def autoTriggered = isAutoTrigger() if (autoTriggered) { // 检查是否有变更 def hasChanges = currentBuild.changeSets.any { cs -> !cs.items.isEmpty() } if (!hasChanges) { echo "⚠️ 无代码变更,跳过自动构建" currentBuild.result = 'ABORTED' error('无变更,终止构建') } } } } } // 后续构建阶段(如编译、测试等) stage('构建') { steps { echo "开始执行构建任务..." // 构建逻辑 } } } }
方式2:手动拉取代码并对比变更
如果需要更精准的变更判断(比如跨分支或特定文件变更),可以手动执行Git命令对比提交:
pipeline { agent any options { skipDefaultCheckout true // 跳过默认拉取,手动控制 } stages { stage('拉取代码与变更检查') { steps { script { // 拉取代码并获取提交信息 def scmVars = checkout scm def prevCommit = scmVars.GIT_PREVIOUS_COMMIT ?: scmVars.GIT_COMMIT // 对比两次提交的差异 def changeFiles = sh( script: "git diff --name-only ${prevCommit} ${scmVars.GIT_COMMIT}", returnStdout: true ).trim() def autoTriggered = isAutoTrigger() if (autoTriggered && changeFiles.isEmpty()) { echo "⚠️ 无代码变更,跳过自动构建" currentBuild.result = 'ABORTED' error('无变更,终止构建') } } } } // 其他构建阶段 } }
Freestyle项目中的实现
如果是Freestyle项目,可添加「Execute system Groovy script」步骤,使用以下脚本:
import hudson.model.Result import hudson.model.Cause import hudson.scm.SCMTrigger def build = Thread.currentThread().executable // 判断是否为SCM自动触发 def isAutoTrigger = build.causes.any { it instanceof SCMTrigger.SCMTriggerCause } if (!isAutoTrigger) return // 检查是否有变更 def hasChanges = build.changeSets.any { !it.items.isEmpty() } if (!hasChanges) { build.setResult(Result.ABORTED) throw new Exception('无代码变更,跳过自动构建') }
内容的提问来源于stack exchange,提问作者Hiep Le Thanh
相关产品推荐
相关产品推荐

