Come aggiungere un passaggio di timeout a Jenkins Pipeline


93

Quando si utilizza un progetto in stile libero è possibile impostare che dopo 20 minuti la compilazione venga interrotta se non conclusa. Com'è possibile con un progetto di pipeline Jenkins Multi Branch?

Risposte:


187

Puoi utilizzare il passaggio del timeout :

timeout(20) {
  node {
    sh 'foo'
  }
}

Se hai bisogno di un diverso TimeUnitda MINUTES , puoi fornire l' unitargomento:

timeout(time: 20, unit: 'SECONDS') {

EDIT Agosto 2018: al giorno d'oggi con le pipeline dichiarative più comuni (facilmente riconoscibili dal pipelinecostrutto di primo livello ), i timeout possono anche essere specificati utilizzando optionssu diversi livelli (per pipeline complessiva o per fase):

pipeline {
  options {
      timeout(time: 1, unit: 'HOURS') 
  }
  stages { .. }
  // ..
}

Tuttavia, se si desidera applicare un timeout a un singolo passaggio in una pipeline dichiarativa, è possibile utilizzarlo come descritto sopra.


6
Il riferimento è disponibile anche in 1. Jenkins Dashboard<qualsiasi progetto pipeline> ▼ → Sintassi pipelineRiferimento passaggio o 2. JENKINS_URL/job/<any Pipeline project>/pipeline-syntax/Riferimento passaggio .
Gerold Broser

2
È possibile sospendere solo la parte di acquisizione del nodo e non contare il tempo impiegato per eseguire i contenuti? Vale a dire: a volte i nodi sono offline e voglio un modo in cui il lavoro fallisce se non può acquisire un nodo in tempo, piuttosto che il timeout, ma non voglio che il lavoro fallisca se ha acquisito il nodo ed è in esecuzione ..
Jake

Se vuoi solo sapere se il nodo è online potresti chiedere con: def n=Jenkins.instance.getNode("ETService3") if (n!=null && n.computer && n.computer.online) { echo "Online" } else { echo "Offline" // wait a little bit and try again }Un modo complicato è acquisire il nodo due volte. La prima volta con timeout esterno, la seconda con timeout interno. Mi manca anche la funzionalità.
elou

@ Jake, questa dovrebbe essere una domanda!
charlie_pl

1
Come si lancia il proprio messaggio di errore quando il timeout è scaduto?
red888

4

Per una pipeline dichiarativa si consiglia di utilizzare la fase di timeout nella sezione delle opzioni .

Esegue il codice all'interno del blocco con un limite di timeout determinato. Se viene raggiunto il limite di tempo, viene generata un'eccezione (org.jenkinsci.plugins.workflow.steps.FlowInterructedException), che porta all'interruzione della compilazione (a meno che non venga rilevata ed elaborata in qualche modo). L'unità è opzionale ma il valore predefinito è minuti.

La fase di timeout ha 3 parametri che puoi configurare:

  • time (richiesto, int)

    • L'importo del timeout, se nessuna unità è dichiarata durata in minuti
  • attività (opzionale, booleano)

    • Timeout dopo nessuna attività nei log per questo blocco invece della durata assoluta.
  • unità (facoltativo, valori: NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS)

    • L'unità per il tempo , l'impostazione predefinita è MINUTI

Esempi:

timeout(time: 10) // would lead to a timeout of 10 minutes (MINUTES is default value)
timeout(time: 10, unit: 'SECONDS') // a 10 seconds timeout
timeout(time: 10, activity: false, unit: 'MILLISECONDS')

La documentazione ufficiale di Jenkins ha un esempio molto carino per l'uso di un timeout:

pipeline {
    agent any
    options {
        timeout(time: 1, unit: 'HOURS') 
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

2
activityha false come impostazione predefinita. Quando activityè falso: timeout per l'intero lavoro, per il truetimeout per l'attività (per stampare qualsiasi cosa nel registro).
Maxim Suslov

Voglio aggiungere timeoutper una fase particolare in modo tale che la fase successiva dovrebbe essere eseguita con garbo. Nell'esempio precedente, la pipeline viene interrotta dopo il timeout e le fasi successive non vengono eseguite. C'è un modo per soddisfare la mia richiesta? Codice di esempio per il timeout di una determinata fase (da Jenkins Doc ufficiale):pipeline { agent any stages { stage('Example') { options { timeout(time: 1, unit: 'HOURS') } steps { echo 'Hello World' } } } }
Yash il
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.