web-dev-qa-db-fra.com

comment obtenir $ CAUSE dans le flux de travail

Jenkins a une variable $ CAUSE disponible pour les travaux de construction de style libre.

Comment puis-je accéder à ceci ou à quelque chose de similaire dans le flux de travail?

Mon équipe l'utilise dans la sortie de courrier électronique de versions existantes ad-hoc. Nous souhaitons continuer la même chose dans les nouveaux travaux basés sur le flux de travail.

19
sooncj

Il semble que les variables de flux de travail n’aient pas cette variable injectée . Cependant, vous pouvez récupérer les informations requises de l’objet currentBuild.rawBuild en utilisant hudson.model.Run.getCause () _ ou hudson.model. Run.getCauses () méthode.

Exemple:

Script de flux de travail:

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

résultats avec cette sortie:

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

D'autres sous-types de cause peuvent être trouvés dans le javadoc .

Il existe également un bon exemple get-build-cause basé sur cette réponse dans le référentiel jenkins Exemples de pipeline }.

21
izzekil

Début 2018, il semblerait que cette information soit maintenant disponible avec JENKINS-31576 en cours de fermeture:

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

Je réponds à la réponse de Jazzschmidt, car je n'ai tout simplement pas assez de représentants ... PreviousBuild fait la mauvaise chose, car il récupère le travail du même type lancé précédemment, pas celui qui a lancé celui en cours. Si ce travail a été lancé pour la première fois par quelqu'un, c'est ce que vous obtiendrez. Sinon, la réponse sera NULL, ce qui provoquera alors une exception qui essaiera d'obtenir son ID utilisateur.

Pour obtenir la cause "d'origine", vous devez les parcourir à l'aide de UpstreamCause . C'est ce que j'ai fini par faire, bien qu'il puisse y avoir d'autres moyens:

@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

Si la construction est déclenchée par une construction en amont, vous devez traverser la hiérarchie currentBuild.

Par exemple:

println getCauser(currentBuild).userId

@NonCPS
def getCauser(def build) {
    while(build.previousBuild) {
        build = build.previousBuild
    }

    return build.rawBuild.getCause(hudson.model.Cause$UserIdCause)
}

Cela retournera l'ID utilisateur de la cause de l'utilisateur d'origine.

1
Jazzschmidt

Je suppose que vous parlez d’une macro définie dans le plugin Email Ext . Il y a un travail en cours pour que ce plugin prenne directement en charge Workflow. Je ne suis pas sûr du statut de cette macro spécifique.

1
Jesse Glick

Pour obtenir la cause si la construction a été déclenchée par l'utilisateur, le GDS ou la demande d'extraction, vous pouvez utiliser ceci:

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

Remarque: vous devez exécuter une section de script

crédit à ce github: https://github.com/benwtr/jenkins_experiment/blob/master/Jenkinsfile

1
clay

$ BUILD_CAUSE env n'est pas disponible pour les pipelines, et dans un pipeline multibranch, même currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause) Échouerait si la construction était déclenchée par un changement de SCM ou par un minuteur . J'ai donc implémenté la solution de contournement ci-dessous .. 

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

Et le reste de mon flux de travail est dans un autre noeud

   node('nodefarm') {
       if(manualTrigger) {
         // do build stuff here
       } else {
         //build not triggered by user.
       }
   } 
0
A.Nikam