Variáveis ​​de ambiente Jenkins / Hudson

101

Estou executando o Jenkins de um usuário que jenkinsfoi $PATHdefinido como algo e quando entro na interface da web do Jenkins, na janela Propriedades do sistema ( http://$host/systemInfo) vejo um diferente $PATH.

Instalei o Jenkins no Centos com o rpm nativo do site do Jenkins. Estou usando o script de inicialização fornecido com a instalação usandosudo /etc/init.d/jenkins start

Alguém pode me explicar por que isso acontece?

Michael
fonte
1
Se você fizer login como jenkins, echo $PATHele corresponde ao que você vê em jenkins?
Upgradingdave
3
@Dave não, não corresponde. não consigo entender por que
Michael
8
A razão pela qual não corresponde é porque quando você faz o login como o usuário jenkins, você invoca um shell de login, enquanto jenkins apenas executa / bin / sh -xe {seu script} para que não seja executado através do mesmo conjunto de scripts que alteram a variável de ambiente PATH. Na verdade, o conjunto de scripts varia de acordo com o tipo particular de * nix e / ou shell que você instalou. Eu testei no AWS Linux AMI com jenkins e infelizmente nenhum dos / etc / profile /etc/profile.d/xxx.sh / etc / bashrc / etc / environment ~ / .bash_profile ~ / .profile ~ / .bashrc foi capaz para afetar o PATH passado para / bin / sh
Lucas

Respostas:

141

Michael,

Duas coisas:

Quando o Jenkins se conecta a um computador, ele vai para o shshell, e não para o bashshell (pelo menos é o que percebi - posso estar errado). Portanto, quaisquer alterações feitas em $ PATH em seu arquivo bashrc não são consideradas.

Além disso, quaisquer mudanças que você fizer em $ PATH em seu shell local (aquele em que você pessoalmente fez ssh) não aparecerão no Jenkins.

Para alterar o caminho que o Jenkins usa, você tem duas opções (AFAIK):

1) Edite seu /etc/profilearquivo e adicione os caminhos que você deseja lá

2) Vá para a página de configuração do seu escravo e adicione a variável de ambiente PATH, com o valor:$PATH:/followed-by/paths/you/want/to/add

Se você usar a segunda opção, as informações do sistema ainda não as mostrarão, mas suas compilações verão os caminhos adicionados.

Sagar
fonte
2
Essa resposta funcionou para mim, mas percebi que Jenkins é muito sensível sobre o que você escreve na página de configuração. Não consegui fazer funcionar com caminhos com espaços.
miguelSantirso
Sim, é, mas quando você insere caminhos com espaços em um shell UNIX, o espaço normalmente é escapado com um caractere ``. Portanto, se o seu caminho for "/ opt / bin / My Folder Name", você pode tentar "/ opt / bin / My \ Folder \ Name". Isso escapará dos espaços e permitirá que você os use.
Sagar
11
A solução 2 é o caminho a percorrer.
gagarine,
2
Acompanhamento: no meu sistema Ubuntu, o serviço jenkins é um trabalho inicial, então eu estava modificando o antigo script stub sysvinit. Lugar errado. Quando ajusto o script /etc/init/jenkins.conf e atualizo o PATH antes do java do exec, isso parece funcionar.
Stabledog
15
Há um pequeno canto escuro: o mestre jenkins armazena em cache as variáveis ​​de ambiente dos escravos para corrigir as personalizações. Portanto, se você alterar as variáveis ​​de ambiente em um escravo (sistema ou usuário), será necessário reiniciar o mestre para atualizar a configuração dos escravos.
Thinkeye
36

Continuei tendo esse problema, mas agora eu apenas adiciono:

source /etc/profile

Como a primeira etapa do meu processo de construção. Agora todas as minhas regras subsequentes estão carregadas para que o Jenkins opere sem problemas.

bryan kennedy
fonte
6
Hã? Em detalhes, por favor ... você adiciona onde? como? quando? Funciona no Windows?
HX_unbanned
Presumo que você esteja executando um comando shell como parte de sua construção. Coloque source /etc/profilecomo o primeiro comando nessa área de texto Build> Execute Shell> Command.
bryan kennedy,
2
Ele funciona no Mac, também encontrei caminhos como /usr/local/biné especificado em /etc/paths, e /etc/pathsé usado por /usr/libexec/path_helper, e path_helper é executado em /etc/profile.
hiroshi
1
você salvou meu dia :)
RameshVel
Sourcing / etc / profile mostra o caminho ao adicionar uma depuração de 'echo $ PATH' no trabalho, mas se eu olhar para as variáveis ​​de ambiente para o trabalho, não é o mesmo.
Elijah Lynn
23

Você também pode editar o /etc/sysconfig/jenkinsarquivo para fazer quaisquer alterações nas variáveis ​​de ambiente, etc. Eu simplesmente adicionei source /etc/profileao final do arquivo. /etc/profiletem todas as PATHconfigurações de variáveis adequadas . Ao fazer isso, certifique-se de reiniciar o Jenkins

/etc/init.d/jenkins restart

Estamos executando o ZendServer CE, que instala o pear, phing, etc. em um caminho diferente, então isso foi útil. Além disso, não recebemos os LD_LIBRARY_PATHerros que costumávamos obter com o cliente Oracle e Jenkins.

dbiehl
fonte
Este é um comentário importante ou reinicie o jenkins em {jenkins-url} / restart ou {jenkins-url} / safeRestart. Eu estava pensando em por que as mudanças de caminho não foram selecionadas, editando até mesmo / etc / environment no ubuntu host - RESTART irá consertar, conforme verificado por {jenkins-url} / systemInfo
kert
Todos os outros falharam, este é o único que funcionou! Eu gostaria que fosse mais prevalente para que eu não tivesse perdido as últimas horas!
Brad Bonkoski
15

Eu tentei /etc/profile, ~/.profilee ~/.bash_profilenada funcionou. Eu descobri que editar ~/.bashrcpara a conta do escravo Jenkins sim.

mmacvicar
fonte
3
isso ocorre porque o shell sem login não lê nem /etc/profilenem~/.profile
Vincenzo
9

As informações nesta resposta estão desatualizadas. Você precisa ir para Configure Jenkins> E você pode clicar para adicionar um par de valores-chave Variável de ambiente a partir daí.

por exemplo: export MYVAR=testseria MYVARé a chave e testé o valor.

TJ Biddle
fonte
5

Na minha instância EC2 mais recente, simplesmente adicionar o novo valor ao PATH do .profile do usuário do Jenkins e reiniciar o tomcat funcionou para mim.

Em uma instância mais antiga onde a configuração é diferente, usar o # 2 da resposta de Sagar foi a única coisa que funcionou (ou seja, .profile, .bash * não funcionou).

Rob Barreca
fonte
4

Encontrei dois plug-ins para isso. Um carrega os valores de um arquivo e o outro permite configurar os valores na tela de configuração do trabalho.

Plugin Envfile - Este plugin permite definir variáveis ​​de ambiente por meio de um arquivo. O formato do arquivo deve ser o formato de arquivo de propriedade Java padrão.

Plugin EnvInject - Este plugin torna possível adicionar variáveis ​​de ambiente e executar um script de configuração para configurar um ambiente para o Job.

Vicro
fonte
4

Você não poderia simplesmente adicioná-lo como uma variável de ambiente nas configurações do Jenkins:

Gerenciar Jenkins -> Propriedades globais> Variáveis ​​de ambiente: Em seguida, clique em "Adicionar" para adicionar um PATH de propriedade e seu valor ao que você precisa.

Kiarash Zamanifar
fonte
1
Parece ser "Gerenciar Jenkins -> Configurar Sistema -> Variáveis ​​de Ambiente" na versão 1.620.
akaihola de
4

Foi assim que resolvi esse problema irritante:

PATHMudei a variável conforme @sagar sugeriu em sua 2ª opção, mas ainda assim obtive um PATHvalor diferente do que esperava.

Acabei descobrindo que foi o EnvInjectplugin que substituiu minha PATHvariável!

Então, eu poderia desinstalar EnvInjectou apenas usá-lo para injetar a variável PATH.

Como muitos de nossos trabalhos do Jenkins usam esse plug-in, eu não queria desinstalá-lo ...

Então, criei um arquivo: environment_variables.propertiesno meu diretório inicial do Jenkins.

Este arquivo contém o valor de ambiente do caminho que eu precisava: PATH=$PATH:/usr/local/git/bin/.

A partir da interface web Jenkins: Manage Jenkins -> Configure System. Nesse ecrã - I assinalada a Prepare jobs environmentopção, e no Properties File Pathcampo entrei no caminho para o meu arquivo: /var/lib/jenkins/environment_variables.properties.

Dessa forma, todos os trabalhos do Jenkins que recebemos recebem quaisquer variáveis ​​que coloquei neste environment_variables.propertiesarquivo.

ofirbt
fonte
1
Esta deve ser a resposta correta. Conforme declarado, atualizar / etc / profile não é uma solução viável no OSX, pois o arquivo é somente leitura e requer alterações nas permissões. Esta solução parece a mais limpa e utiliza plugins já existentes no Jenkins. Lembre-se de reiniciar jenkins depois de criar seu arquivo de propriedades e configurá-lo no Jenkins
Voke Ransom Anighoro
3

Jenkins também suporta o formato PATH+<name>para preceder a qualquer variável, não apenas PATH:

Variáveis ​​de ambiente globais ou variáveis ​​de ambiente de nó:

Variável Jenkins + notação

Isso também é compatível com a etapa do pipeline withEnv:

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

Apenas tome nota, ele precede a variável. Se precisar ser anexado, você precisará fazer o que as outras respostas mostram.

Veja o documento de etapas do pipeline aqui .

Você também pode usar a sintaxe PATH + WHATEVER = / algo para preceder / algo para $ PATH

Ou os documentos java sobre EnvVars aqui .

CJCombrink
fonte
2

Eu só tive progresso neste problema depois de um "/etc/init.d/jenkins force-reload". Eu recomendo tentar isso antes de qualquer coisa, e usar isso ao invés de reiniciar.

Rene Wooller
fonte
1
E onde você realmente adicionou o elemento PATH? Tentei todos os lugares que posso imaginar.
Stabledog
2

No meu Ubuntu 13.04, tentei alguns ajustes antes de conseguir isso:

  1. Edite /etc/init/jenkins.conf
  2. Localize o local onde "exec start-stop-server ..." começa
  3. Insira a atualização do ambiente antes disso, ou seja,

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

Stabledog
fonte
2

Adicionar

/usr/bin/bash

em

Jenkins -> Gerenciar Jenkins -> configurar Sistema -> Shell-> executável Shell

Jenkins usa sh para que mesmo / etc / profile não funcione para mim. Quando eu adiciono isso, tenho todo o env.

sumang_87
fonte
Qual versão do Jenkins funcionou para você @ sumang_87? Não conseguiu me ajudar no Jenkins 2.9
hamx0r
1

Solução que funcionou para mim

source ~/.bashrc

Explicação

Primeiro verifiquei que Jenkins estava executando o BASH, com echo $SHELLe echo $BASH(observe que estou colocando explicitamente #!/bin/bashno topo da textarea no Jenkins, não tenho certeza se isso é um requisito para obter o BASH). sourceing /etc/profilecomo outros sugeriram não estava funcionando.

Olhando /etc/profileeu encontrei

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

e inspecionar "$ PS1" descobriu que era nulo. Eu tentei spoofing $PS1sem sucesso assim

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

no entanto, isso não produziu o resultado desejado (adicione o restante do $PATHque espero ver). Mas se eu disser ao bash para ser interativo

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

o $PATHfoi alterado como eu esperava.

Eu estava tentando descobrir como falsificar adequadamente um shell interativo /etc/bash.bashrcpara carregá-lo, mas descobri que tudo que eu precisava estava lá dentro ~/.bashrc, então simplesmente sourceresolvi o problema.

troca rápida
fonte
Certifique-se de usar #!/bin/bash -elpara dizer ao bash para iniciar como um shell de login. Isso deve fazer com que o bash forneça os arquivos .rc necessários
Brandon
1

Eu tentei todas as coisas de cima - não funcionou para mim.

Encontrei duas soluções (ambas para SSH-Slave)

  1. Vá para as configurações do escravo

  2. Adicionar uma nova variável de ambiente

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

A parte "$ {HOME}" é importante. Isso torna o PATH adicional absoluto. O caminho relativo não funcionou para mim.

Opção 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
fonte
0

No Ubuntu, eu apenas edito / etc / default / jenkins e adiciono a fonte / etc / profile no final e funciona para mim.

Arx Cruz
fonte
0

Executar o comando com a variável de ambiente definida também é eficaz. Claro, você tem que fazer isso para cada comando executado, mas provavelmente tem um script de trabalho, então provavelmente só tem um comando por compilação. Meu script de trabalho é um script python que usa o ambiente para decidir qual python usar, então eu ainda precisava colocar /usr/local/bin/python2.7 em seu caminho:

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

O que funcionou para mim foi substituir o ambiente PATH para o escravo.

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

Em seguida, desconecte e reconecte o escravo.

Apesar do que as informações do sistema mostravam, funcionou.

Matt
fonte
0

Eu tenho Jenkins 1.639 instalado no SLES 11 SP3 via zypper (o gerenciador de pacotes). A instalação configurou jenkins como um serviço

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

Embora sejam /etc/init.d/jenkinsfontes /etc/sysconfig/jenkins, quaisquer variáveis ​​env definidas lá não são herdadas pelo processo jenkins porque ele é iniciado em um shell de login separado com um novo ambiente 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

A maneira como eu consegui definir env vars para o processo jenkins é via .bashrcem seu diretório inicial - /var/lib/jenkins. Tive que criar /var/lib/jenkins/.bashrcporque não existia antes.

Peter Dotchev
fonte
0

Aqui está o que eu fiz no ubuntu 18.04 LTS com Jenkins 2.176.2

Criei o arquivo .bash_aliases e adicionei ali o caminho, as variáveis ​​de proxy e assim por diante.

No início de .bashrc isso estava definido.

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

Portanto, ele está verificando se iniciarmos um shell não interativo, não faremos nada aqui.

parte inferior do .bashrc havia inclusão 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

então movi .bash_aliases carregando primeiro em .bashrc logo acima da verificação não interativa.

Isso não funcionou primeiro, mas depois desconectei o escravo e o reconectei para que ele carregasse as variáveis ​​novamente. Você não precisa reiniciar jenkins inteiros se estiver modificando variáveis ​​escravas. apenas desconecte e reconecte.

Juge
fonte
-1

1- adicione ao seu arquivo de perfil ".bash_profile" o arquivo

está na pasta "/ home / your_user /"

vi .bash_profile

adicionar:

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

==> é o espaço de trabalho e jenkins

2- Se você usar jetty: vá para o arquivo jenkins.xml

e adicione :

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