2011-05-05 9 views
14

Necesito pasar el nombre de usuario del solicitante de una compilación a la secuencia de comandos que realmente está haciendo el trabajo. Al mirar la salida de la consola para una compilación en particular, la primera línea siempre es "Iniciado por el usuario foo", por lo que Jenkins claramente está haciendo un seguimiento de quién activó la compilación. Entonces debería ser posible pasar esa información al trabajo ... La pregunta es, ¿cómo?En Jenkins, ¿cómo saben las construcciones quién los solicitó?

Respuesta

13

El nombre de usuario no se pone en una variable de entorno fácil de buscar, pero se puede conseguir usando el xml (or json or python) api - tan pronto como se inicia una construcción, http://[jenkins-server]/job/[job-name]/[build-number]/api/xml se rellena con datos:

<freeStyleBuild> 
    <action> 
     <cause> 
      <shortDescription>Started by user foobar</shortDescription> 
      <userName>foobar</userName> 
     </cause> 
    </action> 
    <building>true</building> 
    [...] 
14

user30997

Por favor, echa un vistazo a Jenkins Build User Vars plugin, hace lo que necesita:

se utiliza para fijar siguiente usuario construir variables:

  • BUILD_USER - nombre completo del usuario inició la construcción,
  • BUILD_USER_FIRST_NAME - nombre de usuario inició la construcción,
  • BUILD_USER_LAST_NAME - apellido del usuario inició la construcción,
  • BUILD_USER_ID - Identificación de usuario inició la acumulación.
+2

no funciona para mí, jenkins dice 'El complemento par 'No reconocido macro' BUILD_USER'' está instalado –

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

en su trabajo añadir "Ejecutar sistema de escritura maravilloso":

def yourUserName = build.causes[0].userId 
3

He intentado utilizar Jenkins Build User Vars plugin y notificar a una habitación HipChat que una acumulación fue iniciado por un determinado usuario, pero La variable BUILD_USER no estaba disponible para el complemento HipChat, posiblemente porque la acción HipChat ocurrió antes de que el complemento Build User Vars inyecte la variable.

así que instalé pre-scm-buildstep plugin y ha añadido:

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

GRACIAS. Jenkins hace esta MANERA más difícil de lo que debería ser. No veo "Ejecutar script de Groovy del sistema" como una de las opciones para "Rub buildstep before SCM runs". ¿Alguna idea de cómo obtener eso o hacer lo mismo sin Groovy? –

+1

No importa, encontró el complemento Groovy aquí: https://wiki.jenkins-ci.org/display/JENKINS/Groovy+plugin –

0

logré conseguirlo (en Jenkins 2,58):

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

Por supuesto que necesita para establecer permisos en Jenkins para poder llamar a estos métodos. No siempre es el objeto Causa 0 que está buscando, p. puede ser otro si reproduces la compilación de otro usuario (no lo probé).

Cuestiones relacionadas