Як додати крок очікування до трубопроводу Дженкінса


93

Коли ви використовуєте проект вільного стилю, ви можете встановити, що через 20 хвилин збірка буде перервана, якщо не завершена. Як це можливо за допомогою проекту багатогалузевого трубопроводу Дженкінса?

Відповіді:


189

Ви можете використовувати крок очікування :

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. Інформаційна панель Дженкінса<будь-який проект трубопроводу> ▼ → Синтаксис конвеєраПосилання на кроки або 2. JENKINS_URL/job/<any Pipeline project>/pipeline-syntax/Посилання на крок .
Gerold Broser

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

@Jake, це має бути питання!
charlie_pl

1
Як викидати власне повідомлення про помилку, коли закінчується час очікування?
red888

5

Для декларативного конвеєру рекомендується використовувати крок очікування в розділі параметрів .

Виконує код всередині блоку з визначеним обмеженням часу очікування. Якщо досягнуто обмеження часу, викидається виняток (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException), що призводить до переривання збірки (якщо вона не виявлена ​​і не оброблена якось). Одиниця не є обов’язковою, але за замовчуванням становить хвилини.

Крок очікування має 3 параметри, які ви можете налаштувати:

  • час (потрібно, int)

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

    • Час очікування після відсутності активності в журналах для цього блоку замість абсолютної тривалості.
  • одиниця (необов’язково, значення: НАНОСЕКУНДИ, МІКРОСЕКУНДИ, МІЛІСЕКУНДИ, СЕКУНДИ, ХВИЛИНИ, ГОДИНИ, ДНІ)

    • Одиниця часу , за замовчуванням - MINUTES

Приклади:

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

В офіційній документації Дженкінса є дуже гарний приклад використання тайм-ауту:

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

2
activityмає значення false за замовчуванням. Коли activityзначення false - час очікування для всієї роботи, час trueочікування для активності (щоб надрукувати що-небудь у журналі).
Максим Суслов

1
Я хочу додати timeoutдля конкретного етапу таким чином, що наступний етап повинен працювати елегантно. У наведеному вище прикладі конвеєр переривається після закінчення тайм-ауту, а наступні етапи не виконуються. Чи є спосіб виконати мою вимогу? Зразок коду для тайм-ауту даного етапу (з офіційного документа Дженкінса):pipeline { agent any stages { stage('Example') { options { timeout(time: 1, unit: 'HOURS') } steps { echo 'Hello World' } } } }
Яш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.