2015-11-07 19 views
11

Jenkins有一个$ CAUSE变量可用于自由式构建作业。

如何访问此工作流或类似的工作流程?

我的团队利用它在现有ad-hoc构建的电子邮件输出中使用它。我们希望在新的基于工作流的作业中继续保持这一点。

回答

17

它看起来像工作流构建没有注入此变量。 但是,您可以使用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存储库中的这个答案。

+0

它看起来像这样“黑名单”,虽然,根据[源代码](https://github.com/jenkinsci/script-虽然我不知道为什么,但安全插件/斑点/主/ src /主要/资源/组织/ jenkinsci /插件/ scriptsecurity /沙箱/白名单/黑名单#L45-L46)。 – mkobit

+0

是的,您需要批准脚本或特定方法,或者在沙箱外运行。 – izzekil

+1

这真的不应该被要求。提交的问题:https://issues.jenkins-ci.org/browse/JENKINS-41272 – BitwiseMan

1

我想你说的是在Email Ext plugin中定义的宏。有ongoing work使该插件直接支持工作流程。我不确定这个特定宏的状态。

0

如果构建由上游构建触发,则必须遍历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

我回复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 
} 
+0

+1为你纠正,但如果根本原因不是'UserIdCause'(即'SCMTrigger.SCMTriggerCause','TimerTrigger.TimerTriggerCause') –

+0

就好像你可能会得到NPE。我没有扩展代码来处理其他原因,因为这足以满足我的用例。 要解析出任何原因,最后一行必须替换为与[Jesse Glick的答案](https://stackoverflow.com/a/34031927/)中链接的Email Ext插件代码中的formatCauses方法类似的东西8020250)。 – reist

相关问题