Em um projeto no qual estou trabalhando, estamos usando scripts de shell para executar tarefas diferentes. Alguns são scripts sh / bash que executam rsync e alguns são scripts PHP. Um dos scripts PHP está executando alguns testes de integração que geram saída para JUnit XML, relatórios de cobertura de código e similares.
Jenkins é capaz de marcar as tarefas como bem-sucedidas / com falha com base no status de saída . No PHP, o script sai com 1 se detectar que os testes falharam durante a execução. Os outros scripts de shell executam comandos e usam os códigos de saída deles para marcar uma construção como falha.
// :: End of PHP script:
// If any tests have failed, fail the build
if ($build_error) exit(1);
Na terminologia do Jenkins , uma construção instável é definida como:
Uma construção é instável se foi construída com sucesso e um ou mais editores relatam que é instável. Por exemplo, se o editor JUnit estiver configurado e um teste falhar, a construção será marcada como instável.
Como posso fazer com que o Jenkins marque uma construção como instável em vez de apenas sucesso / falha ao executar scripts de shell?
Respostas:
Use o localizador de texto plugin .
Em vez de sair com o status 1 (o que causaria uma falha na compilação), faça:
Em seguida, nas ações pós-construção, habilite o Text Finder, defina a expressão regular para corresponder à mensagem que você imprimiu (
TESTS FAILED!
) e marque a caixa de seleção "Instável se encontrada" sob essa entrada.fonte
As versões modernas do Jenkins (desde 2.26, outubro de 2016) resolveram isso: é apenas uma opção avançada para a etapa de compilação Executar shell!
Você pode apenas escolher e definir um valor de saída arbitrário; se corresponder, a construção ficará instável. Basta escolher um valor que provavelmente não será iniciado por um processo real em sua construção.
fonte
sh
comando step em aJenkinsfile
? Onde a configuração está localizada na GUI? Eu não encontro.Isso pode ser feito sem imprimir strings mágicas e usando TextFinder. Aqui estão algumas informações sobre isso.
Basicamente, você precisa de um arquivo .jar de http: // yourserver.com / cli disponível em scripts de shell, então você pode usar o seguinte comando para marcar uma compilação como instável:
Para marcar a construção como instável em caso de erro, você pode usar:
O problema é que jenkins-cli.jar precisa estar disponível no shell script. Você pode colocá-lo em um caminho de fácil acesso ou fazer o download via script de shell do job:
fonte
set-build-result
foi descontinuada nojenkins-cli
.Você deve usar Jenkinsfile para embrulhar seu script de compilação e simplesmente marcar a compilação atual como INSTÁVEL usando
currentBuild.result = "UNSTABLE"
.fonte
UNSTABLE
)? Parece mais direto do que as outras respostas.Expected one of "steps", "stages", or "parallel" for stage
quando tento definir currentBuild.result diretamente dentro de um estágio.você também deve ser capaz de usar o groovy e fazer o que o textfinder fazia
marcando uma construção como instável com o plugin de pós-construção ideal
Veja também o plugin Groovy Postbuild
fonte
No meu script de trabalho, tenho as seguintes declarações (este trabalho só é executado no mestre Jenkins):
Você pode ver isso e muito mais informações sobre a configuração de status de compilação no wiki Jenkins: https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI
fonte
Configure a construção do PHP para produzir relatório junit xml
Concluir o script de construção com status 0
Adicionar ação pós-construção Publicar relatório de resultado de teste JUnit para XMLs de relatório de teste. Este plug-in irá alterar a construção Stable para Unstable quando o teste estiver falhando.
Adicione o plugin Jenkins Text Finder com verificação de saída do console e opções desmarcadas. Este plug-in falha totalmente na criação de um erro fatal.
fonte
Acho que a maneira mais flexível de fazer isso é lendo um arquivo no plugin do Groovy Post Build.
Se o conteúdo do arquivo for 'verdadeiro', a construção será definida como instável. Isso funcionará no mestre local e em quaisquer escravos nos quais você execute o trabalho e para qualquer tipo de script que possa gravar no disco.
fonte
O TextFinder é bom apenas se o status do trabalho não foi alterado de SUCCESS para FAILED ou ABORTED. Para esses casos, use um script bacana na etapa PostBuild:
Veja mais detalhes em uma postagem que escrevi sobre isso: http://www.tikalk.com/devops/JenkinsJobStatusChange/
fonte
Duplicando minha resposta a partir daqui porque passei algum tempo procurando por isso:
Isso agora é possível em versões mais recentes do Jenkins, você pode fazer algo assim:
O gerador de sintaxe de pipeline mostra isso na guia avançada:
fonte
Pensei em postar outra resposta para pessoas que podem estar procurando por algo semelhante.
Em nosso trabalho de construção, temos casos em que gostaríamos que a construção continuasse, mas fosse marcada como instável. Para o nosso está relacionado aos números de versão.
Então, eu queria definir uma condição na construção e definir a construção como instável se essa condição for atendida.
Usei a opção Etapa condicional (única) como uma etapa de construção.
Em seguida, usei Execute system Groovy script como a etapa de compilação que seria executada quando essa condição fosse atendida.
Usei o comando Groovy e configurei o script a seguir
Isso parece funcionar muito bem.
Eu tropecei na solução aqui
http://tech.akom.net/archives/112-Marking-Jenkins-build-UNSTABLE-from-environment-inject-groovy-script.html
fonte
Como uma alternativa mais leve às respostas existentes, você pode definir o resultado da compilação com um HTTP POST simples para acessar a API REST do console de script do Groovy :
Vantagens:
Para esta solução, seu ambiente deve atender a estas condições:
fonte
Uma maneira fácil de definir uma construção como instável é em seu bloco "executar shell", executar
exit 13
fonte
Você pode apenas chamar "exit 1", e a compilação falhará nesse ponto e não continuará. Acabei criando uma função make de passagem para lidar com isso para mim e chamei safemake em vez de make para construir:
fonte
if make "$@"; then echo "BUILD SUCCEEDED"; else rc=$?; echo "BUILD FAILED"; exit $rc; fi