So fügen Sie der Jenkins-Pipeline einen Timeout-Schritt hinzu

91

Wenn Sie ein Projekt im freien Stil verwenden, können Sie festlegen, dass der Build nach 20 Minuten abgebrochen wird, wenn er nicht abgeschlossen wird. Wie ist dies mit einem Jenkins Multi Branch Pipeline-Projekt möglich?

Devonte
quelle

Antworten:

187

Sie können den Timeout- Schritt verwenden:

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

Wenn Sie eine andere TimeUnitals MINUTES benötigen , können Sie das folgende unitArgument angeben :

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

EDIT Aug 2018: Heutzutage können mit den allgemeineren deklarativen Pipelines (die vom pipelineKonstrukt der obersten Ebene leicht erkannt werden ) Zeitüberschreitungen auch optionsauf verschiedenen Ebenen (pro Gesamtpipeline oder pro Stufe) angegeben werden:

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

Wenn Sie jedoch eine Zeitüberschreitung auf einen einzelnen Schritt in einer deklarativen Pipeline anwenden möchten, können Sie diese wie oben beschrieben verwenden.

Stephen King
quelle
6
Die Referenz finden Sie auch unter 1. Jenkins Dashboard<beliebiges Pipeline-Projekt> ▼ → Pipeline-SyntaxSchrittreferenz oder 2. JENKINS_URL/job/<any Pipeline project>/pipeline-syntax/Schrittreferenz .
Gerold Broser
2
Ist es möglich, nur eine Zeitüberschreitung für den Teil des Erwerbs des Knotens vorzunehmen und nicht die Zeit zu zählen, die für die Ausführung des Inhalts aufgewendet wurde? Dh: Manchmal sind Knoten offline und ich möchte, dass der Job fehlschlägt, wenn er einen Knoten nicht rechtzeitig erfassen kann, anstatt eine Zeitüberschreitung, aber ich möchte nicht, dass der Job fehlschlägt, wenn er den Knoten erfasst hat und ausgeführt wird.
Jake
Wenn Sie nur wissen möchten, ob der Knoten online ist, können Sie folgende Fragen stellen: 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 }Eine schwierige Möglichkeit besteht darin, den Knoten zweimal zu erwerben. Das erste Mal mit äußerem Timeout, das zweite Mal mit innerem Timeout. Mir fehlt auch die Funktion.
Elou
@ Jake, das sollte eine Frage sein!
Charlie_pl
1
Wie können Sie Ihre eigene Fehlermeldung ausgeben, wenn das Timeout abgelaufen ist?
Red888
3

Für eine deklarative Pipeline ist es ratsam , das verwenden Timeout Schritt im Option-Abschnitt .

Führt den Code innerhalb des Blocks mit einem festgelegten Zeitlimit aus. Wenn das Zeitlimit erreicht ist, wird eine Ausnahme (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException) ausgelöst, die zum Abbruch des Builds führt (es sei denn, er wird abgefangen und irgendwie verarbeitet). Das Gerät ist optional, standardmäßig jedoch Minuten.

Der Timeout-Schritt enthält 3 Parameter, die Sie konfigurieren können:

  • Zeit (erforderlich, int)

    • Die Höhe des Timeouts, wenn keine Einheit angegeben ist. Dauer in Minuten
  • Aktivität (optional, boolesch)

    • Zeitüberschreitung nach keiner Aktivität in den Protokollen für diesen Block anstelle der absoluten Dauer.
  • Einheit (optional, Werte: NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTEN, STUNDEN, TAGE)

    • Die Standardeinstellung für die Zeit ist MINUTEN

Beispiele:

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')

Die offizielle Jenkins-Dokumentation enthält ein sehr schönes Beispiel für die Verwendung einer Zeitüberschreitung:

pipeline {
    agent any
    options {
        timeout(time: 1, unit: 'HOURS') 
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}
Michael Kemmerzell
quelle
2
activityhat false als Standard. Wann activityist falsch - Zeitüberschreitung für den gesamten Auftrag, trueZeitüberschreitung für Aktivitäten (um etwas in das Protokoll zu drucken).
Maxim Suslov
Ich möchte timeoutfür eine bestimmte Stufe so hinzufügen , dass die nachfolgende Stufe ordnungsgemäß abläuft. Im obigen Beispiel wird die Pipeline nach dem Timeout abgebrochen und nachfolgende Stufen werden nicht ausgeführt. Gibt es eine Möglichkeit, meine Anforderung zu erfüllen? Beispielcode für das Timeout einer bestimmten Phase (vom offiziellen Jenkins Doc):pipeline { agent any stages { stage('Example') { options { timeout(time: 1, unit: 'HOURS') } steps { echo 'Hello World' } } } }
Yash