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