Cómo agregar un paso de tiempo de espera a Jenkins Pipeline

93

Cuando está utilizando un proyecto de estilo libre, puede configurar que después de 20 minutos la compilación se cancele si no se concluye. ¿Cómo es esto posible con un proyecto de canalización de múltiples ramas de Jenkins?

Devonte
fuente

Respuestas:

193

Puede utilizar el paso de tiempo de espera :

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

Si necesita un valor diferente TimeUnita MINUTES , puede proporcionar el unitargumento:

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

EDITAR agosto de 2018: hoy en día, con las canalizaciones declarativas más comunes (reconocidas fácilmente por la pipelineconstrucción de nivel superior ), los tiempos de espera también se pueden especificar usando optionsen diferentes niveles (por canalización general o por etapa):

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

Aún así, si desea aplicar un tiempo de espera a un solo paso en una canalización declarativa, se puede usar como se describe anteriormente.

Stephen King
fuente
6
La referencia también está disponible en 1. Panel de Jenkins<cualquier proyecto de canalización> ▼ → Sintaxis de canalizaciónReferencia de paso o 2. JENKINS_URL/job/<any Pipeline project>/pipeline-syntax/Referencia de paso .
Gerold Broser
2
¿Es posible solo el tiempo de espera de la parte de adquisición del nodo y no contar el tiempo dedicado a ejecutar los contenidos? Es decir: a veces los nodos están fuera de línea y quiero una forma de que el trabajo falle si no puede adquirir un nodo a tiempo, en lugar de agotar el tiempo de espera, pero no quiero que el trabajo falle si adquirió el nodo y se está ejecutando ..
Jake
Si solo desea saber si el nodo está en línea, puede preguntar con: 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 }Una forma complicada es adquirir el nodo dos veces. La primera vez con tiempo de espera externo, la segunda con tiempo de espera interno. También me falta la función.
elou
@Jake, ¡eso debería ser una pregunta!
charlie_pl
1
¿Cómo arroja su propio mensaje de error cuando expira el tiempo de espera?
red888
5

Para una canalización declarativa , se recomienda utilizar el paso de tiempo de espera en la sección de opciones .

Ejecuta el código dentro del bloque con un límite de tiempo de espera determinado. Si se alcanza el límite de tiempo, se lanza una excepción (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException), lo que lleva a abortar la compilación (a menos que se detecte y procese de alguna manera). La unidad es opcional pero el valor predeterminado es minutos.

El paso de tiempo de espera tiene 3 parámetros que puede configurar:

  • time (obligatorio, int)

    • La cantidad del tiempo de espera, si no se indica una unidad, duración en minutos
  • actividad (opcional, booleano)

    • Tiempo de espera después de que no haya actividad en los registros de este bloque en lugar de la duración absoluta.
  • unidad (opcional, valores: NANOSECONDS, MICROSECONDS, MILISECONDS, SECONDS, MINUTES, HOURS, DAYS)

    • La unidad para el tiempo , por defecto es MINUTOS

Ejemplos:

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 documentación oficial de Jenkins tiene un ejemplo muy bueno para el uso de un tiempo de espera:

pipeline {
    agent any
    options {
        timeout(time: 1, unit: 'HOURS') 
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}
Michael Kemmerzell
fuente
2
activitytiene falso por defecto. Cuando activityes falso: tiempo de espera para todo el trabajo, truetiempo de espera para la actividad (para imprimir cualquier cosa en el registro).
Maxim Suslov
1
Quiero agregar timeoutpara una etapa en particular de tal manera que la etapa siguiente se ejecute con gracia. En el ejemplo anterior, la canalización se cancela después del tiempo de espera y las etapas posteriores no se ejecutan. ¿Hay alguna forma de cumplir con mi requisito? Código de muestra para el tiempo de espera de una etapa determinada (del documento oficial de Jenkins):pipeline { agent any stages { stage('Example') { options { timeout(time: 1, unit: 'HOURS') } steps { echo 'Hello World' } } } }
Yash