【发布时间】:2011-08-19 15:13:00
【问题描述】:
我需要将构建请求者的用户名传递给实际执行工作的脚本。查看特定构建的控制台输出,第一行始终是“由用户 foo 启动”,因此 Jenkins 清楚地跟踪谁触发了构建。所以应该可以将这些信息传递给工作。问题是,怎么做?
【问题讨论】:
标签: jenkins build request hudson
我需要将构建请求者的用户名传递给实际执行工作的脚本。查看特定构建的控制台输出,第一行始终是“由用户 foo 启动”,因此 Jenkins 清楚地跟踪谁触发了构建。所以应该可以将这些信息传递给工作。问题是,怎么做?
【问题讨论】:
标签: jenkins build request hudson
用户30997
请查看Jenkins Build User Vars plugin,它可以满足您的需求:
用于设置以下用户构建变量:
【讨论】:
Unrecognized macro 'BUILD_USER' 甚至安装了插件
用户名没有放在易于获取的环境变量中,但您可以使用 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>
[...]
【讨论】:
我尝试使用 Jenkins Build User Vars plugin 并通知 HipChat 房间某个用户启动了构建,但 BUILD_USER 变量对 HipChat 插件不可用,可能是因为 HipChat 操作发生在 Build User Vars 插件注入变量之前.
所以我安装了pre-scm-buildstep plugin 并添加了:
]
// 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)
]))
}
【讨论】:
在你的 Job 中添加“执行系统 Groovy 脚本”:
def yourUserName = build.causes[0].userId
【讨论】:
我设法得到它(在 Jenkins 2.58 上):
currentBuild.getRawBuild().getCauses()[0].getUserId()
当然你需要在 Jenkins 中设置权限才能调用这些方法。 它并不总是您正在寻找的第 0 个原因对象,例如如果您重播另一个用户的构建(未对此进行测试),它可能是另一个。
【讨论】:
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']
【讨论】: