为什么我的Jenkins步骤没有重试,而是在没有达到时间限制时抛出超时错误?

bxjv4tth  于 2023-10-17  发布在  Jenkins
关注(0)|答案(2)|浏览(131)

在我的Jenkins管道中,我使用Jenkins脚本语法构建了以下Jenkins步骤。它的目的是运行一个docker容器,它运行一些集成测试。我目前并行生成了其中的11个步骤。

node('tester') {
    stage("Test") {
        withEnv([
            "USERNAME=some_user",
            "UID=1000",
            "GID=1000"
        ]) {
            dir("some_directory") {
                // ... some steps here
                retry(1) {
                    try {
                        timeout(time: 15, unit: 'MINUTES') {
                            retry(1) {
                                sh "docker-compose --project-name tester_prod9 -f docker-compose.e2e.yml -- up --build --renew-anon-volumes --exit-code-from cypress --timeout 600"
                            }
                        }
                    } catch (err) {
                        error "Timeout!"
                    }
                }
            }
        }
    }
}

如您所见,我希望在docker-compose命令失败时重试一次docker-compose命令。但是,如果此过程(包括可能的重试)超过15分钟,我希望抛出超时错误。如果抛出超时错误,我会再次重试所有这些操作。
然而,上述预期的步骤并没有发生。
目前,当我的docker-compose命令在第一次运行时失败时,一个“错误!“抛出错误,整个步骤结束。
正如您在下面看到的,docker-compose命令只运行8分钟,因此不应该抛出超时错误。此外,Jenkins从不重试docker-compose命令。

我如何修复我的Jenkins步骤以实现我想要的行为?

我的Jenkins版本是2.270。

编辑:

需要说明的是,我预计docker-compose命令会失败,因为Docker容器中的测试失败。然而,Jenkins并没有像预期的那样重试失败的docker-compose命令。

4urapxun

4urapxun1#

我没有发现任何关于retry的信息应该> 1。官方文件说:

retry: Retry the body up to N times
Retry the block (up to N times) if any exception happens during its body execution. 
If an exception happens on the final attempt then it will lead to aborting the build 
(unless it is caught and processed somehow). User aborts of the build are not caught.

但看起来为了触发重试,它应该设置为大于1

kcrjzv8t

kcrjzv8t2#

虽然官方文档建议retry(n)将Retry the body up to N times,但实际上n是尝试的总次数,因此对于一次重试,您需要设置retry(2)。相信我,我是用很难的方式发现的!

相关问题