Jenkins有一个$ CAUSE变量可用于自由式构建作业。
如何访问此工作流或类似的工作流程?
我的团队利用它在现有ad-hoc构建的电子邮件输出中使用它。我们希望在新的基于工作流的作业中继续保持这一点。
Jenkins有一个$ CAUSE变量可用于自由式构建作业。
如何访问此工作流或类似的工作流程?
我的团队利用它在现有ad-hoc构建的电子邮件输出中使用它。我们希望在新的基于工作流的作业中继续保持这一点。
它看起来像工作流构建没有注入此变量。 但是,您可以使用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示例,它基于詹金斯Pipeline Examples存储库中的这个答案。
我想你说的是在Email Ext plugin中定义的宏。有ongoing work使该插件直接支持工作流程。我不确定这个特定宏的状态。
如果构建由上游构建触发,则必须遍历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。
我回复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
}
+1为你纠正,但如果根本原因不是'UserIdCause'(即'SCMTrigger.SCMTriggerCause','TimerTrigger.TimerTriggerCause') –
就好像你可能会得到NPE。我没有扩展代码来处理其他原因,因为这足以满足我的用例。 要解析出任何原因,最后一行必须替换为与[Jesse Glick的答案](https://stackoverflow.com/a/34031927/)中链接的Email Ext插件代码中的formatCauses方法类似的东西8020250)。 – reist
它看起来像这样“黑名单”,虽然,根据[源代码](https://github.com/jenkinsci/script-虽然我不知道为什么,但安全插件/斑点/主/ src /主要/资源/组织/ jenkinsci /插件/ scriptsecurity /沙箱/白名单/黑名单#L45-L46)。 – mkobit
是的,您需要批准脚本或特定方法,或者在沙箱外运行。 – izzekil
这真的不应该被要求。提交的问题:https://issues.jenkins-ci.org/browse/JENKINS-41272 – BitwiseMan