snippet example currentbuild jenkins jenkins-pipeline jenkins-workflow

jenkins - example - cómo obtener $ CAUSE en el flujo de trabajo



jenkinsfile generator (4)

Jenkins tiene una variable $ CAUSE disponible para trabajos de construcción de estilo libre.

¿Cómo puedo acceder a esto o algo similar en el flujo de trabajo?

Mi equipo lo usa en el envío de correos electrónicos de compilaciones ad-hoc existentes. Nos gustaría continuar igual en nuevos trabajos basados ​​en flujo de trabajo.


Supongo que estás hablando de una macro definida en el complemento Email Ext . Hay un trabajo continuo para hacer que ese complemento soporte directamente a Workflow. No estoy seguro del estado de esta macro específica.


Parece que las compilaciones de Workflow no tienen esta variable inyectada. Sin embargo, puede recuperar la información requerida del objeto currentBuild.rawBuild utilizando el método hudson.model.Run.getCause () o hudson.model.Run.getCauses () .

Ejemplo:

Script de flujo de trabajo:

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

resultados con esta salida:

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

Otros subtipos Causa se pueden encontrar en el javadoc .

También hay un buen ejemplo get-build-cause que se basa en esta respuesta en el repositorio jenkins Pipeline Examples .


En caso de que la compilación se desencadene por una construcción ascendente, debe atravesar la jerarquía de currentBuild .

Por ejemplo:

println getCauser(currentBuild).userId @NonCPS def getCauser(def build) { while(build.previousBuild) { build = build.previousBuild } return build.rawBuild.getCause(hudson.model.Cause$UserIdCause) }

Esto devolverá la identificación de usuario de la causa del usuario original.


Estoy respondiendo a la respuesta de Jazzschmidt, ya que simplemente no tengo suficiente rep ... previousBuild hace lo incorrecto, ya que obtiene el trabajo del mismo tipo que se lanzó previamente, no el trabajo que lanzó el actual. Si ese trabajo fue lanzado por primera vez por alguien, eso es a quién obtendrás. De lo contrario, la respuesta será NULL, lo que provocará una excepción al tratar de obtener su userId.

Para obtener la causa "original", debe atravesar las causas usando UpstreamCause . Esto es lo que terminé haciendo, aunque puede haber otras formas:

@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 }