webentwicklung-frage-antwort-db.com.de

wie man $ CAUSE im Workflow erhält

Jenkins verfügt über eine $ CAUSE-Variable, die für Freestyle-Build-Jobs verfügbar ist.

Wie kann ich auf dieses oder ähnliches im Workflow zugreifen?

Mein Team nutzt es bei der E-Mail-Ausgabe vorhandener Ad-hoc-Builds. Das möchten wir auch bei neuen Workflow-basierten Jobs fortsetzen.

19
sooncj

Es sieht so aus, als hätten Workflow-Builds diese Variable nicht injiziert .. __ Sie können jedoch die erforderlichen Informationen von currentBuild.rawBuild-Objekt mit hudson.model.Run.getCause () oder hudson.model) abrufen. Run.getCauses () Methode.

Beispiel:

Workflow-Skript:

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

ergebnisse mit dieser Ausgabe:

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

Andere Ursachenuntertypen können in javadoc gefunden werden.

Es gibt auch ein gutes get-build-cause Beispiel, das auf dieser Antwort im jenkins Pipeline Beispiele Repository basiert.

21
izzekil

Ab Anfang 2018 scheint es so zu sein, dass Informationen jetzt verfügbar mit JENKINS-31576 geschlossen sind:

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

Ich antworte auf die Antwort von Jazzschmidt, da ich einfach nicht genug Vertreter habe. Wenn dieser Job zum ersten Mal von jemandem gestartet wurde, werden Sie ihn bekommen. Andernfalls lautet die Antwort NULL, wodurch eine Ausnahme ausgelöst wird, die versucht, ihre userId abzurufen.

Um die "ursprüngliche" Ursache zu erhalten, müssen Sie die Ursachen mit UpstreamCause durchlaufen. Das habe ich am Ende getan, obwohl es andere Wege gibt:

@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

Falls der Build durch einen Upstream-Build ausgelöst wird, müssen Sie die Hierarchie currentBuild durchlaufen.

Zum Beispiel:

println getCauser(currentBuild).userId

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

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

Dadurch wird die Benutzer-ID der ursprünglichen Benutzerursache zurückgegeben.

1
Jazzschmidt

Ich denke, Sie sprechen von einem Makro, das im Email Ext Plugin definiert ist. Es gibt laufende Arbeit , damit das Plugin Workflow direkt unterstützt. Ich bin nicht sicher über den Status dieses bestimmten Makros.

1
Jesse Glick

Um die Ursache zu ermitteln, falls der Build durch einen Benutzer, einen SCM oder eine Pull-Anforderung ausgelöst wurde, können Sie Folgendes verwenden:

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

Hinweis: Sie müssen in einem Skriptabschnitt laufen

dank an diesen Github: https://github.com/benwtr/jenkins_experiment/blob/master/Jenkinsfile

1
clay

$ BUILD_CAUSE env ist nicht für Pipelines verfügbar, und in einer Multibranchen-Pipeline würde selbst die Funktion ___currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause) Fehlschlagen, wenn der Build durch einen SCM-Wechsel oder einen Zeitgeber ausgelöst wurde . 

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

Der Rest meines Workflows befindet sich in einem anderen Knoten

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