在Jenkins中,构建如何知道谁请求了它们?

时间:2011-05-05 18:23:58

标签: build hudson request username jenkins

我需要将构建请求者的用户名传递给实际正在进行工作的脚本。查看特定构建的控制台输出,第一行始终是“由用户foo启动”,因此Jenkins清楚地跟踪谁触发了构建。所以应该可以将这些信息传递给工作......问题是,如何?

6 个答案:

答案 0 :(得分:14)

user30997

请查看Jenkins Build User Vars plugin,它可以满足您的需求:

用于设置以下用户构建变量:

  • BUILD_USER - 用户启动构建的全名,
  • BUILD_USER_FIRST_NAME - 用户启动构建的第一个名称,
  • BUILD_USER_LAST_NAME - 用户启动构建的姓氏,
  • BUILD_USER_ID - 用户启动构建的ID。

答案 1 :(得分:13)

用户名不会放在易于获取的环境变量中,但您可以使用xml (or json or 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 :(得分:4)

我尝试使用Jenkins Build User Vars plugin并通知HipChat会议室某个用户启动了构建,但HipChat插件无法使用BUILD_USER变量,可能是因为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)
  ]))
}

答案 3 :(得分:2)

在您的作业中添加“执行系统Groovy脚本”:

def yourUserName = build.causes[0].userId

答案 4 :(得分:1)

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

答案 5 :(得分:0)

我设法得到它(在Jenkins 2.58上):

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

当然,您需要在Jenkins中设置权限才能调用这些方法。 它并不总是您正在寻找的第0个原因对象,例如如果你重播另一个用户的版本(不测试这个),它可能是另一个。