how to get $CAUSE in workflow

后端 未结 9 1720
暗喜
暗喜 2020-12-10 01:24

Jenkins has a $CAUSE variable available to freestyle build jobs.

How can I access this or something similar in workflow?

My team makes use of it in email out

相关标签:
9条回答
  • 2020-12-10 02:16

    It looks like Workflow builds don't have this variable injected. However you can retrieve the required info from currentBuild.rawBuild object using hudson.model.Run.getCause() or hudson.model.Run.getCauses() method.

    Example:

    Workflow script:

    println "CAUSE ${currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause).properties}"
    

    results with this output:

    Running: Print Message
    CAUSE [userName:John Smith, userId:jsmith, class:class hudson.model.Cause$UserIdCause, shortDescription:Started by user John Smith]
    

    Other Cause subtypes can be found in the javadoc.

    There is also a good get-build-cause example which is based on this answer in the jenkins Pipeline Examples repository.

    0 讨论(0)
  • 2020-12-10 02:16

    $BUILD_CAUSE env is not available for pipelines, and in multibranch pipeline even currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause) would fail, if build was triggered by SCM change or timer. So, I implemented below workaround..

        def manualTrigger = false
        node('master'){
           def causes = currentBuild.rawBuild.getCauses()
           for(cause in causes) {
              if(cause.properties.shortDescription =~ 'Started by user') {
                 manualTrigger = true
                 break
              }
          }
      }
    

    And rest of my workflow is in another node

       node('nodefarm') {
           if(manualTrigger) {
             // do build stuff here
           } else {
             //build not triggered by user.
           }
       } 
    
    0 讨论(0)
  • 2020-12-10 02:20

    We all like one-liners, so let me share one here:

    env.STARTED_BY = currentBuild.getBuildCauses().iterator().next().userId ?: "SYSTEM"

    To break it down, after 2.22 pipeline plugin release there is a nice getBuildCauses method added to access build causes.

    If you run your job like:

    def causes = currentBuild.getBuildCauses()
    causes.each {
        echo "$it"
    }
    echo "${causes.iterator().next().userId}"
    

    you will see:

    [Pipeline] echo
    [_class:hudson.model.Cause$UserIdCause, shortDescription:Started by user User Name (user.name), userId:user.name, userName:User Name (user.name)]
    [Pipeline] echo
    user.name
    

    and if it was started by cron then you will see:

    [Pipeline] echo
    [_class:hudson.triggers.TimerTrigger$TimerTriggerCause, shortDescription:Started by timer]
    [Pipeline] echo
    null
    
    0 讨论(0)
提交回复
热议问题