2015-11-07 51 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

相關問題