Получить имя пользователя в системе Jenkins из плагина Jenkins Workflow (Pipeline)

Я использую плагин Pipeline в Jenkins от Clouldbees (раньше это был плагин Workflow), я пытаюсь получить имя пользователя в скрипте Groovy, но я не могу его достичь.

stage 'checkout svn'

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

Ответ 1

Вы пытались установить плагин Build User Vars? Если это так, вы должны иметь возможность запускать

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

или похожие.

Ответ 2

Это можно сделать без плагина (предполагая, что JOB_BASE_NAME и BUILD_ID находятся в среде):

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()

Также есть имя getUserName, которое возвращает полное имя пользователя.

Ответ 3

Чтобы заставить его работать с трубопроводом Jenkins:

Установите пользовательский плагин vars build

Затем выполните следующее:

pipeline {
  agent any

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

Ответ 4

Здесь немного более короткая версия, которая не требует использования переменных среды:

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

Использование rawBuild требует, чтобы оно было в блоке @NonCPS.

Ответ 5

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

Ответ 6

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

Мы использовали этот плагин: Build User Vars Plugin. Доступны другие переменные.

Ответ 7

Изменить: я перечитал вопрос - ниже приведен только пользователь, выполняющий сборку (что технически часто более интересно), а не пользователь, запускающий сборку во внешнем интерфейсе (будь то REST-API или WebUI). Если вы включили олицетворение Jenkins, то я считаю, что результат должен быть эквивалентным, в противном случае вы получите только пользователя, который владеет агентом jenkins на машине для сборки.

Оригинальный ответ:

Другим способом было бы

sh 'export jenkins_user=$(whoami)'

Недостаток: Linux-зависимый, трудно портировать между несколькими агентами в одной сборке (но тогда контекст аутентификации может быть разным для каждого ведомого)

Перевернутый: нет необходимости устанавливать плагины (которые на общих/больших экземплярах Jenkins могут быть сложными)

Ответ 8

Я изменил ответ @shawn derik, чтобы заставить его работать в моем конвейере:

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

Затем я могу ссылаться на эту переменную позже, передав ее или в той же области, что и $ {GET_BUILD_USER}. Я установил один и тот же плагин.