git pull
não funciona com Jenkins por algum motivo. Atualizei alguns arquivos no meu PC local e enviei para o meu Github. Eu posso ver as mudanças lá. Então eu executo a compilação do Jenkins que tem comandos sh para extrair deste repositório e diz "Já atualizado". O que é falso, pois claramente enviei uma nova versão para o Github e, se eu for lá e abrir o arquivo no meu navegador, posso ver as alterações. Isso só acontece com o Jenkins executando o git pull porque se eu me conectar à minha VM e git pull
me executar, ele funcionará bem e atualizará meus arquivos. Por que isso acontece?
Meu arquivo Jenkins:
pipeline{
agent any
stages{
stage("build"){
steps{
echo 'build'
sh 'cd /var/atlassian/application-data/jira/scripts'
sh 'eval "$(ssh-agent -s)"'
sh 'ssh-add ~/.ssh/id_ed25519'
sh 'git pull [email protected]:mightyajax/scripts.git'
}
}
stage("test"){
steps{
echo 'test'
}
}
stage("deploy"){
steps{
echo 'deploy'
}
}
}
}
Até onde eu sei, cada
sh '...'
comando no Jenkins é executado por meio de um processo /bin/sh separado , portanto, quaisquer alterações no ambiente de nível de processo permanecem apenas enquanto esse comando específico está em execução.Por exemplo, a
cd
linha #1 em 'sh' afeta apenas a primeira instância /bin/sh – assim que essa linha é processada, o shell é encerrado e todas as alterações são perdidas. A linha #2 é então processada em um novo /bin/sh que herda o diretório de trabalho original do Jenkins. (Então você está obtendo resultados errados de "git pull" porque você está no repositório errado naquele momento.)Da mesma forma, quando a linha 'sh' #2 define algumas variáveis de ambiente (nomeadamente SSH_AUTH_SOCK) através do eval, elas também são imediatamente perdidas quando o shell sai, então o 'ssh-add' subsequente não sabe onde o agente está.
Para evitar isso, execute tudo como um único script:
Você também pode evitar a necessidade de um manual
cd
usando a-C
opção dizendo ao Git para fazer isso por conta própria:git -C /var/foo pull <url>
.