Jak dodać krok limitu czasu do Jenkins Pipeline

93

Jeśli używasz projektu w dowolnym stylu, możesz ustawić, że po 20 minutach kompilacja zostanie przerwana, jeśli nie zostanie zakończona. Jak jest to możliwe w przypadku projektu Jenkins Multi Branch Pipeline?

Devonte
źródło

Odpowiedzi:

191

Możesz użyć kroku limitu czasu :

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

Jeśli potrzebujesz wartości innej TimeUnitniż MINUTY , możesz podać unitargument:

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

EDYCJA, sierpień 2018 r .: Obecnie, w przypadku bardziej powszechnych potoków deklaratywnych (łatwo rozpoznawalnych przez konstrukcję najwyższego poziomu pipeline), limity czasu można również określić przy użyciu optionsróżnych poziomów (na ogólny potok lub na etap):

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

Jeśli jednak chcesz zastosować limit czasu do pojedynczego kroku w potoku deklaratywnym, możesz go użyć w sposób opisany powyżej.

StephenKing
źródło
6
Odniesienie jest również dostępne w 1. Jenkins Dashboard<dowolny projekt Pipeline> ▼ → Pipeline SyntaxStep Reference lub 2. JENKINS_URL/job/<any Pipeline project>/pipeline-syntax/Step Reference .
Gerold Broser
2
Czy można przekroczyć limit czasu tylko dla części pozyskiwania węzła, a nie liczyć czasu spędzonego na uruchamianiu zawartości? To znaczy: czasami węzły są w trybie offline i chcę, aby zadanie zakończyło się niepowodzeniem, jeśli nie może uzyskać węzła na czas, zamiast przekroczenia limitu czasu, ale nie chcę, aby zadanie zakończyło się niepowodzeniem, jeśli pozyskało węzeł i jest uruchomione ..
Jake
Jeśli chcesz tylko wiedzieć, czy węzeł jest online, możesz zapytać: 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 }Trudnym sposobem jest dwukrotne zdobycie węzła. Pierwszy raz z zewnętrznym limitem czasu, drugi z wewnętrznym limitem czasu. Brakuje mi też tej funkcji.
elou
@Jake, to powinno być pytanie!
charlie_pl
1
Jak wyrzucić swój własny komunikat o błędzie, gdy upłynął limit czasu?
czerwony888
5

W przypadku potoku deklaratywnego zaleca się użycie kroku limitu czasu w sekcji opcji .

Wykonuje kod wewnątrz bloku z określonym limitem czasu. Po osiągnięciu limitu czasu wyrzucany jest wyjątek (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException), który prowadzi do przerwania kompilacji (chyba że zostanie w jakiś sposób przechwycony i przetworzony). Jednostka jest opcjonalna, ale domyślnie są to minuty.

Krok limitu czasu ma 3 parametry, które możesz skonfigurować:

  • czas (wymagane, int)

    • Długość limitu czasu, jeśli żadna jednostka nie jest podana w minutach
  • aktywność (opcjonalna, boolowska)

    • Limit czasu po braku aktywności w dziennikach dla tego bloku zamiast bezwzględnego czasu trwania.
  • jednostka (opcjonalnie, wartości: NANOSECONDS, MICROSECONDS, MILISECONDS, SECONDS, MINUTES, HOURS, DAYS)

    • Jednostką czasu , domyślnie są MINUTY

Przykłady:

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

Oficjalna dokumentacja Jenkins ma bardzo ładny przykład dla wykorzystania timeout:

pipeline {
    agent any
    options {
        timeout(time: 1, unit: 'HOURS') 
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}
Michael Kemmerzell
źródło
2
activityma domyślnie false. Kiedy activityjest fałszywe - limit czasu dla całego zadania, truelimit czasu dla aktywności (wydrukowanie czegokolwiek do dziennika).
Maxim Suslov
1
Chcę dodać timeoutdla danego etapu w taki sposób, aby kolejny etap przebiegał wdzięcznie. W powyższym przykładzie potok jest przerywany po przekroczeniu limitu czasu, a kolejne etapy nie są wykonywane. Czy istnieje sposób, aby spełnić moje wymagania? Przykładowy kod limitu czasu danego etapu (z oficjalnego dokumentu Jenkinsa):pipeline { agent any stages { stage('Example') { options { timeout(time: 1, unit: 'HOURS') } steps { echo 'Hello World' } } } }
Yash