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?
Odpowiedzi:
Możesz użyć kroku limitu czasu :
timeout(20) {
node {
sh 'foo'
}
}
Jeśli potrzebujesz wartości innej TimeUnit
niż MINUTY , możesz podać unit
argument:
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 options
róż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.
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.
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)
aktywność (opcjonalna, boolowska)
jednostka (opcjonalnie, wartości: NANOSECONDS, MICROSECONDS, MILISECONDS, SECONDS, MINUTES, HOURS, DAYS)
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'
}
}
}
}
activity
ma domyślnie false. Kiedy activity
jest fałszywe - limit czasu dla całego zadania, true
limit czasu dla aktywności (wydrukowanie czegokolwiek do dziennika).
timeout
dla 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' } } } }
JENKINS_URL/job/<any Pipeline project>/pipeline-syntax/
→ Step Reference .