Como parte do meu processo de construção, estou executando um commit do git como uma etapa de execução do shell. No entanto, se não houver alterações no espaço de trabalho, o Jenkins falhará na compilação. Isso ocorre porque o git está retornando um código de erro quando não há alterações a serem confirmadas. Gostaria de abortar a compilação ou marcá-la como instável, se esse for o caso. Alguma ideia?
132
Respostas:
Para parar a execução adicional quando o comando falhar:
command || exit 0
Para continuar a execução quando o comando falhar:
command || true
fonte
|| exit 0
no primeiro caso, secommand
retornar false, a execução será interrompida. Dito isto, a segunda opção é muito útil!exit 0
porque qualquer código de saída diferente de zero falhará na compilação.Jenkins está executando as etapas de construção do shell usando
/bin/sh -xe
por padrão.-x
significa imprimir todos os comandos executados.-e
significa sair com falha se algum dos comandos no script falhar.Então, acho que o que aconteceu no seu caso é o comando git exit com 1 e, devido ao
-e
parâmetro padrão , o shell pega o código de saída diferente de 0, ignora o restante do script e marca a etapa como uma falha. Podemos confirmar isso se você puder postar seu script da etapa de construção aqui.Se for esse o caso, você pode tentar colocar
#!/bin/sh
para que o script seja executado sem opção; ou faça umaset +e
coisa semelhante na etapa de compilação para substituir esse comportamento.Editado: Outra coisa a ser observada é que, se o último comando no seu script de shell retornar código diferente de 0 , toda a etapa de compilação ainda será marcada como falha, mesmo com esta configuração. Nesse caso, você pode simplesmente colocar um
echo
comando no final para evitar isso.Outra questão relacionada
fonte
Se não houver nada a ser enviado, o git retorna o status de saída 1. A etapa de execução da construção do shell é marcada como falha, respectivamente. Você pode usar a instrução OR || (tubo duplo).
Isto significa, execute o segundo argumento se falhar primeiro (status de saída retornado> 0). O segundo comando sempre retorna 0. Quando não há nada para pressionar (status de saída 1 -> execute o segundo comando), echo retornará 0 e a etapa de construção continuará.
Para marcar a compilação como instável, você pode usar a etapa de pós-compilação Jenkins Text Finder. Ele pode passar pela saída do console, corresponder ao padrão (seu eco) e marcar a construção como instável.
fonte
Há outra maneira fácil de dizer a Jenkins para não falhar. Você pode isolar seu commit em uma etapa de construção e configurar o shell para não falhar:
fonte
set -e
após o comando que deseja executar, independentemente do código de saída. Caso contrário, você pode acabar executando comandos que não pretende. Eu queria resolver o erro sozinho, então fiz algo como: `set + e commit -m" bla "EXIT_CODE =" $ {?} "Set -e # manipula a lógica do código deJenkins determina o sucesso / falha de uma etapa pelo valor de retorno da etapa. Para o caso de um shell, deve ser o retorno do último valor. Para os shells do Windows CMD e (POSIX) Bash, você deve poder definir o valor de retorno manualmente usando
exit 0
como o último comando.fonte
exit 0
com o comando "execute windows batch command" em várias versões da minha instalação do Windows Jenkins, e funciona conforme o esperado. Algo mais deve estar acontecendo. Você poderia postar a parte relevante do log do console?#!/bin/sh -xv
qual resulta na interrupção do script se algum erro for encontrado.Consegui fazer isso funcionar usando a resposta encontrada aqui:
Como git cometer nada sem um erro?
fonte
git diff
comando, e se isso falhar, faça ogit commit
comando. Basicamente, ele apenas faz o commit, segit diff
encontrou algo a ser confirmado. No entanto, a resposta @jwernerny estava correta e você deveria poder adicionarexit 0
a última declaração para qualquer script para fazer Jenkins tratá-lo como sucesso que eu posso pensar de um cenário em que este seria um fracasso se você estivesse fazendo Linux shell passo, mas em Batch esta deve sempre trabalhar../bin/sh -xe
por padrão, como mencionado aqui (no meio). Então você pode tentar colocar#!/bin/bash
ou fazer umaset +e
em cima da etapa de compilação para substituir esse comportamento, que vai continuar o resto da etapa mesmo um comando dentro de saída com código não-0Na pergunta (mais geral) do título - para impedir que Jenkins falhe, você pode impedir que ele veja o código de saída 1. Exemplo para ping:
E agora você pode, por exemplo, obter a saída do ping:
Claro que em vez de
ping ...
Você pode usar qualquer comando (s) - inclusivegit commit
.fonte
https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#sh-shell-script
se você incluir uma propriedade returnStatus: true, o retorno do shell será ignorado.
fonte
Você pode usar o plug-in Localizador de texto . Isso permitirá que você verifique se há uma expressão de sua escolha no console de saída e marque a compilação como
Unstable
.fonte
Para vários comandos do shell, eu ignoro as falhas adicionando:
set +e commands true
fonte
Se você colocar esses comandos no bloco de shell:
sua compilação será marcada como falha (pelo menos 1 código de saída diferente de zero), para que você possa adicionar (defina + e) para ignorá-la:
não falhará. No entanto, isso falhará mesmo com o (conjunto + e) instalado:
porque o último comando do shell deve sair com 0.
fonte
O seguinte funciona para mercurial apenas confirmando se houver alterações. Portanto, a construção falha apenas se a confirmação falhar.
fonte
Outra resposta, com algumas dicas, pode ser útil para alguém:
lembre-se de separar seus comandos com a seguinte regra :
command1 && command2 - meios, que command2 será executado, somente se o sucesso command1
command1 ;command2 - significa que o comando 2 será executado apesar do resultado do comando1
por exemplo:
será executado com êxito
set -e
e com osecho 0
comandos segmake test
falharem (seus testes falharam), enquanto o seguinte código cortou:um pouco errado e comandos
set -e
eecho 0
in&& gmake test && set -e && echo 0
serão ignorados, com aprintln run_tests
declaração, porque falhagmake test
abortará a construção de jenkins. Como solução alternativa, você pode alternar parareturnStatus:true
, mas perderá a saída do seu comando.fonte
Esta resposta está correta, mas não especifica o
|| exit 0
ou|| true
entra no comando do shell . Aqui está um exemplo mais completo:O acima funcionará, mas o seguinte falhará:
Talvez seja óbvio para os outros, mas perdi muito tempo antes de perceber isso.
fonte