2011-05-05 69 views
14

我需要将构建请求者的用户名传递给实际正在进行工作的脚本。查看特定版本的控制台输出,第一行总是“由用户foo开始”,因此Jenkins明确了解谁触发了构建。所以应该可以将这些信息传递给工作.....问题是,如何?在詹金斯,如何建立知道谁要求他们?

回答

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> 
    [...] 
14

user30997

请看看Jenkins Build User Vars plugin,它确实你需要什么:

它用于设置以下用户生成变量:

  • BUILD_USER - 用户的全名开始建设,
  • BUILD_USER_FIRST_NAME - 的用户名开始建设,
  • BUILD_USER_LAST_NAME - 用户姓氏开始建设,
  • BUILD_USER_ID - 的用户ID开始构建。
+2

它不适合我,詹金斯说'无法识别宏'BUILD_USER''偶插件安装 – 2017-01-20 10:12:49

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

在您的工作增添“执行系统Groovy脚本”:

def yourUserName = build.causes[0].userId 
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) 
    ])) 
} 
+0

谢谢。詹金斯使这种方式比它应该更难。我没有看到“执行系​​统Groovy脚本”作为“SCM运行之前擦拭buildstep”的选项之一。有没有想过如何在没有Groovy的情况下做到这一点或做同样的事情? – 2016-01-20 19:48:51

+1

没关系,在这里找到了Groovy插件:https://wiki.jenkins-ci.org/display/JENKINS/Groovy+plugin – 2016-01-20 19:56:55

0

我设法得到它(对詹金斯2.58):

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

当然你需要设置权限詹金斯能够称这些方法。 它并不总是您要查找的第0个原因对象,例如如果您重放其他用户的版本(未测试此版本),则可能是另一个版本。