web-dev-qa-db-ja.com

ワークフローで$ CAUSEを取得する方法

Jenkinsには、フリースタイルビルドジョブで使用できる$ CAUSE変数があります。

ワークフローでこれまたは類似のものにアクセスするにはどうすればよいですか?

私のチームは、既存のアドホックビルドの電子メール出力でそれを利用しています。新しいワークフローベースのジョブでも同じことを続けたいと思います。

20
sooncj

ワークフロービルドにはこの変数が注入されていないようです。ただし、 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。

22
izzekil

2018年初頭の時点では、情報は 現在利用可能 であり、 JENKINS-31576 は閉じられています:

def manualTrigger = true
currentBuild.upstreamBuilds?.each { b ->
  echo "Upstream build: ${b.getFullDisplayName()}"
  manualTrigger = false
}
11

私は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
}
5
reist

ビルドがユーザー、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

3
clay

ビルドがアップストリームビルドによってトリガーされる場合、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を返します。

2
Jazzschmidt

Email Ext plugin で定義されているマクロについて話していると思います。 進行中の作業 があり、プラグインがワークフローを直接サポートするようにします。この特定のマクロの状態についてはわかりません。

1
Jesse Glick

$ 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.
       }
   } 
1
A.Nikam