Повторная попытка конвейера Jenkins происходит даже после тайм-аута - PullRequest
0 голосов
/ 06 апреля 2020

Я только начинаю с конвейера 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 секунды как тайм-аут предназначены только для воспроизведения проблемы.

1 Ответ

0 голосов
/ 07 апреля 2020

Отвечая на мой собственный вопрос:

Это просто обходной путь, который я использовал, чтобы убедиться, что попытка повторной попытки в блоке тайм-аута прервана, если она начинается после истечения времени ожидания.

node {
    def previousStageDuration = 0
    def currentStageDuration = 0

    previousStageDuration = currentBuild.duration
    currentStageDuration = 0

        timeout(time: 2, unit: 'SECONDS') {
            retry(2) {
                currentStageDuration = currentBuild.duration - previousStageDuration
                // currentStageDuration is in milliseconds
                if(currentStageDuration/1000 >= 2)
                {
                    currentBuild.result = 'ABORTED'
                    error('Timed out. Ideally, the retry attempt should not have happened.')
                }

                parallel(
                          a: {

                            build job: 'Child_Job', 
                            parameters: [
                                string(name: 'Param1', value: 'Val1'),
                                string(name: 'Param2', value: 'Val2')
                            ]
                        )
            }
        }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...