Como definir variáveis ​​de ambiente no Jenkins?

228

Eu gostaria de poder fazer algo como:

AOEU=$(echo aoeu)

e mande Jenkins AOEU=aoeu.

A seção Variáveis ​​de ambiente em Jenkins não faz isso. Em vez disso, ele define AOEU='$(echo aoeu)'.

Como faço para que Jenkins avalie um comando shell e atribua a saída a uma variável de ambiente?

Eventualmente, desejo poder atribuir o executor de um trabalho a uma variável de ambiente que possa ser passada ou usada por outros scripts.

Noel Yap
fonte
2
O plug-in EnvInject está com algumas sérias vulnerabilidades de segurança. Agora Jenkins é ter suporte embutido para esta stackoverflow.com/a/53430757/1753177
lambodar
@lambodar o link só vai para a pergunta
Z. Cochrane
@ Z.Cochrane, é um link para uma resposta que foi excluída pelo autor.
Noel Yap

Respostas:

217

Isso pode ser feito através do plugin EnvInject da seguinte maneira:

  1. Crie uma etapa de compilação "Executar shell" que execute:

    echo AOEU=$(echo aoeu) > propsfile
    
  2. Crie uma etapa de criação de variáveis ​​de ambiente Inject e defina "Caminho do arquivo de propriedades" como propsfile.

Nota : Este plug-in (principalmente) não é compatível com o plug-in Pipeline.

malenkiy_scot
fonte
4
O EnvInject não lida com a situação que eu forneci acima: [EnvInject] - Injetando como variáveis ​​de ambiente as propriedades content AOEU = $ (echo aoeu) [EnvInject] - Variáveis ​​injetadas com sucesso. [EnvInject] - Desativa a variável 'AOEU' não resolvida.
9119 Noel Yap
1
Essa solução usa a sintaxe do shell Unix e não funciona no Windows.
Fbmd 16/04
2
@fbmd Estou executando no Windows. Você só precisa ter certeza de que está shno caminho.
Custodio
2
EnvInject não funciona se o "executar shell" sair com um erro porque a compilação não prossegue para a parte da injeção.
Chadi
1
@ Vitim.us, fooserão exportados nessa ação específica do shell, mas não em outras ações.
Noel Yap
109

A maneira mais simples

Você pode usar o plug - in EnvInject para injetar variáveis ​​de ambiente na inicialização da compilação. Por exemplo:

Adicione key = value (bash OK!) Em 'Build Environment' -> 'Injete variáveis ​​de ambiente no processo de build' -> 'Properties Content'

Como você sabe que está funcionando

EnvInject - Variáveis ​​injetadas com sucesso

kenny_k
fonte
5
Tente definir o valor com base na saída de um comando shell.
Noel Yap
1
O @NoelYap também funciona, desde que no final a linha seja avaliada key=value. No meu caso uso I gerar a linha 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 que versão do EnvInject você está usando? Com 1.91.3, um comando como o seu é interpretado como "cat = app ...". Seria ótimo se esse recurso fosse suportado, mas estou sentindo que isso pode ter funcionado para você por acidente.
Killthrush
1
tentar atribuir um valor para a saída de um comando shell não está funcionando para mim também: BUILD_DATE=date "+%Y-%m-%d-%H_%M_%S"e BUILD_DATE=$(date "+%Y-%m-%d-%H_%M_%S")e BUILD_DATE=`date "+%Y-%m-%d-%H_%M_%S"`não funcionou para mim
scottysseus
1
@scottyseus Acabei usando este wiki.jenkins-ci.org/display/JENKINS/Environment+Script+Plugin funcionou como um encanto. stackoverflow.com/a/38286383/1240268
Andy Hayden
56

No meu caso, eu precisava adicionar a JMETER_HOMEvariável de ambiente para estar disponível através dos meus scripts de construção Ant em todos os projetos no meu servidor Jenkins (Linux), de uma maneira que não interferisse no meu ambiente de construção local (Windows e Mac) no build.xmlscript . Definir a variável de ambiente por meio das propriedades Gerenciar Jenkins - Configurar Sistema - Global foi a maneira mais fácil e menos invasiva de fazer isso. Nenhum plug-in é necessário.

Gerenciar propriedades globais do Jenkins


A variável de ambiente está disponível no Ant via:

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

Isso pode ser verificado para os trabalhos adicionando:

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

O que produz:

Página inicial do JMeter: ~ / .jmeter

vallismortis
fonte
Essa é uma propriedade global. Isso afetará TODOS os trabalhos no Jenkins. Suponha que eu só quero essa propriedade para um emprego?
IgorGanapolsky
Adicionei às propriedades Manage Jenkins - Configure System - Global, o seguinte: git /path/to/my/gite PATH+git /path/to/my/git. No entanto, se eu estou tentando o acesso gitdo um Jenkins pipeline script, eu recebo: /bin/sh: git: command not found.
Octavian
1
Eu só precisava configurar a variável de ambiente JAVA_HOME e essa resposta foi a que me ajudou.
Sandoval0992
19

Você pode usar o Plug - in do Injetor de ambiente para definir variáveis ​​de ambiente no Jenkins nos níveis de tarefa e nó. Abaixo, mostrarei como configurá-los no nível do trabalho.

  1. Na interface da web do Jenkins, acesse Manage Jenkins > Manage Pluginse instale o plug-in.

Plugin de Injetor de Ambiente

  1. Vá para a Configuretela do seu trabalho
  2. Localize Add build stepna Buildseção e selecioneInject environment variables
  3. Defina a variável de ambiente desejada como padrão VARIABLE_NAME = VALUE. No meu caso, alterei o valor da variável USERPROFILE

insira a descrição da imagem aqui

Se você precisar definir uma nova variável de ambiente, dependendo de algumas condições (por exemplo, parâmetros do trabalho), poderá consultar esta resposta .

Ayaz Alifov
fonte
16

Você pode tentar algo como isto

stages {
        stage('Build') {
            environment { 
                    AOEU= sh (returnStdout: true, script: 'echo aoeu').trim()
                }
            steps {
                sh 'env'
                sh 'echo $AOEU'
            }
        }
    }
JSixface
fonte
Isso não analisa.
rjurney
2
Esta formatt é para o projeto de pipeline Jenkinsfile. Em que tipo de trabalho você está usando este trecho?
precisa saber é
1
Isso funciona perfeitamente em um Jenkinsfilepara um pipeline (não trabalho)! Isso é incrível, obrigado por isso!
Mathielo # 4/18
14

EnvInject Plugin tcp ( Environment Injector Plugin ), oferece várias opções para definir variáveis ​​de ambiente na configuração do Jenkins.

Ao selecionar, Inject environment variables to the build processvocê receberá:

  • Properties File Path
  • Properties Content
  • Script File Path

  • Script Content

  • e, finalmente Evaluated Groovy script.


Evaluated Groovy scriptoferece a possibilidade de definir variável de ambiente com base no resultado do comando executado :

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

(Mais detalhes sobre cada método podem ser encontrados na ajuda interna (?))


Infelizmente, você não pode fazer o mesmo, Script Contentcomo afirma:

Execute um arquivo de script destinado a definir um ambiente, como criar pastas, copiar arquivos, etc. Forneça o conteúdo do arquivo de script. Você pode usar as variáveis ​​de propriedades acima. No entanto, a adição ou substituição de variáveis ​​de ambiente no script não afeta o trabalho de construção .

luka5z
fonte
12

Existe o Build Env Propagator Plugin, que permite adicionar novas variáveis ​​de ambiente de compilação, por exemplo

Jenkins Build - Propagar variáveis ​​de ambiente de construção

Qualquer etapa sucessiva de variáveis ​​de ambiente de construção do Propagate substituirá os valores das variáveis ​​de ambiente definidas anteriormente.

kenorb
fonte
Obrigado! O Plug-in do Propagador do Build Env funcionou quando o experimentei, e é ótimo ter a capacidade de definir variáveis ​​de ambiente durante as etapas de Build!
twasbrillig
10

No meu caso, eu tinha configurado variáveis ​​de ambiente usando a seguinte opção e funcionou-

Manage Jenkins -> Configure System -> Global Properties -> Environment Variables -> Add
nik
fonte
Esta é a melhor maneira
Long Nguyen
7

Normalmente, você pode configurar variáveis ​​de ambiente nas propriedades globais em Configurar sistema .

No entanto, para variáveis ​​dinâmicas com substituição de shell, convém criar um arquivo de script no diretório Jenkins HOME e executá-lo durante a compilação. O acesso SSH é necessário. Por exemplo.

  1. Faça o login como Jenkins: sudo su - jenkinsousudo su - jenkins -s /bin/bash
  2. Crie um script de shell, por exemplo:

    echo 'export VM_NAME="$JOB_NAME"' > ~/load_env.sh
    echo "export AOEU=$(echo aoeu)" >> ~/load_env.sh
    chmod 750 ~/load_env.sh
    
  3. No Jenkins Build ( Executar shell ), chame o script e suas variáveis ​​antes de qualquer outra coisa, por exemplo

    source ~/load_env.sh
    
kenorb
fonte
infelizmente não funcionou para mim. depois sudo su - jenkins, ainda echo $USERme dá root.
Prayagupd
@prayagupd Você precisa simular um login completo; portanto, use o su -lparâmetro para fazer isso; caso contrário, faça uma pergunta separada.
Kenorb # 9/17
@kenorb depois de invocar o script, como leio a variável env novamente? por exemplo, isso não faz sh trabalho "" "source ~ / load_env.sh echo "VM_NAME: $ VM_NAME" echo "VM_NAME: $ {VM_NAME}" """
Aung
7

Este é o trecho para armazenar a variável de ambiente e acessá-la.

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

Nota: O valor da variável de ambiente está vindo como uma String. Se você quiser usá-lo como um booleano, precisará analisá-lo usando Boolean.parse (env.DISABLE_SQL).

barotdeep
fonte
4

Experimente o Environment Script Plugin ( GitHub ), que é muito semelhante ao EnvInject . Ele permite que você execute um script antes da construção (após o check-out do SCM) que gera variáveis ​​de ambiente para ele. Por exemplo

Jenkins Build - Trabalho regular - Build Environment

e no seu script, você pode imprimir, por exemplo, FOO=barna saída padrão para definir essa variável.

Exemplo para anexar a uma PATHvariável -style existente :

echo PATH+unique_identifier=/usr/local/bin

Portanto, você pode fazer o que precisar no script - catum arquivo ou executar um script em outro idioma da árvore de fontes do projeto, etc.

kenorb
fonte
1

Você pode usar uma das seguintes maneiras listadas abaixo:

  1. Use o Env Inject Plugin para criar variáveis ​​de ambiente. Siga isto para uso e mais detalhes https://github.com/jenkinsci/envinject-plugin
    1. Navegue abaixo e pode adicionar

Gerenciar Jenkins -> Configurar Sistema -> Propriedades Globais -> Variáveis ​​de Ambiente -> Adicionar

insira a descrição da imagem aqui

Sumit
fonte
0

Por alguma razão sudo su - jenkinsnão me registra no jenkins usuário , acabei usando uma abordagem diferente.

Consegui definir as variáveis ​​globais env usando jenkins config.xmlem /var/lib/jenkins/config.xml(instalado no Linux / RHEL) - sem usar plugins externos.

Eu simplesmente tive que parar o jenkins add, add globalNodePropertiese, em seguida, reiniciar.

Exemplo, estou definindo variáveis APPLICATION_ENVIRONMENTe SPRING_PROFILES_ACTIVEpara continious_integrationabaixo,

<?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
fonte
-3

Usamos o arquivo de trabalho groovy:

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