В Дженкинсе, как сборки знают, кто их запросил?
Мне нужно передать имя пользователя запросчика сборки скрипту, который фактически выполняет работу. Глядя на вывод консоли для конкретной сборки, первая строка всегда "запускается пользователем foo", поэтому Дженкинс явно отслеживает, кто запустил сборку. Таким образом, должна быть возможность передать эту информацию на работу..... Вопрос в том, как?
6 ответов
имя пользователя не помещается в легкодоступную переменную среды, но вы можете получить его с помощью xml (или JSON или python) api - как только вы начнете сборку,http://[jenkins-server]/job/[job-name]/[build-number]/api/xml
заполняется детали:
<freeStyleBuild>
<action>
<cause>
<shortDescription>Started by user foobar</shortDescription>
<userName>foobar</userName>
</cause>
</action>
<building>true</building>
[...]
user30997
пожалуйста, проверьте сборки Jenkins плагин пользователя Варс что нужно:
Он используется для установки следующих переменных сборки пользователя:
- BUILD_USER-полное имя пользователя начало сборки,
- BUILD_USER_FIRST_NAME-имя пользователя начало сборки,
- BUILD_USER_LAST_NAME-фамилия пользователя, начавшего сборку,
- BUILD_USER_ID-id пользователя начал сборку.
Я пытался использовать сборки Jenkins плагин пользователя Варс и уведомить комнату HipChat, что сборка была запущена определенным пользователем, но BUILD_USER
переменная не была доступна для плагина HipChat, возможно, потому, что действие HipChat произошло до того, как плагин Build User Vars ввел переменную.
Я pre-scm-buildstep плагин и добавил:
]
// Inject environment variables using Groovy
import hudson.model.*
def build = Thread.currentThread().executable
def userCause = build.getCause(hudson.model.Cause$UserIdCause)
def userName = userCause?.userId ?: 'Jenkins'
def envVars = ['BUILD_USER': userName]
for (item in envVars) {
build.addAction(new ParametersAction([
new StringParameterValue(item.key, item.value)
]))
}
в вашей работе добавить "выполнить системный скрипт Groovy":
def yourUserName = build.causes[0].userId
import os
import jenkinsapi.build
import jenkinsapi.jenkins
#Required Environment variables example:
#JENKINS_URL=http://jenkinsserver/
#JOB_NAME=TEST_GT
#BUILD_NUMBER=8
jenkins_inst = None
def get_jenkins_inst():
if jenkins_inst == None:
jenkins_url = os.environ['JENKINS_URL']
print("Connect to jenkins " + jenkins_url)
jenkins_inst = jenkinsapi.jenkins.Jenkins(jenkins_url)
return jenkins_inst
def get_jenkins_job():
jenkins_inst = get_jenkins_inst()
jenkins_job_name = os.environ['JOB_NAME']
print("Get jenkins job " + jenkins_job_name)
return jenkins_inst.get_job(jenkins_job_name)
def get_jenkins_user():
jenkins_job = get_jenkins_job()
jenkins_buildno = int(os.environ['BUILD_NUMBER'])
print("Get jenkins job build " + str(jenkins_buildno))
cur_build = jenkins_job.get_build(jenkins_buildno)
return cur_build.get_actions()['causes'][0]['userId']
мне удалось получить его (на Jenkins 2.58):
currentBuild.getRawBuild().getCauses()[0].getUserId()
конечно, вы должны установить разрешения в Jenkins, чтобы иметь возможность вызывать эти методы. Это не всегда объект 0th Cause, который вы ищете, например, это может быть другой, если вы воспроизводите сборку другого пользователя (не тестировали это).