Jenkinsには、フリースタイルビルドジョブで使用できる$ CAUSE変数があります。
ワークフローでこれまたは類似のものにアクセスするにはどうすればよいですか?
私のチームは、既存のアドホックビルドの電子メール出力でそれを利用しています。新しいワークフローベースのジョブでも同じことを続けたいと思います。
ワークフロービルドにはこの変数が注入されていないようです。ただし、 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 にあります。
Jenkinsのこの回答に基づいた優れた get-build-cause の例もあります Pipeline Examples repository。
2018年初頭の時点では、情報は 現在利用可能 であり、 JENKINS-31576 は閉じられています:
def manualTrigger = true
currentBuild.upstreamBuilds?.each { b ->
echo "Upstream build: ${b.getFullDisplayName()}"
manualTrigger = false
}
私はJazzschmidtの答えに返信しています、私は十分な担当者がいないだけです... previousBuildは間違ったことをします。現在のジョブを起動したジョブではなく、以前に起動した同じタイプのジョブを取得するためです。その仕事が誰かによって最初に開始された場合、それはあなたが得るだろう人です。それ以外の場合、応答はNULLになり、ユーザーIDを取得しようとして例外が発生します。
「元の」原因を取得するには、 pstreamCause を使用して原因をトラバースする必要があります。これは私がやったことですが、他の方法もあります:
@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
}
ビルドがユーザー、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
ビルドがアップストリームビルドによってトリガーされる場合、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を返します。
Email Ext plugin で定義されているマクロについて話していると思います。 進行中の作業 があり、プラグインがワークフローを直接サポートするようにします。この特定のマクロの状態についてはわかりません。
$ BUILD_CAUSE envはパイプラインでは使用できません。マルチブランチパイプラインでは、ビルドがSCMの変更またはタイマーによってトリガーされた場合、currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause)
でも失敗します。そこで、以下の回避策を実装しました。
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.
}
}