¿Cómo establecer variables de entorno en Jenkins?

228

Me gustaría poder hacer algo como:

AOEU=$(echo aoeu)

y tener a Jenkins listo AOEU=aoeu.

La sección de Variables de entorno en Jenkins no hace eso. En cambio, se establece AOEU='$(echo aoeu)'.

¿Cómo puedo hacer que Jenkins evalúe un comando de shell y asigne la salida a una variable de entorno?

Eventualmente, quiero poder asignar al ejecutor de un trabajo a una variable de entorno que otros scripts pueden pasar o utilizar.

Noel Yap
fuente
2
El complemento EnvInject tiene una vulnerabilidad de seguridad grave. Ahora Jenkins tiene soporte incorporado para este stackoverflow.com/a/53430757/1753177
lambodar
@lambodar el enlace solo va a la pregunta
Z. Cochrane
@ Z.Cochrane, es un enlace a una respuesta que ha sido eliminada por el autor.
Noel Yap

Respuestas:

217

Esto se puede hacer a través del complemento EnvInject de la siguiente manera:

  1. Cree un paso de compilación "Ejecutar shell" que se ejecute:

    echo AOEU=$(echo aoeu) > propsfile
    
  2. Cree un paso de compilación de variables de entorno Inject y establezca "Ruta del archivo de propiedades" en propsfile.

Nota : este complemento (en su mayoría) no es compatible con el complemento Pipeline.

malenkiy_scot
fuente
44
EnvInject no maneja la situación que di anteriormente: [EnvInject] - Inyectando como variables de entorno el contenido de propiedades AOEU = $ (echo aoeu) [EnvInject] - Variables inyectadas con éxito. [EnvInject] - Desarma la variable 'AOEU' no resuelta.
Noel Yap
1
Esa solución utiliza la sintaxis de shell de Unix y no funcionará en Windows.
fbmd
2
@fbmd Lo estoy ejecutando en Windows. Solo necesita asegurarse de tener shen el camino.
Custodio
2
EnvInject no funciona si el "shell de ejecución" sale con un error porque la compilación no procede a la parte de inyección.
Chadi
1
@ Vitim.us, foose exportará en esa acción de shell específica pero no en otras acciones.
Noel Yap
109

La forma más simple

Puede usar el complemento EnvInject para inyectar variables de entorno al inicio de la compilación. Por ejemplo:

Agregue clave = valor (bash OK!) En 'Entorno de compilación' -> 'Inyectar variables de entorno al proceso de compilación' -> 'Contenido de propiedades'

¿Cómo sabes que está funcionando?

EnvInject - Variables inyectadas exitosamente

kenny_k
fuente
55
Intente establecer el valor en función de la salida de un comando de shell.
Noel Yap
1
@NoelYap también funciona, siempre y cuando al final la línea evalúe key=value. En mi caso de uso, genero la línea completamente: cat app/build.gradle | grep "def majorVersion" | python -c 'import sys,re,os; print("VERSION_NUMBER="+re.findall(r"[\d+\.]+", sys.stdin.read())[0]+os.environ["BUILD_NUMBER"])'
kenny_k
@ theFunkyEngineer ¿qué versión de EnvInject estás usando? Con 1.91.3, un comando como el suyo se interpreta como "cat = app ...". Sería genial si esta función fuera compatible, pero tengo la sensación de que puede haber funcionado para usted por accidente.
killthrush
1
intentar asignar un valor a la salida de un comando shell no está funcionando para mí, ya sea: BUILD_DATE=date "+%Y-%m-%d-%H_%M_%S"y BUILD_DATE=$(date "+%Y-%m-%d-%H_%M_%S")y BUILD_DATE=`date "+%Y-%m-%d-%H_%M_%S"`no funcionó para mí
scottysseus
56

En mi caso, necesitaba agregar la JMETER_HOMEvariable de entorno para estar disponible a través de mis scripts de compilación Ant en todos los proyectos en mi servidor Jenkins (Linux), de manera que no interfiriera con mi entorno de compilación local (Windows y Mac) en el build.xmlscript . Establecer la variable de entorno a través de Administrar Jenkins - Configurar sistema - Las propiedades globales fue la forma más fácil y menos intrusiva de lograr esto. No se necesitan complementos.

Administrar propiedades globales de Jenkins


La variable de entorno está disponible en Ant a través de:

<property environment="env" />
<property name="jmeter.home" value="${env.JMETER_HOME}" />

Esto puede verificarse para que funcione agregando:

<echo message="JMeter Home: ${jmeter.home}"/>

Que produce:

JMeter Inicio: ~ / .jmeter

vallismortis
fuente
Esa es una propiedad global. Afectará TODOS los trabajos en Jenkins. ¿Supongo que solo quiero esta propiedad para un trabajo?
IgorGanapolsky
He agregado a Manage Jenkins - Configure System - Global properties, lo siguiente: git /path/to/my/gity PATH+git /path/to/my/git. Sin embargo, si estoy intentando accedergit desde la una Jenkins pipeline script, me sale: /bin/sh: git: command not found.
octaviano
1
Solo necesitaba configurar la variable de entorno JAVA_HOME y esta respuesta fue la que me ayudó.
Sandoval0992
19

Puede usar el complemento Inyector de entorno para establecer variables de entorno en Jenkins en los niveles de trabajo y nodo. A continuación, mostraré cómo configurarlos a nivel de trabajo.

  1. Desde la interfaz web de Jenkins, vaya Manage Jenkins > Manage Pluginse instale el complemento.

Plugin de inyector de entorno

  1. Ve a tu trabajo Configure pantalla de
  2. Busca Add build stepen la Buildsección y seleccionaInject environment variables
  3. Establezca la variable de entorno deseada como VARIABLE_NAME = patrón VALOR. En mi caso, cambié el valor de la variable USERPROFILE

ingrese la descripción de la imagen aquí

Si necesita definir una nueva variable de entorno dependiendo de algunas condiciones (por ejemplo, parámetros del trabajo), puede consultar esta respuesta .

Ayaz Alifov
fuente
16

Puedes probar algo como esto

stages {
        stage('Build') {
            environment { 
                    AOEU= sh (returnStdout: true, script: 'echo aoeu').trim()
                }
            steps {
                sh 'env'
                sh 'echo $AOEU'
            }
        }
    }
JSixface
fuente
Esto no analiza.
rjurney
2
Este formato es para el proyecto de tubería Jenkinsfile. ¿En qué tipo de trabajo está utilizando este fragmento?
JSixface
1
¡Esto funciona perfectamente en una Jenkinsfiletubería (no trabajo)! Eso es genial, gracias por eso!
mathielo
14

EnvInject Plugin también conocido como ( Environment Injector Plugin ) le ofrece varias opciones para establecer variables de entorno desde la configuración de Jenkins.

Al seleccionar Inject environment variables to the build processobtendrá:

  • Properties File Path
  • Properties Content
  • Script File Path

  • Script Content

  • y finalmente Evaluated Groovy script.


Evaluated Groovy scriptle brinda la posibilidad de establecer una variable de entorno basada en el resultado del comando ejecutado :

  • con executemétodo:
    return [HOSTNAME_SHELL: 'hostname'.execute().text, 
        DATE_SHELL: 'date'.execute().text,
        ECHO_SHELL: 'echo hello world!'.execute().text
    ]
  • o con Groovycódigo explícito :
    return [HOSTNAME_GROOVY: java.net.InetAddress.getLocalHost().getHostName(),
        DATE_GROOVY: new Date()
    ] 

(Se pueden encontrar más detalles sobre cada método en la ayuda integrada (?))


Lamentablemente no puedes hacer lo mismo Script Contentcomo dice:

Ejecute un archivo de script destinado a configurar un entorno como la creación de carpetas, la copia de archivos, etc. Dar el contenido del archivo de script. Puede usar las variables de propiedades anteriores. Sin embargo, agregar o anular variables de entorno en el script no tiene ningún impacto en el trabajo de compilación .

luka5z
fuente
12

Hay Build Env Propagator Plugin que le permite agregar nuevas variables de entorno de compilación, p. Ej.

Jenkins Build: propaga variables de entorno de compilación

Cualquier paso sucesivo de variables de entorno de compilación de Propagate anulará los valores de variables de entorno previamente definidos.

kenorb
fuente
¡Gracias! Build Env Propagator Plugin funcionó cuando lo probé, ¡y es genial tener la capacidad de establecer variables de entorno durante los pasos de Build!
twasbrillig
10

En mi caso, configuré variables de entorno usando la siguiente opción y funcionó:

Manage Jenkins -> Configure System -> Global Properties -> Environment Variables -> Add
nik
fuente
Esta es la mejor manera
Long Nguyen
7

Normalmente, puede configurar variables de entorno en propiedades globales en Configurar sistema .

Sin embargo, para las variables dinámicas con sustitución de shell, es posible que desee crear un archivo de secuencia de comandos en el directorio HOME de Jenkins y ejecutarlo durante la compilación. Se requiere el acceso SSH. Por ejemplo.

  1. Inicie sesión como Jenkins: sudo su - jenkinsosudo su - jenkins -s /bin/bash
  2. Cree un script de shell, por ejemplo:

    echo 'export VM_NAME="$JOB_NAME"' > ~/load_env.sh
    echo "export AOEU=$(echo aoeu)" >> ~/load_env.sh
    chmod 750 ~/load_env.sh
    
  3. En Jenkins Build ( Ejecutar shell ), invoque el script y sus variables antes que cualquier otra cosa, p. Ej.

    source ~/load_env.sh
    
kenorb
fuente
Lamentablemente no funcionó para mí. despues sudo su - jenkins, aun echo $USERme da root.
prayagupd
@prayagupd Debe simular un inicio de sesión completo, así que use el su -lparámetro para hacerlo, de lo contrario haga una pregunta por separado.
kenorb
@kenorb después de invocar el script, ¿cómo leo nuevamente la variable env? por ejemplo, esto no funciona sh "" "source ~ / load_env.sh echo" VM_NAME: $ VM_NAME "echo" VM_NAME: $ {VM_NAME} "" ""
aung
7

Este es el fragmento para almacenar la variable de entorno y acceder a ella.

node {
   withEnv(["ENABLE_TESTS=true", "DISABLE_SQL=false"]) {
      stage('Select Jenkinsfile') {
          echo "Enable test?: ${env.DEVOPS_SKIP_TESTS}
          customStep script: this
      }
   }
}

Nota: El valor de la variable de entorno viene como una cadena. Si desea usarlo como booleano, debe analizarlo usando Boolean.parse (env.DISABLE_SQL).

barotdeep
fuente
4

Pruebe Environment Script Plugin ( GitHub ), que es muy similar a EnvInject . Le permite ejecutar un script antes de la compilación (después del pago de SCM) que genera variables de entorno para él. P.ej

Jenkins Build - Trabajo regular - Build Environment

y en su guión, puede imprimir, por ejemplo FOO=bar a la salida estándar para establecer esa variable.

Ejemplo para agregar a una PATHvariable de estilo existente :

echo PATH+unique_identifier=/usr/local/bin

Por lo tanto, puede hacer lo que necesite en el script, ya sea catun archivo o ejecutar un script en otro idioma desde el árbol fuente de su proyecto, etc.

kenorb
fuente
1

Puede utilizar cualquiera de las siguientes formas enumeradas a continuación:

  1. Use Env Inject Plugin para crear variables de entorno. Siga esto para uso y más detalles https://github.com/jenkinsci/envinject-plugin
    1. Navega a continuación y puedes agregar

Administrar Jenkins -> Configurar sistema -> Propiedades globales -> Variables de entorno -> Agregar

ingrese la descripción de la imagen aquí

Sumit
fuente
0

Por alguna razón sudo su - jenkinsno me registra al jenkins usuario , terminé usando un enfoque diferente.

Tuve éxito al configurar las variables globales env usando jenkins config.xmlen/var/lib/jenkins/config.xml (instalado en Linux / RHEL), sin usar complementos externos.

Simplemente tuve que detener jenkins add, luego add globalNodePropertiesy luego reiniciar.

Ejemplo, estoy definiendo variables APPLICATION_ENVIRONMENTy SPRING_PROFILES_ACTIVEa continious_integrationcontinuación,

<?xml version='1.0' encoding='UTF-8'?>
<hudson>

  <globalNodeProperties>
    <hudson.slaves.EnvironmentVariablesNodeProperty>
      <envVars serialization="custom">
        <unserializable-parents/>
        <tree-map>
          <default>
            <comparator class="hudson.util.CaseInsensitiveComparator"/>
          </default>
          <int>2</int>
          <string>APPLICATION_ENVIRONMENT</string>
          <string>continious_integration</string>
          <string>SPRING_PROFILES_ACTIVE</string>
          <string>continious_integration</string>
        </tree-map>
      </envVars>
    </hudson.slaves.EnvironmentVariablesNodeProperty>
  </globalNodeProperties>
</hudson>
prayagupd
fuente
-3

Usamos un archivo de trabajo maravilloso:

description('')
steps {
    environmentVariables {
        envs(PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true)
    }
}
techguy2000
fuente