Il modo più pulito per uscire prematuramente da un lavoro della pipeline Jenkins come successo?


56

Ho un lavoro che creerà file, a meno che uno dei valori a cui viene inviato non corrisponda a un valore precedente. Qual è il modo più pulito in Jenkins di interrompere o uscire dal lavoro, senza che lo sia FAILED? L'uscita è il comportamento corretto, quindi desidero contrassegnare la build SUCCESS.

Finirà in un'istruzione if in questo modo;

stage ('Check value') {

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

}

Non voglio lanciare un codice di errore a meno che ciò non possa in qualche modo tradursi in esso contrassegnato come una build di successo.


1
Solo exit 0...
Tensibai,

Ho pensato che questo ha segnato il lavoro come un fallimento? Se sbaglio e puoi mostrare la documentazione, sarei felice di accettarla come risposta
Alex

Bene, bash script, exit 0 significa successo, exit non zero significa fallimento ...
Tensibai

Questo non è all'interno di uno script bash, questo è il lavoro della pipeline stesso, quindi Groovy. Questo cambia le cose?
Alex,

In groovy proverei semplicemente a return 0, tutto sommato qualsiasi estremità del codice groovy che non genera un'eccezione dovrebbe pensare. Lascerò che qualcuno con più background su jenkins 2 confermi o confermi
Tensibai il

Risposte:


47

Capito. Al di fuori di qualsiasi fase (altrimenti questo finirà con successo la fase particolare) eseguire le seguenti operazioni;

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

return interromperà lo stage o il nodo su cui stai eseguendo, motivo per cui è importante eseguirlo al di fuori di uno stage, mentre l'impostazione currentBuild.resultimpedisce che fallisca.


solo il ritorno dovrebbe lasciare la build con uno stato in grigio e nessun risultato ... quindi non è la stessa cosa di una build fallita.
disegnato il

1
Come si fa a tornare e saltare tutte le fasi rimanenti?
Jess Bowers,

1
@JessBowers è tutto su dove metti lo snippet. Se lo fai a livello di nodo piuttosto che a livello di fase, finirà l'intero lavoro.
Alex

4
Si prega di notare che funziona solo per la pipeline con script, non per il dichiarativo
kagarlickij

@kagarlickij - Pipeline dichiarative corrette non esistevano quando è stata scritta questa risposta!
Alex

11

Puoi anche usare l'errore per uscire dallo stage corrente, quindi non devi considerare la gerarchia dello stage corrente e cose simili:

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
}

Ma questo porterebbe a una fase rossa, se l'errore si verifica all'interno di una fase.

inserisci qui la descrizione dell'immagine

Dipende dalle tue esigenze, dal modo in cui desideri utilizzare.


Se hai intenzione di farlo in questo modo, crea una nuova sottoclasse RuntimeExceptionda lanciare invece di dover catturare tutte le eccezioni e controllare una bandiera
Michael Mrozek,

1

Onestamente non dovresti usare specificamente il comando exit, ma esiste un plugin BuildStep condizionale che può ottenere lo stesso risultato finale (codice che non viene eseguito).

Non mi sono ancora imbattuto in questo, quindi non ho usato il plugin.

Esistono anche condizionali presenti in questo precedente post di Stack Overflow su Jenkins: Jenkins Pipeline Conditional Step / Stage


1
Mentre la tua risposta sembra essere valida (non l'ho verificata dal vivo da quando ho trovato un'altra soluzione alternativa), non credo che "Onestamente non dovresti uscire" è un buon modo per avviarla; chiaramente l'esistenza di questi metodi significa che a volte è necessario uscire.
Alex,

Che cosa suggeriresti? Passare a un'istruzione finale? Aggiunta del qualificatore "generalmente"? Hai fornito "feedback" ma non è facile per me dire l'intento o agire, per favore sii meno conciso.
MrMesees,

Aspetta un po '. È la tua domanda? Se lo è, TBH non vorresti sentire che non dovresti uscire, ma nessuno dei due metodi che ho suggerito prevede di uscire, eludono il codice in esecuzione ... Supportando direttamente la mia posizione.
MrMesees,

1
Ah, vedo, penso di aver frainteso la tua affermazione come "fare qualcosa per finire il lavoro è male" invece di "non dovresti usare il exitcomando letterale " - se così mi scuso, questo è il mio malinteso.
Alex,

3
Ho provato a renderlo più chiaro, non c'è bisogno di scusarsi affatto, la lingua è una bestia volubile, specialmente su Internet :)
MrMesees

0

Il Executor.interrupt(Result)metodo è il modo più pulito e diretto che ho trovato per fermare una build prematuramente e contrassegnarla come un successo.

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

Pro :

  • Funziona in una pipeline dichiarativa così come in uno script.
  • Nessun tentativo / cattura o eccezioni da gestire.
  • Contrassegna la fase chiamante e tutte le fasi successive come verde / passaggio nell'interfaccia utente.

Contro :

  • Richiede una serie di approvazioni di script in-process, inclusa una considerata non sicura . Approvare e utilizzare con cautela.

Per me non funziona: vengono eseguite fasi consecutive.
Łukasz K
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.