Comment ajouter une étape de délai d'expiration au pipeline Jenkins

93

Lorsque vous utilisez un projet de style libre, vous pouvez définir qu'après 20 minutes, la génération est abandonnée si elle n'est pas terminée. Comment est-ce possible avec un projet de pipeline Jenkins Multi Branch?

Devonte
la source

Réponses:

187

Vous pouvez utiliser l' étape de temporisation :

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

Si vous avez besoin d'un autre TimeUnitque MINUTES , vous pouvez fournir l' unitargument:

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

EDIT août 2018: De nos jours, avec les pipelines déclaratifs les plus courants (facilement reconnus par la pipelineconstruction de niveau supérieur ), les délais d'expiration peuvent également être spécifiés à optionsdiffé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'expiration à une seule étape d'un pipeline déclaratif, il peut être utilisé comme décrit ci-dessus.

Stephen King
la source
6
La référence est également disponible sous 1. Tableau de bord Jenkins<tout projet Pipeline> ▼ → Syntaxe du pipelineRéférence d'étape ou 2. JENKINS_URL/job/<any Pipeline project>/pipeline-syntax/Référence d'étape .
Gerold Broser
2
Est-il possible d'expirer uniquement la partie de l'acquisition du nœud et de ne pas compter le temps passé à exécuter le contenu? Ie: parfois les nœuds sont hors ligne et je veux un moyen pour le travail d'échouer s'il ne peut pas acquérir un nœud à temps, plutôt que le délai d'expiration, mais je ne veux pas que le travail échoue s'il a acquis le nœud et est en cours d'exécution ..
Jake
Si vous voulez juste savoir si le nœud est en ligne, vous pouvez demander: 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 manière délicate consiste à acquérir le nœud deux fois. La première fois avec timeout externe, la seconde avec timeout interne. Je manque aussi la fonctionnalité.
elou
@Jake, ça devrait être une question!
charlie_pl
1
Comment lancez-vous votre propre message d'erreur lorsque le délai est expiré?
red888
4

Pour un pipeline déclaratif, il est conseillé d'utiliser l' étape de temporisation dans la section des options .

Exécute le code à l'intérieur du bloc avec un délai d'expiration déterminé. Si la limite de temps est atteinte, une exception (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException) est levée, ce qui conduit à abandonner la construction (sauf si elle est interceptée et traitée d'une manière ou d'une autre). L'unité est facultative mais prend par défaut les minutes.

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

  • time (obligatoire, int)

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

    • Délai d'expiration après aucune activité dans les journaux pour ce bloc au lieu de la durée absolue.
  • unité (facultatif, valeurs: NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS)

    • L'unité pour l' heure , par défaut est 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')

La documentation officielle de Jenkins a un très bel exemple d'utilisation d'un timeout:

pipeline {
    agent any
    options {
        timeout(time: 1, unit: 'HOURS') 
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}
Michael Kemmerzell
la source
2
activitya false par défaut. Quand activityest faux - délai d'expiration pour l'ensemble du travail, truedélai d'expiration de l'activité (pour imprimer quoi que ce soit dans le journal).
Maxim Suslov
Je veux ajouter timeoutpour une étape particulière de telle manière que l'étape suivante devrait se dérouler avec élégance. Dans l'exemple ci-dessus, le pipeline est abandonné après l'expiration du délai et les étapes suivantes ne sont pas exécutées. Existe-t-il un moyen de répondre à mes besoins? Exemple de code pour le timeout d'une étape donnée (du document officiel Jenkins):pipeline { agent any stages { stage('Example') { options { timeout(time: 1, unit: 'HOURS') } steps { echo 'Hello World' } } } }
Yash