133 votes

Comment ajouter une étape de délai d'attente à Jenkins Pipeline

Lorsque vous utilisez un projet de style libre, vous pouvez faire en sorte que la construction soit interrompue après 20 minutes si elle n'est pas terminée. Comment cela est-il possible avec un projet pipeline multi-branches de Jenkins ?

246voto

StephenKing Points 4379

Vous pouvez utiliser le délai d'attente étape :

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

Si vous avez besoin d'un autre TimeUnit que MINUTES vous pouvez fournir le unit argument :

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

EDIT Août 2018 : De nos jours, avec le plus commun pipelines déclaratifs (facilement reconnaissable par le niveau supérieur pipeline ), les délais d'attente peuvent également être spécifiés à l'aide de la fonction options à différents niveaux (par pipeline global ou par étape) :

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

Néanmoins, si vous souhaitez appliquer un délai d'attente à une seule étape d'un pipeline déclaratif, vous pouvez l'utiliser comme décrit ci-dessus.

7 votes

La référence est également disponible sous 1. Tableau de bord de Jenkins <nombre de projets pipelines> Syntaxe des pipelines Référence de l'étape ou 2. JENKINS_URL/job/<any Pipeline project>/pipeline-syntax/ Référence de l'étape .

3 votes

Est-il possible de ne compter que le temps d'acquisition du nœud, et de ne pas compter le temps d'exécution du contenu ? Ie : parfois les noeuds sont hors ligne et je veux un moyen pour le travail d'échouer s'il ne peut pas acquérir un noeud dans le temps, plutôt que le timeout, mais ne veulent pas que le travail échoue s'il a acquis le noeud et est en cours d'exécution .

0 votes

Si vous voulez simplement savoir si le nœud est en ligne, vous pouvez le demander avec : 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 } Une façon délicate est d'acquérir le noeud deux fois. La première fois avec le timeout externe, la seconde avec le timeout interne. Cette fonctionnalité me manque aussi.

22voto

Michael Kemmerzell Points 3274

Pour un Pipeline déclaratif il est conseillé d'utiliser le étape de temporisation dans le options-section .

Exécute le code à l'intérieur du bloc avec une limite de temps déterminée. Si la limite de temps est atteinte, une exception d'exception (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException). exception (org. jenkinsci.plugins.workflow.steps.FlowInterruptedException) est levée, ce qui entraîne l'abandon de la construction (à moins qu'elle ne soit capturée et traitée d'une manière ou d'une autre). L'unité est facultative mais la valeur par défaut est minutes.

Le délai d'attente a 3 paramètres que vous pouvez configurer :

  • temps (obligatoire, int)

    • Le montant du délai d'attente, si aucune unité n'est indiquée durée en minutes
  • actividad (facultatif, booléen)

    • Délai d'attente après l'absence d'activité dans les journaux pour ce bloc au lieu de la durée absolue.
  • unité (facultatif, valeurs : NANOSECONDES, MICROSECONDES, MILLISECONDES, SECONDES, MINUTES, HEURES, JOURS)

    • L'unité pour le temps par défaut MINUTES

Exemples :

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

El la documentation officielle de Jenkins propose un très bel exemple d'utilisation d'un délai d'attente :

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

8voto

Aviel Yosef Points 81

Dans un pipeline déclaratif, vous pouvez utiliser :

pipeline {
    agent any
    stages {
        stage('Deploy') {
            steps {
                retry(3) {
                    sh './flakey-deploy.sh'
                }

                timeout(time: 3, unit: 'MINUTES') {
                    sh './health-check.sh'
                }
            }
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X