Я только начинаю с конвейера Jenkins.
Это код конвейера, который я пытался воспроизвести эту потенциальную проблему:
node {
timeout(time: 2, unit: 'SECONDS') {
retry(2) {
parallel(
a: {
build job: 'Child_Job',
parameters: [
string(name: 'Param1', value: 'Val1'),
string(name: 'Param2', value: 'Val2')
]
}
)
}
}
}
Даже после истечения времени ожидания в 2 секунды (что Я подумал, что это будет тайм-аут для попыток, включая повторные попытки), вторая попытка повторения происходит в любом случае, и дочернее задание выполняется бесконечно.
Это журнал консоли:
[Pipeline] node
Running on Jenkins
[Pipeline] {
[Pipeline] timeout
Timeout set to expire in 2 sec
[Pipeline] {
[Pipeline] retry
[Pipeline] {
[Pipeline] parallel
[Pipeline] [a] { (Branch: a)
[Pipeline] [a] build (Building Child_Job)
[a] Scheduling project: Child_Job
Cancelling nested steps due to timeout
[Pipeline] [a] }
[a] Failed in branch a
[Pipeline] // parallel
[Pipeline] }
ERROR: Build of Child_Job was cancelled
Retrying
[Pipeline] {
[Pipeline] parallel
[Pipeline] [a] { (Branch: a)
[Pipeline] [a] build (Building Child_Job)
[a] Scheduling project: Child_Job
Body did not finish within grace period; terminating with extreme prejudice
[Pipeline] [a] }
[a] Failed in branch a
[Pipeline] // parallel
[Pipeline] }
[Pipeline] // retry
[Pipeline] }
[Pipeline] // timeout
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Timeout has been exceeded
Finished: ABORTED
Когда я обрабатываю исключение для дочернего задания эта ошибка (ОШИБКА: сборка Child_Job была отменена) перехватывается и обрабатывается. В этом случае повтор не происходит.
Даже без параллельного блока это воспроизводимо.
Это известная проблема или как она должна работать?
РЕДАКТИРОВАТЬ:
Обратите внимание, что если я использую режим сна (время: 3, единица: "SECONDS") вместо шага "сборка задания", попытка повторной попытки не произойдет. Таким образом, это может быть связано с тем, что блок повторных попыток перехватывает отмененное исключение дочерней работы (вызванное тайм-аутом) и пытается повторить попытку, несмотря на то, что он находится внутри блока тайм-аута, для которого уже истекло время ожидания.
РЕДАКТИРОВАТЬ 2:
При наличии блока времени ожидания в блоке повторных попыток время ожидания применяется для каждой попытки или повторной попытки в отдельности. Таким образом, если я установил тайм-аут на 2 секунды, 2 секунды - это тайм-аут для каждого блока временного кода, выполняемого в блоке повторных попыток. Я на самом деле ищу применение консолидированного тайм-аута для всех попыток в повторном блоке. 2 секунды как время ожидания для всех попыток, включая повторные попытки. Конечно, 2 секунды как тайм-аут предназначены только для воспроизведения проблемы.