Как добавить шаг тайм-аута в Jenkins Pipeline

93

Когда вы используете проект в свободном стиле, вы можете установить, что через 20 минут сборка будет прервана, если не будет завершена. Как это возможно с проектом Jenkins Multi Branch Pipeline?

Девонте
источник

Ответы:

193

Вы можете использовать шаг тайм-аута :

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

Если вам нужно значение, отличное TimeUnitот MINUTES , вы можете указать unitаргумент:

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

ИЗМЕНИТЬ август 2018: В настоящее время с более распространенными декларативными конвейерами (легко распознаваемыми конструкцией верхнего уровня pipeline) таймауты также могут быть указаны с использованием optionsна разных уровнях (для общего конвейера или для каждого этапа):

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

Тем не менее, если вы хотите применить тайм-аут к одному шагу в декларативном конвейере, его можно использовать, как описано выше.

Стивен Кинг
источник
6
Ссылка также доступна в разделе 1. Панель управления Jenkins<любой проект конвейера> ▼ → Синтаксис конвейераСсылка на шаг или 2. JENKINS_URL/job/<any Pipeline project>/pipeline-syntax/ Ссылка на шаг .
Герольд Брозер 01
2
Возможно ли тайм-аут только для части получения узла и не подсчитывать время, потраченное на выполнение содержимого? То есть: иногда узлы отключены, и я хочу, чтобы задание завершилось ошибкой, если оно не может получить узел вовремя, а не тайм-аут, но не хочу, чтобы задание завершилось ошибкой, если оно действительно захватило узел и выполняется ..
Джейк
Если вы просто хотите узнать, подключен ли узел к сети, вы можете спросить: 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 }Сложный способ - получить узел дважды. Первый раз с внешним таймаутом, второй с внутренним таймаутом. Мне тоже не хватает этой функции.
elou
@ Джейк, это должен быть вопрос!
charlie_pl
1
Как вы выдаете собственное сообщение об ошибке по истечении тайм-аута?
red888 03
5

Для декларативного конвейера рекомендуется использовать шаг тайм-аута в разделе параметров .

Выполняет код внутри блока с заданным пределом времени ожидания. Если лимит времени достигнут, генерируется исключение (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException), которое приводит к прерыванию сборки (если только оно не будет каким-то образом поймано и обработано). Единица измерения не является обязательной, но по умолчанию используется минуты.

Шаг тайм-аута имеет 3 параметра, которые вы можете настроить:

  • время (обязательное, целое)

    • Время ожидания, если не указана единица времени в минутах
  • активность (необязательный, логический)

    • Тайм-аут после отсутствия активности в журналах для этого блока вместо абсолютной продолжительности.
  • единица измерения (необязательно, значения: НАНОСЕКУНД, МИКРОСЕКУНД, МИЛЛИСЕКУНД, СЕКУНД, МИНУТЫ, ЧАСЫ, ДНИ)

    • Единица измерения времени , по умолчанию - МИНУТЫ.

Примеры:

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

В официальной документации Jenkins есть очень хороший пример использования тайм-аута:

pipeline {
    agent any
    options {
        timeout(time: 1, unit: 'HOURS') 
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}
Майкл Кеммерцелл
источник
2
activityпо умолчанию имеет значение false. Когда activityложно - тайм-аут для всего задания, trueтайм-аут для активности (для вывода чего-либо в журнал).
Максим Суслов,
1
Я хочу добавить timeoutдля определенного этапа таким образом, чтобы последующий этап работал плавно. В приведенном выше примере конвейер прерывается по истечении тайм-аута, и последующие этапы не выполняются. Есть ли способ выполнить мое требование? Пример кода для тайм-аута данного этапа (из официального документа Jenkins):pipeline { agent any stages { stage('Example') { options { timeout(time: 1, unit: 'HOURS') } steps { echo 'Hello World' } } } }
Yash