wake-up-neo.com

Rufen Sie den Benutzernamen vom Jenkins Workflow (Pipeline) Plugin ab

Ich verwende das Pipeline-Plugin in Jenkins von Clouldbees (der Name war zuvor Workflow-Plugin). Ich versuche, den Benutzernamen im Groovy-Skript zu erhalten, aber ich kann es nicht erreichen.

stage 'checkout svn'

node('master') {
      // Get the user name logged in Jenkins
}
18

Haben Sie versucht, das Build User Vars Plugin zu installieren? Wenn ja, sollten Sie laufen können

node {
  wrap([$class: 'BuildUser']) {
    def user = env.BUILD_USER_ID
  }
}

oder ähnliches.

35
Jesse Glick

Dies ist auch ohne Plugin möglich (vorausgesetzt, JOB_BASE_NAME und BUILD_ID befinden sich in der Umgebung):

def job = Jenkins.getInstance().getItemByFullName(env.JOB_BASE_NAME, Job.class)
def build = job.getBuildByNumber(env.BUILD_ID as int)
def userId = build.getCause(Cause.UserIdCause).getUserId()

Es gibt auch einen getUserName, der den vollständigen Namen des Benutzers zurückgibt.

11
Daan Bakker

Damit es mit Jenkins Pipeline funktioniert:

Installiere das user build vars plugin

Führen Sie dann Folgendes aus:

pipeline {
  agent any

  stages {
    stage('build user') {
      steps {
        wrap([$class: 'BuildUser']) {
          sh 'echo "${BUILD_USER}"'
        }
      }
    }
  }
}
9
shawn derik

Hier ist eine etwas kürzere Version, für die keine Umgebungsvariablen erforderlich sind:

@NonCPS
def getBuildUser() {
    return currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId()
}

Die Verwendung von rawBuild erfordert, dass es sich in einem @NonCPS-Block befindet.

8
Mark Vardy

Editieren: Ich habe die Frage noch einmal gelesen - das Folgende bringt dir nur das Benutzer, der den Build ausführt (was technisch oft interessanter ist), nicht dasjenige, das auslöst der Build im Frontend (sei es REST-API oder WebUI). Wenn Sie den Jenkins-Identitätswechsel aktiviert haben, sollte das Ergebnis meines Erachtens gleichwertig sein. Andernfalls erhalten Sie nur den Benutzer, dem der Jenkins-Agent auf dem Buildcomputer gehört.

rsprüngliche Antwort:

Ein anderer Weg wäre zu

sh 'export jenkins_user=$(whoami)'

Nachteil: Linux-abhängig, schwer über mehrere Agenten in einem Build zu portieren (aber dann kann der Auth-Kontext auf jedem Slave unterschiedlich sein)

Vorteil: Es müssen keine Plugins installiert werden (was bei gemeinsam genutzten/großen Jenkins-Instanzen schwierig sein kann)

1
Rick Moritz
def jobUserId, jobUserName
//then somewhere
wrap([$class: 'BuildUser']) {
    jobUserId = "${BUILD_USER_ID}"
    jobUserName = "${BUILD_USER}"
}
//then
println("Started By: ${jobUserName}")

Wir haben dieses Plugin verwendet: Build User Vars Plugin . Weitere Variablen stehen zur Verfügung.

Ich habe die Antwort von @shawn derik geändert, damit sie in meiner Pipeline funktioniert:

    stage("preserve build user") {
            wrap([$class: 'BuildUser']) {
                GET_BUILD_USER = sh ( script: 'echo "${BUILD_USER}"', returnStdout: true).trim()
            }
        }

Dann kann ich diese Variable später referenzieren, indem Sie sie übergeben oder in demselben Bereich wie $ {GET_BUILD_USER}. Ich habe das gleiche Plugin installiert, auf das verwiesen wird. 

0
cgseller
//Below is a generic groovy function to get the XML metadata for a Jenkins build.
//curl the env.BUILD_URL/api/xml parse it with grep and return the string
//I did an or true on curl, but possibly there is a better way
//echo -e "some_string \c" will always return some_string without \n char     
//use the readFile() and return the string
def GetUserId(){
 sh """
 /usr/bin/curl -k -s -u \
 \$USERNAME:\$PASSWORD -o \
 /tmp/api.xml \
 \$BUILD_URL/api/xml || true 

 THE_USERID=`cat /tmp/api.xml | grep -oP '(?<=<userId>).*?(?=</userId>)'`
 echo -e "\$THE_USERID \\c" > /tmp/user_id.txt                               
 """
def some_userid = readFile("/tmp/user_id.txt")
some_userid
}
0
JRova