В Дженкинсе, как сборщики знают, кто их просил?

Мне нужно передать имя пользователя запросчика сборки до script, который фактически выполняет эту работу. Рассматривая вывод консоли для конкретной сборки, первая строка всегда "запускается пользователем foo", поэтому Дженкинс явно отслеживает, кто вызвал сборку. Таким образом, следует передать эту информацию на задание..... Вопрос в том, как?

Ответы

Ответ 1

Имя пользователя не помещается в переменную среды easy-to-fetch, но вы можете получить ее с помощью 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>
    [...]

Ответ 2

user30997

Пожалуйста, ознакомьтесь с Jenkins Build User Vars plugin, он делает то, что вам нужно:

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

  • BUILD_USER - полное имя созданной пользователем сборки,
  • BUILD_USER_FIRST_NAME - имя пользователя, которое было запущено,
  • BUILD_USER_LAST_NAME - фамилия пользователя, который начал создавать,
  • BUILD_USER_ID - идентификатор созданной пользователем сборки.

Ответ 3

Я попытался использовать Jenkins Build User Vars plugin и уведомить комнату HipChat о том, что сборка была запущена определенным пользователем, но BUILD_USER не была доступна для плагина HipChat, возможно, потому, что действие HipChat произошло до того, как плагин Build User Vars ввел переменную.

Итак, я установил pre-scm-buildstep plugin и добавил:

enter image description here]

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

Ответ 4

В вашем задании добавьте "Выполнить систему Groovy script":

def yourUserName = build.causes[0].userId

Ответ 5

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']

Ответ 6

Мне это удалось (на Jenkins 2.58):

currentBuild.getRawBuild().getCauses()[0].getUserId()

Конечно, вам нужно установить разрешения в Jenkins, чтобы иметь возможность вызывать эти методы. Это не всегда объект 0-й причины, который вы ищете, например. это может быть другое, если вы повторите попытку создания другого пользователя (не проверяли это).