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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:51:10