2011-05-05 137 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個原因對象,例如如果您重放其他用戶的版本(未測試此版本),則可能是另一個版本。