本文目录导读:

- 使用
currentBuild对象(推荐,适用于任何 Pipeline) - 使用
cause变量(系统 Groovy 脚本) - 在 Pipeline 中使用环境变量(简单但有限)
- 处理常用的触发原因类型
- 总结建议
在Jenkins脚本(无论是Pipeline脚本还是系统脚本)中,获取构建触发原因的方法有很多种,具体取决于你使用的脚本类型(Declarative Pipeline、Scripted Pipeline 或 Groovy脚本)。
以下是几种常见的获取方式:
使用 currentBuild 对象(推荐,适用于任何 Pipeline)
这是最直接、最常用的方法。currentBuild 是一个全局变量,包含了当前构建的几乎所有信息。
// Declarative Pipeline 或 Scripted Pipeline 中均可使用
pipeline {
agent any
stages {
stage('Check Trigger Cause') {
steps {
script {
// 获取触发原因对象
def cause = currentBuild.getBuildCauses()
echo "Trigger Causes: ${cause}"
// 更详细的分类获取
def upstreamCause = currentBuild.getBuildCauses('hudson.model.Cause$UpstreamCause')
def userCause = currentBuild.getBuildCauses('hudson.model.Cause$UserIdCause')
def timerCause = currentBuild.getBuildCauses('hudson.triggers.TimerTrigger$TimerTriggerCause')
if (upstreamCause) {
echo "触发原因: 上游项目构建完成 (Project: ${upstreamCause[0].upstreamProject}, Build: ${upstreamCause[0].upstreamBuild})"
} else if (userCause) {
echo "触发原因: 用户手动触发 (User: ${userCause[0].userId})"
} else if (timerCause) {
echo "触发原因: 定时触发器 (Timer Trigger)"
} else {
echo "触发原因: 其他 (${cause})"
}
}
}
}
}
}
使用 cause 变量(系统 Groovy 脚本)
如果你在 Jenkins 的 “系统管理” -> “脚本控制台” 中运行脚本,可以直接操作 Jenkins 对象模型:
// 脚本控制台中使用
def job = Jenkins.instance.getItemByFullName("你的任务名称")
def build = job.getLastBuild()
def causes = build.getCauses()
causes.each { cause ->
println "触发原因类型: ${cause.class.name}"
println "触发原因描述: ${cause.getShortDescription()}"
// 判断具体类型
if (cause instanceof hudson.model.Cause$UserIdCause) {
println " 用户: ${cause.userId}"
} else if (cause instanceof hudson.model.Cause$UpstreamCause) {
println " 上游项目: ${cause.upstreamProject}"
} else if (cause instanceof hudson.triggers.TimerTrigger$TimerTriggerCause) {
println " 定时触发"
}
}
在 Pipeline 中使用环境变量(简单但有限)
Jenkins 提供了几个环境变量可以帮助快速判断触发原因:
BUILD_CAUSE:包含触发原因的简短描述(如MANUALTRIGGER、TIMERTRIGGER、UPSTREAMTRIGGER)。BUILD_CAUSE_<类型>:针对特定触发器的变量,BUILD_CAUSE_MANUALTRIGGER=true。
pipeline {
agent any
stages {
stage('Check Environment Variables') {
steps {
script {
// 环境变量方式(简单判断)
if (env.BUILD_CAUSE == 'MANUALTRIGGER') {
echo "手动触发"
} else if (env.BUILD_CAUSE == 'TIMERTRIGGER') {
echo "定时触发"
} else if (env.BUILD_CAUSE == 'UPSTREAMTRIGGER') {
echo "上游触发"
} else {
echo "其他触发: ${env.BUILD_CAUSE}"
}
// 或直接检查特定变量是否存在
if (env.BUILD_CAUSE_MANUALTRIGGER) {
echo "由用户手动触发"
}
}
}
}
}
}
缺点:环境变量的信息有限,无法获取详细的上游项目名或触发用户ID。
处理常用的触发原因类型
以下是最常见的触发原因及其对应的Java类名(在Groovy中可用):
| 触发类型 | 类名(用于getBuildCauses()) |
环境变量 |
|---|---|---|
| 手动触发(Web UI/API) | hudson.model.Cause$UserIdCause |
BUILD_CAUSE=MANUALTRIGGER |
| 上游项目触发 | hudson.model.Cause$UpstreamCause |
BUILD_CAUSE=UPSTREAMTRIGGER |
| 定时触发器(cron) | hudson.triggers.TimerTrigger$TimerTriggerCause |
BUILD_CAUSE=TIMERTRIGGER |
| SCM轮询触发(Poll SCM) | hudson.triggers.SCMTrigger$SCMTriggerCause |
BUILD_CAUSE=SCMTRIGGER |
| GitLab/GitHub Webhook | com.cloudbees.jenkins.GitHubPushTrigger 或 com.dabsquared.gitlabjenkins.GitLabPushTrigger |
自定义插件定义 |
| 远程API触发 | hudson.model.Cause$RemoteCause |
少见 |
示例:判断 GitLab Webhook 触发
def gitLabCause = currentBuild.getBuildCauses('com.dabsquared.gitlabjenkins.GitLabPushTrigger')
if (gitLabCause) {
echo "由 GitLab Webhook 触发"
echo "源分支: ${gitLabCause[0].sourceBranch}"
echo "提交信息: ${gitLabCause[0].lastCommitMessage}"
}
总结建议
- 大部分场景:使用
currentBuild.getBuildCauses('具体类名')最灵活可靠。 - 快速简单判断:使用环境变量
env.BUILD_CAUSE。 - 获取详细信息(如触发用户、上游项目名称):必须使用
getBuildCauses()并解析对象。
注意:如果是 Declarative Pipeline,需要将复杂逻辑放在 script { } 块中;如果是 Scripted Pipeline,可以直接写。