Variables de entorno de Jenkins / Hudson

101

Estoy ejecutando Jenkins desde el usuario jenkinsque se ha $PATHconfigurado en algo y cuando entro en la interfaz web de Jenkins, en la ventana Propiedades del sistema ( http://$host/systemInfo) veo un archivo $PATH.

He instalado Jenkins en Centos con el rpm nativo del sitio web de Jenkins. Estoy usando el script de inicio provisto con la instalación usandosudo /etc/init.d/jenkins start

¿Alguien puede explicarme por qué sucede eso?

Miguel
fuente
1
Si inicia sesión como jenkins, echo $PATH¿coincide con lo que ve en jenkins?
Actualización
3
@Dave no, no coincide. no puedo entender por qué
Michael
8
La razón por la que no coincide es porque cuando inicia sesión como usuario de jenkins, está invocando un shell de inicio de sesión, mientras que jenkins simplemente ejecuta / bin / sh -xe {su script} para que no se ejecute a través del mismo conjunto de scripts que alteran la variable de entorno PATH. De hecho, el conjunto de scripts varía de acuerdo con el sabor particular de * nix y / o shell que haya instalado. Probé en AWS Linux AMI con jenkins y, lamentablemente, ninguno de / etc / profile /etc/profile.d/xxx.sh / etc / bashrc / etc / environment ~ / .bash_profile ~ / .profile ~ / .bashrc pudo para afectar el PATH pasado a / bin / sh
Luke

Respuestas:

141

Miguel,

Dos cosas:

Cuando Jenkins se conecta a una computadora, va al shshell y no al bashshell (al menos esto es lo que he notado, puede que me equivoque). Por lo tanto, no se consideran los cambios que realice en $ PATH en su archivo bashrc.

Además, cualquier cambio que realice en $ PATH en su shell local (uno en el que usted personalmente ssh) no aparecerá en Jenkins.

Para cambiar la ruta que usa Jenkins, tiene dos opciones (AFAIK):

1) Edite su /etc/profilearchivo y agregue las rutas que desee allí

2) Vaya a la página de configuración de su esclavo y agregue la variable de entorno PATH, con el valor:$PATH:/followed-by/paths/you/want/to/add

Si usa la segunda opción, la información de su sistema aún no la mostrará, pero sus compilaciones verán las rutas agregadas.

Sagar
fuente
2
Esta respuesta funcionó para mí, pero noté que Jenkins es muy sensible sobre lo que escribe en la página de configuración. No pude hacer que funcionara con caminos con espacios.
miguelSantirso
Sí, lo es, pero cuando ingresa rutas con espacios en un shell UNIX, el espacio normalmente se escapa con un carácter ``. Por lo tanto, si su ruta es "/ opt / bin / My Folder Name", puede probar "/ opt / bin / My \ Folder \ Name" en su lugar. Esto escapará de los espacios y te permitirá usarlos.
Sagar
11
La solución 2 es el camino a seguir.
gagarine
2
Seguimiento: en mi sistema Ubuntu, el servicio jenkins es un trabajo advenedizo, así que estaba modificando el antiguo script stub sysvinit. Lugar equivocado. Cuando modifico el script /etc/init/jenkins.conf y actualizo el PATH antes de que ejecute el java, parece que funciona.
Stabledog
15
Hay un pequeño rincón oscuro: el maestro jenkins almacena en caché las variables de entorno de los esclavos para parchear las personalizaciones. Entonces, si cambia las variables de entorno en un esclavo (sistema o usuario), debe reiniciar el maestro para actualizar la configuración de los esclavos.
Thinkeye
36

Seguí encontrándome con este problema, pero ahora solo agrego:

source /etc/profile

Como primer paso en mi proceso de construcción. Ahora todas mis reglas posteriores están cargadas para que Jenkins funcione sin problemas.

bryan kennedy
fuente
6
¿Eh? En detalle, por favor ... ¿añades dónde? ¿cómo? cuando? ¿Funciona en Windows?
HX_unbanned
Supongo que está ejecutando un comando de shell como parte de su compilación. Ponga source /etc/profilecomo primer comando en ese área de texto de Build> Execute Shell> Command.
bryan kennedy
2
Funciona en Mac, también encontré rutas como /usr/local/binse especifica en /etc/paths, y /etc/pathses utilizada por /usr/libexec/path_helper, y path_helper se ejecuta en /etc/profile.
hiroshi
1
me salvaste el día :)
RameshVel
Sourcing / etc / profile muestra la ruta al agregar una depuración de 'echo $ PATH' en el trabajo, pero si miro las variables de entorno del trabajo, no es lo mismo.
Elijah Lynn
23

También puede editar el /etc/sysconfig/jenkinsarchivo para realizar cambios en las variables de entorno, etc. Simplemente lo agregué source /etc/profileal final del archivo. /etc/profiletiene todas las PATHvariables adecuadas . Cuando haga esto, asegúrese de reiniciar Jenkins

/etc/init.d/jenkins restart

Estamos ejecutando ZendServer CE que instala pear, phing, etc. en una ruta diferente, así que esto fue útil. Además, no obtenemos los LD_LIBRARY_PATHerrores que solíamos tener con el cliente Oracle y Jenkins.

dbiehl
fuente
Este es un comentario clave, o reinicie jenkins desde {jenkins-url} / restart o {jenkins-url} / safeRestart. Me estaba golpeando la cabeza sobre por qué no se recogieron los cambios de ruta, editando incluso / etc / environment en el host de ubuntu; RESTART lo solucionará, como lo verifica {jenkins-url} /
systemInfo
Todos los demás fallaron, ¡este es el único que funcionó! ¡Ojalá fuera más frecuente para no haber desperdiciado las últimas horas!
Brad Bonkoski
15

Probé /etc/profile, ~/.profiley ~/.bash_profileninguno de los que trabajé. Encontré que la edición ~/.bashrcpara la cuenta esclava de Jenkins sí.

mmacvicar
fuente
3
eso es porque el shell sin inicio de sesión no lee ni /etc/profileni~/.profile
Vincenzo
9

La información de esta respuesta está desactualizada. Debe ir a Configurar Jenkins> Y luego puede hacer clic para agregar un par clave-valor de Variable de entorno desde allí.

por ejemplo: export MYVAR=testsería MYVARla clave y testes el valor.

TJ Biddle
fuente
5

En mi instancia EC2 más reciente, simplemente agregar el nuevo valor a la RUTA .profile del usuario de Jenkins y luego reiniciar Tomcat funcionó para mí.

En una instancia anterior donde la configuración es diferente, usar el n. ° 2 de la respuesta de Sagar fue lo único que funcionó (es decir, .profile, .bash * no funcionó).

Rob Barreca
fuente
4

Encontré dos complementos para eso. Uno carga los valores de un archivo y el otro le permite configurar los valores en la pantalla de configuración del trabajo.

Complemento Envfile : este complemento le permite establecer variables de entorno a través de un archivo. El formato del archivo debe ser el formato de archivo de propiedades estándar de Java.

Complemento EnvInject : este complemento permite agregar variables de entorno y ejecutar un script de configuración para configurar un entorno para el trabajo.

Vicro
fuente
4

¿No podría simplemente agregarlo como una variable de entorno en la configuración de Jenkins?

Administre Jenkins -> Propiedades globales> Variables de entorno: y luego haga clic en "Agregar" para agregar una ruta de propiedad y su valor a lo que necesita.

Kiarash Zamanifar
fuente
1
Parece ser "Administrar Jenkins -> Configurar sistema -> Variables de entorno" en la versión 1.620.
akaihola
4

Así es como resolví este molesto problema:

Cambié la PATHvariable como sugirió @sagar en su segunda opción, pero aún así obtuve un PATHvalor diferente al que esperaba.

¡Finalmente descubrí que era el EnvInjectcomplemento el que reemplazaba mi PATHvariable!

Así que podría desinstalarlo EnvInjecto simplemente usarlo para inyectar la variable PATH.

Como muchos de nuestros trabajos de Jenkins usan ese complemento, no quería desinstalarlo ...

Así que creé un archivo: environment_variables.propertiesbajo mi directorio de inicio de Jenkins.

Este archivo contiene el valor de entorno de ruta que necesitaba: PATH=$PATH:/usr/local/git/bin/.

Desde la interfaz web Jenkins: Manage Jenkins -> Configure System. En esa pantalla - I marcado la Prepare jobs environmentopción, y en el Properties File Pathcampo entré en el camino a mi archivo: /var/lib/jenkins/environment_variables.properties.

De esta manera, cada trabajo de Jenkins que tenemos recibe las variables que pongo en este environment_variables.propertiesarchivo.

ofirbt
fuente
1
Esta debería ser la respuesta correcta. Como se indicó, la actualización de / etc / profile no es una solución factible en OSX ya que el archivo es de solo lectura y requiere jugar con los permisos. Esta solución parece la más limpia y utiliza complementos ya existentes en Jenkins. Recuerde reiniciar jenkins una vez que cree su archivo de propiedades y
configúrelo
3

Jenkins también admite el formato PATH+<name>para anteponer a cualquier variable, no solo a PATH:

Variables de entorno global o variables de entorno de nodo:

Variable de Jenkins + notación

Esto también se admite en el paso de canalización withEnv:

node {
  withEnv(['PATH+JAVA=/path/to/java/bin']) {
    ...
  }
}

Solo toma nota, se antepone a la variable. Si debe agregarse, debe hacer lo que muestran las otras respuestas.

Consulte el documento de pasos de la canalización aquí .

También puede usar la sintaxis PATH + WHATEVER = / algo para anteponer / algo a $ PATH

O los documentos de Java en EnvVars aquí .

CJCombrink
fuente
2

Solo tuve progreso en este problema después de "/etc/init.d/jenkins force-reload". Recomiendo probar eso antes que nada, y usarlo en lugar de reiniciar.

René Wooller
fuente
1
¿Y dónde agregaste realmente el elemento PATH? He probado todos los lugares que puedo imaginar.
Stabledog
2

En mi Ubuntu 13.04, probé bastantes ajustes antes de tener éxito con esto:

  1. Editar /etc/init/jenkins.conf
  2. Localice el lugar donde comienza "exec start-stop-server ..."
  3. Inserte la actualización del entorno justo antes de eso, es decir

export PATH = $ PATH: / some / new / path / bin

Perro estable
fuente
2

Añadir

/usr/bin/bash

a

Jenkins -> Administrar Jenkins -> configurar sistema -> Shell-> Shell ejecutable

Jenkins usa sh para que ni siquiera / etc / profile funcione para mí. Cuando agrego esto, tengo todos los archivos env.

sumang_87
fuente
¿En qué versión de Jenkins te funcionó esto @ sumang_87? No me ayudó en Jenkins 2.9
hamx0r
1

Solución que funcionó para mí

source ~/.bashrc

Explicación

Primero verifiqué que Jenkins estaba ejecutando BASH, con echo $SHELLy echo $BASH(tenga en cuenta que estoy colocando explícitamente #!/bin/bashencima del área de texto en Jenkins, no estoy seguro de si ese es un requisito para obtener BASH). sourceing /etc/profilecomo otros sugirieron no estaba funcionando.

Mirando /etc/profileencontré

if [ "$PS1" ]; then
...

e inspeccionando "$ PS1" lo encontró nulo. Traté de falsificar $PS1en vano como tal

export PS1=1
bash -c 'echo $PATH'

sin embargo, esto no produjo el resultado deseado (agregue el resto de lo $PATHque espero ver). Pero si le digo a bash que sea interactivo

export PS1=1
bash -ci 'echo $PATH'

el $PATHfue alterado como esperaba.

Estaba tratando de descubrir cómo falsificar correctamente un shell interactivo /etc/bash.bashrcpara cargarlo, sin embargo, resultó que todo lo que necesitaba estaba abajo ~/.bashrc, así que simplemente sourceresolvió el problema.

quickshiftin
fuente
Asegúrese de usar #!/bin/bash -elpara decirle a bash que se inicie como un shell de inicio de sesión. Eso debería hacer que bash obtenga los archivos .rc necesarios
Brandon
1

Probé todas las cosas de arriba, no funcionó para mí.

Encontré dos soluciones (ambas para SSH-Slave)

  1. Ir a la configuración de esclavos

  2. Agregar una nueva variable de entorno

  3. CAMINO
  4. $ {PATH}: $ {HOME} /. Pub-cache / bin: $ {HOME} /. Local / bin

La parte "$ {HOME}" es importante. Esto hace que el PATH adicional sea absoluto. El camino relativo no funcionó para mí.

Opción II (pipeline-script)

pipeline {
    agent {
        label 'your-slave'
    }
    environment {
        PATH = "/home/jenkins/.pub-cache/bin:$PATH"
    }
    stages {
        stage('Test') {
            steps {
                ansiColor('xterm') {
                    echo "PATH is: $PATH"
                }
            }
        }
    }
}
Mike Mitterer
fuente
0

En Ubuntu, simplemente edito / etc / default / jenkins y agrego la fuente / etc / profile al final y me funciona.

Arx Cruz
fuente
0

La ejecución del comando con el conjunto de variables de entorno también es eficaz. Por supuesto, debe hacerlo para cada comando que ejecute, pero probablemente tenga un script de trabajo, por lo que probablemente solo tenga un comando por compilación. Mi secuencia de comandos de trabajo es una secuencia de comandos de Python que usa el entorno para decidir qué Python usar, por lo que aún necesitaba poner /usr/local/bin/python2.7 en su ruta:

PATH=/usr/local/bin <my-command>
Joshua Richardson
fuente
0

Lo que funcionó para mí fue anular el entorno PATH para el esclavo.

Set:   PATH 
To:    $PATH:/usr/local/bin

Luego desconectando y volviendo a conectar el esclavo.

A pesar de lo que mostraba la información del sistema, funcionó.

Mate
fuente
0

Tengo Jenkins 1.639 instalado en SLES 11 SP3 a través de zypper (el administrador de paquetes). La instalación configuró jenkins como servicio

 # service jenkins
 Usage: /etc/init.d/jenkins {start|stop|status|try-restart|restart|force-reload|reload|probe}

Aunque las /etc/init.d/jenkinsfuentes /etc/sysconfig/jenkins, las variables env establecidas allí no son heredadas por el proceso de jenkins porque se inicia en un shell de inicio de sesión separado con un nuevo entorno como este:

startproc -n 0 -s -e -l /var/log/jenkins.rc -p /var/run/jenkins.pid -t 1 /bin/su -l -s /bin/bash -c '/usr/java/default/bin/java -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --javaHome=/usr/java/default --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --httpPort=8080 --ajp13Port=8009 --debug=9 --handlerCountMax=100 --handlerCountMaxIdle=20 &' jenkins

La forma en que logré configurar env vars para el proceso jenkins es a través .bashrcde su directorio de inicio - /var/lib/jenkins. Tuve que crear /var/lib/jenkins/.bashrcya que no existía antes.

Peter Dotchev
fuente
0

Esto es lo que hice en ubuntu 18.04 LTS con Jenkins 2.176.2

Creé el archivo .bash_aliases y agregué allí la ruta, las variables de proxy, etc.

Al comienzo de .bashrc estaba esto definido.

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

Por lo tanto, está comprobando que si iniciamos un shell no interactivo, no hagamos nada aquí.

parte inferior del .bashrc se incluyó para .bash_aliases

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

así que moví .bash_aliases cargando primero en .bashrc justo encima de la verificación no interactiva.

Esto no funcionó primero, pero luego desconecté el esclavo y lo volví a conectar para que vuelva a cargar las variables. No es necesario reiniciar jenkins completo si está modificando variables esclavas. simplemente desconecte y vuelva a conectar.

Juge
fuente
-1

1- agregue a su archivo de perfil el archivo ".bash_profile"

está en la carpeta "/ home / your_user /"

vi .bash_profile

añadir:

export JENKINS_HOME=/apps/data/jenkins  
export PATH=$PATH:$JENKINS_HOME

==> es el espacio de trabajo de e jenkins

2- Si usa embarcadero: vaya al archivo jenkins.xml

y añadir :

<Arg>/apps/data/jenkins</Arg>
Fadid
fuente