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

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

stage 'checkout svn'

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

person Daniel Hernández    schedule 09.03.2016    source источник
comment
Под именем пользователя, вошедшего в систему Jenkins, вы имеете в виду, что пользователь вошел в интерфейс? I.E. тот, который вручную (или автоматически) запускает задание? Или тот, который действительно выполняет задание в среде выполнения? Поскольку вы выделяете это только в части вопроса, выделенной серым по серому, вопрос будет лучше, если вы выделите это более четко.   -  person Rick Moritz    schedule 16.04.2019
comment
@RickMoritz, вы уже указали, что я имел в виду, в любом случае я обновил вопрос.   -  person Daniel Hernández    schedule 16.04.2019


Ответы (9)


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

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

или похожие.

person Jesse Glick    schedule 09.03.2016
comment
Спасибо :) отлично работает Я не знал об этом плагине, проверяя примечания к выпуску, я обнаружил, что это последнее обновление, поддержка плагина рабочего процесса! отличный - person Daniel Hernández; 10.03.2016
comment
Я пробую это с конвейерной работой. В вики говорится, что должна быть Set jenkins user build variables галочка, но, похоже, она доступна только в Freestyle projects. Что еще мне не хватает? - person dothebart; 30.11.2016
comment
Флажок предназначен только для вакансий вольным стилем. Но вот как узнать, что доступно для работы в трубопроводе. Прокрутите до wrap: General Build Wrapper либо с помощью флажка Snippet Generator, либо до your-jenkins.example.com/ workflow-cps-snippetizer / dslReference. - person MarkHu; 26.01.2017
comment
Это мертвая ссылка. У вас есть еще один образец? - person Eddie; 30.05.2017
comment
Обратите внимание, что этот плагин указан как: user build vars plugin - person dothebart; 30.01.2018
comment
ты чертовски классный - person Bernardo Vale; 01.06.2018

Чтобы он работал с Jenkins Pipeline:

Установите подключаемый модуль переменных сборки пользователя

Затем запустите следующее:

pipeline {
  agent any

  stages {
    stage('build user') {
      steps {
        wrap([$class: 'BuildUser']) {
          sh 'echo "${BUILD_USER}"'
        }
      }
    }
  }
}
person YourAboutMeIsBlank    schedule 06.02.2018
comment
У меня тоже сработало, но для моего конвейера мне не потребовались шаги {}, заключающие команду, и я изменил команду, чтобы использовать скрипт: я опубликую свой успех в отдельном ответе - person cgseller; 12.03.2018
comment
Нет необходимости добавлять его в блок скрипта? - person thclpr; 04.05.2018

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

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

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

person Mark Vardy    schedule 01.03.2018
comment
Просто FYSA: это решение или аналогичные решения не будут работать, если пользователь щелкнет ссылку Scan Multibranch Pipeline Now на боковой панели для инициированной сборки на основе сканирования с несколькими ветвями. Он работает только в том случае, если пользователь вручную нажимает на кнопку «Сборка» или «Сборка с параметрами». - person AKS; 28.04.2021
comment
stackoverflow.com/ questions / 67304608 / имеет лучший пример для поиска / настройки пользователя, если вы хотите установить описание сборки с помощью BUILD_USER, при сканировании ссылки на боковой панели MultiBranch Pipeline Now в задании MultiBranch Pipeline - person AKS; 28.04.2021

Это можно сделать без плагина (при условии, что 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, которое возвращает полное имя пользователя.

person Daan Bakker    schedule 26.07.2017
comment
Предостережение: задание, содержащее этот сценарий, может быть запущено только администратором на Jenkins 2 из соображений безопасности. Однако вы можете утвердить сценарий в меню «Утверждение сценария». - person jeebface; 07.05.2019
comment
Я получаю эту ошибку, когда пытаюсь сделать это: org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use staticMethod jenkins.model.Jenkins getInstance - person Katie; 23.05.2019
comment
JOB_BASE_NAME и BUILD_ID доступны в моей среде. Я уже одобрил все разрешения сценария, но я получаю эту ошибку при использовании приведенных выше кодов ... java.lang.NullPointerException: невозможно вызвать метод getBuildByNumber () для нулевого объекта - person bencampbell_14; 13.01.2020
comment
@ bencampbell_14 - вероятно, у вас пустое значение для задания. добавить ? после названия условного обозначения вакансии во второй строке. (и, возможно, также на третьей строке после сборки.) - person Alexander Stohr; 10.11.2020
comment
stackoverflow.com/ вопросы / 67304608 / ответ - person AKS; 28.04.2021

У меня это работает без плагина Build User:

// get first entry of JSONArray
def buildCause = currentBuild.getBuildCauses()[0]
def buildPrincipal = [type:"unknown", name:""]

if (buildCause._class ==~ /.+BranchEventCause/) {
  def branchCause = currentBuild.getRawBuild().getCause(jenkins.branch.BranchEventCause)
  buildPrincipal = [type:"branch",name:buildCause.shortDescription]

} else
if (buildCause._class ==~ /.+TimerTriggerCause/) {
  def timerCause = currentBuild.getRawBuild().getCause(hudson.triggers.TimerTrigger.TimerTriggerCause)
  buildPrincipal = [type:"timer", name:"Timer event"]

} else
if (buildCause._class ==~ /.+UserIdCause/) {
  def buildUserCause = currentBuild.getRawBuild().getCause(hudson.model.Cause.UserIdCause)
  buildPrincipal = [type:"user", name:buildCause.userId]

} else
// ... other causes
person Juergen    schedule 14.12.2019
comment
Мне нравится этот, потому что если вы пытаетесь выбрать пользователя для уведомления, когда это UserIdCause, вы используете его, но если это ветка, используйте GIT_COMMITTER. Кого уведомлять о сбоях при сбое, управляемом таймером, скорее всего некому, или девопс ... - person Ajax; 23.06.2020

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

Мы использовали этот плагин: Создание пользовательских переменных Плагин. Доступно больше переменных.

person Anand Varkey Philips    schedule 07.08.2018
comment
не могли бы вы подробнее рассказать, как это реализовать? Я новичок в Дженкинсе, заранее большое спасибо. - person Z.Liu; 08.07.2020
comment
подскажите, что именно вы пытаетесь реализовать ?? Я перестал употреблять Дженкинс почти 1,5 года. Вот почему. - person Anand Varkey Philips; 08.07.2020
comment
Большое спасибо за ответ, я уже реализовал его. сначала я не знаю, как использовать def jobUsername, потому что я хочу использовать его в общей библиотеке, затем я использую функцию, чтобы получить пользователя и вернуть имя пользователя. еще раз спасибо. - person Z.Liu; 09.07.2020

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

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

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

person cgseller    schedule 12.03.2018
comment
такого ответа от Шона Дерика больше нет. возможно имя пользователя изменилось. Ожидается, что решение будет работать только при наличии плагина Build User Vars. - person Alexander Stohr; 10.11.2020
comment
Спасибо - да, плагин потребуется. - person cgseller; 28.12.2020

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

Исходный ответ:

Другой способ -

sh 'export jenkins_user=$(whoami)'

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

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

person Rick Moritz    schedule 05.04.2019

Плагин Build User Vars полезен, когда вы выполняете этап на агенте.

Альтернативой является использование текущего предложения сборки (см. https://code-maven.com/jenkins-get-current-user), который также работает, когда на вашей сцене установлено значение agent none.

person Ceddaerrix    schedule 22.10.2020