Jenkins有一个$ CAUSE变量可用于自由式构建作业。
如何在工作流程中访问此类似内容?
我的团队在现有ad-hoc构建的电子邮件输出中使用它。我们希望在基于工作流程的新工作中继续这样做。
答案 0 :(得分:21)
看起来Workflow版本没有注入此变量。
但是,您可以使用hudson.model.Run.getCause()或hudson.model.Run.getCauses()方法从currentBuild.rawBuild
对象中检索所需信息。
示例:强>
工作流程脚本:
println "CAUSE ${currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause).properties}"
结果输出:
Running: Print Message
CAUSE [userName:John Smith, userId:jsmith, class:class hudson.model.Cause$UserIdCause, shortDescription:Started by user John Smith]
其他原因子类型可以在javadoc中找到。
还有一个很好的get-build-cause示例基于jenkins Pipeline Examples存储库中的这个答案。
答案 1 :(得分:10)
截至2018年初,看来该信息now available已关闭JENKINS-31576:
/assets/data.json
答案 2 :(得分:5)
我正在回答Jazzschmidt的回答,因为我没有足够的代表...... previousBuild做错了,因为它获得了相同类型的先前启动的作业,而不是启动当前作业的作业。如果这项工作是由某人首次推出的,那就是你会得到的。否则,响应将为NULL,这将导致尝试获取其userId的异常。
要获得“原始”原因,您必须使用UpstreamCause遍历原因。这就是我最终要做的事情,尽管可能还有其他方法:
@NonCPS
def getCauser() {
def build = currentBuild.rawBuild
def upstreamCause
while(upstreamCause = build.getCause(hudson.model.Cause$UpstreamCause)) {
build = upstreamCause.upstreamRun
}
return build.getCause(hudson.model.Cause$UserIdCause).userId
}
答案 3 :(得分:2)
如果构建是由上游构建触发的,则必须遍历currentBuild
层次结构。
例如:
println getCauser(currentBuild).userId
@NonCPS
def getCauser(def build) {
while(build.previousBuild) {
build = build.previousBuild
}
return build.rawBuild.getCause(hudson.model.Cause$UserIdCause)
}
这将返回原始用户原因的用户ID。
答案 4 :(得分:2)
如果构建是由用户,SCM或拉取请求触发的,可以使用此命令:
def SCMTriggerCause
def UserIdCause
def GitHubPRCause
def PRCause = currentBuild.rawBuild.getCause(org.jenkinsci.plugins.github.pullrequest.GitHubPRCause)
def SCMCause = currentBuild.rawBuild.getCause(hudson.triggers.SCMTrigger$SCMTriggerCause)
def UserCause = currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause)
if (PRCause) {
println PRCause.getShortDescription()
} else if (SCMCause) {
println SCMCause.getShortDescription()
} else if (UserCause) {
println UserCause.getShortDescription()
}else {
println "unknown cause"
}
注意:您必须在脚本部分
中运行归功于这个github:https://github.com/benwtr/jenkins_experiment/blob/master/Jenkinsfile
答案 5 :(得分:2)
我们都喜欢单线,所以我在这里分享一个:
env.STARTED_BY = currentBuild.getBuildCauses().iterator().next().userId ?: "SYSTEM"
要对其进行分解,在2.22管道插件发布之后,添加了一个不错的getBuildCauses
方法来访问生成原因。
如果您的工作方式如下:
def causes = currentBuild.getBuildCauses()
causes.each {
echo "$it"
}
echo "${causes.iterator().next().userId}"
您将看到:
[Pipeline] echo
[_class:hudson.model.Cause$UserIdCause, shortDescription:Started by user User Name (user.name), userId:user.name, userName:User Name (user.name)]
[Pipeline] echo
user.name
如果它是由cron启动的,那么您将看到:
[Pipeline] echo
[_class:hudson.triggers.TimerTrigger$TimerTriggerCause, shortDescription:Started by timer]
[Pipeline] echo
null
答案 6 :(得分:2)
自Jenkins 2.22(JENKINS-41272)起,您可以访问currentBuild.getBuildCauses()
方法以获取一系列构建原因。例如:
environment {
CAUSE = "${currentBuild.getBuildCauses()[0].shortDescription}"
}
steps {
echo "Build caused by ${env.CAUSE}"
}
答案 7 :(得分:1)
我猜你在谈论Email Ext plugin中定义的宏。有ongoing work使该插件直接支持Workflow。我不确定这个特定宏的状态。
答案 8 :(得分:1)
$ BUILD_CAUSE env不适用于管道,甚至也不适用于多分支管道
currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause)
如果由SCM更改或计时器触发构建,则会失败。
所以,我实现了以下解决方法..
def manualTrigger = false
node('master'){
def causes = currentBuild.rawBuild.getCauses()
for(cause in causes) {
if(cause.properties.shortDescription =~ 'Started by user') {
manualTrigger = true
break
}
}
}
我的工作流程的其余部分位于另一个节点
node('nodefarm') {
if(manualTrigger) {
// do build stuff here
} else {
//build not triggered by user.
}
}