本文目录导读:

- 使用
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,可以直接写。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播