A maneira mais limpa de sair prematuramente de um trabalho no Jenkins Pipeline como um sucesso?

56

Eu tenho um trabalho que criará arquivos, a menos que um dos valores que está sendo alimentado corresponda a um valor mais antigo. Qual é a maneira mais limpa em Jenkins de abortar ou sair do trabalho, sem que seja FAILED? A saída é o comportamento correto, por isso quero que a compilação seja marcada SUCCESS.

Terminará em uma declaração if;

stage ('Check value') {

     if( $VALUE1 == $VALUE2 ) {
       //if they do match exit as a success, else continue with the rest of the job 
    }

}

Eu não quero lançar um código de erro, a menos que isso possa de alguma forma se traduzir para ser marcado como uma compilação bem-sucedida.

Alex
fonte
11
Apenas exit 0...
Tensibai
Eu pensei que marcou o trabalho um fracasso? Se eu estiver errado e você pode mostrar a documentação, eu ficaria feliz em aceitar isso como uma resposta
Alex
Bem, os scripts apenas festança, saída 0 significa sucesso, de saída diferente de zero falhas meios ...
Tensibai
Isso não está em um script bash, este é o trabalho do pipeline, portanto, Groovy. Isso muda as coisas?
Alex
No groovy, eu apenas tentaria um return 0, apesar de todo o código do groovy que não gera uma exceção, devo pensar. Vou deixar que alguém com mais de fundo sobre Jenkins 2 confirmam ou doentes
Tensibai

Respostas:

47

Descobri isso. Fora de qualquer estágio (caso contrário, isso acabará com o estágio específico como um sucesso), faça o seguinte;

if( $VALUE1 == $VALUE2 ) {
   currentBuild.result = 'SUCCESS'
   return
}

return interromperá o estágio ou o nó em que você está executando, e é por isso que é importante executá-lo fora de um estágio, enquanto a definição de currentBuild.resultimpede que ele falhe.

Alex
fonte
apenas retornar deve deixar a compilação com um status acinzentado e sem resultado ... portanto, não é o mesmo que uma compilação com falha.
264, Drewish
11
Como você retorna e pula todas as etapas restantes?
Jess Bowers
11
@JessBowers é tudo sobre onde você coloca o snippet. Se você fizer isso no nível do nó, em vez do nível do estágio, ele concluirá o trabalho inteiro.
Alex
4
Por favor note que ele só funciona para o encanamento script, não para declarativa
kagarlickij
@kagarlickij - Não existem pipelines declarativos corretos quando esta resposta foi escrita!
28418 Alex
11

Você também pode usar error para sair do estágio atual e não precisar considerar a hierarquia do estágio atual e coisas semelhantes:

def autoCancelled = false

try {
  stage('checkout') {
    ...
    if (your condition) {
      autoCancelled = true
      error('Aborting the build.')
    }
  }
} catch (e) {
  if (autoCancelled) {
    currentBuild.result = 'SUCCESS'
    // return here instead of throwing error to keep the build "green"
    return
  }
  // normal error handling
  throw e
}

Mas isso levaria a um estágio vermelho, se o erro ocorrer dentro de um estágio.

insira a descrição da imagem aqui

Depende dos seus requisitos, de que maneira você deseja usar.

CSchulz
fonte
Se você estiver indo para fazê-lo desta forma, fazer uma nova subclasse de RuntimeExceptionque jogar em vez de precisar capturar todas as exceções e verifique uma bandeira
Michael Mrozek
1

Honestamente, você não precisa usar o comando exit especificamente, mas há um plug-in BuildStep condicional que pode alcançar o mesmo resultado final (código que não é executado).

Ainda não me deparei com isso, então não usei o plugin.

Também existem condicionais, conforme encontrado nesta publicação anterior do Stack Overflow no Jenkins: Etapa / estágio condicional do pipeline do Jenkins

MrMesees
fonte
11
Embora sua resposta pareça válida (não a verifique ao vivo desde que encontrei outra solução alternativa), não acho que "Honestamente você não deve sair" é uma boa maneira de iniciá-la; claramente a existência desses métodos significa que às vezes é necessário sair.
Alex
O que você sugeriria? Passando para uma declaração final? Adicionando o qualificador "geralmente"? Você forneceu "feedback", mas não é fácil para mim dizer a intenção ou a ação, por favor, seja menos conciso.
precisa saber é o seguinte
Espere um pouco. É sua pergunta? Se for, TBH você não gostaria de ouvir que não deveria sair, mas nenhum dos métodos sugeridos fornece saídas, eles evitam o código em execução ... Apoiando diretamente minha posição.
precisa saber é o seguinte
11
Ah, entendo, acho que interpretei mal sua afirmação como "fazer algo para terminar o trabalho é ruim" em vez de "você não deve usar o exitcomando literal " - se assim for, peço desculpas, esse é o meu mal-entendido.
Alex
3
Eu tentei fazê-la mais clara, não há necessidade de pedir desculpas a todos, a língua é um animal inconstante, especialmente na internet :)
MrMesees
0

O Executor.interrupt(Result)método é a maneira mais direta e limpa de interromper uma construção prematuramente e marcá-la como um sucesso.

script {
    currentBuild.getRawBuild().getExecutor().interrupt(Result.SUCCESS)
}

Prós :

  • Funciona em um pipeline declarativo tão bem quanto em um script.
  • Nenhuma tentativa / captura ou exceções para lidar.
  • Marca o estágio de chamada e todos os estágios sucessivos como verde / passando na interface do usuário.

Contras :

  • Requer várias aprovações de script em processo, incluindo uma que é considerada insegura . Aprovar e usar com cuidado.
Ben Amos
fonte
Para mim, isso não funciona - estágios consecutivos estão sendo executados.
Łukasz K