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
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.
$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.
}
}
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