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

为什么我的Jenkins步骤没有重试,而是在未达到时间限制时抛出超时错误?,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,在我的Jenkins管道中,我使用Jenkins脚本语法构造了以下Jenkins步骤。其目的是运行docker容器,该容器运行一些集成测试。我目前并行产生了其中11个步骤 node('tester') { stage("Test") { withEnv([ "USERNAME=some_user", "UID=1000", "GID

在我的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
命令在第一次运行时失败时,将抛出一个“Timeout!”错误,整个步骤结束

如下所示,
docker compose
命令仅运行8分钟,因此不应抛出超时错误。此外,Jenkins从不重试docker compose命令

我如何调整詹金斯步骤以实现我想要的行为?

我的詹金斯版本是2.270

编辑:


需要明确的是,
docker compose
命令会失败,因为docker容器中有一个失败的测试。但是,Jenkins没有按预期重试失败的
docker compose
命令。

我没有找到任何关于
重试的信息。官员说,


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

您是否从Jenkins日志中检查了您是否没有内存不足或其他问题?只是看了看,肯定没有内存不足的问题,我看不到任何其他明显的问题。只是澄清一下,
docker compose
命令由于集成测试失败而失败。因此,失败是正确的行为。不幸的是,Jenkins没有按预期重试失败的命令。您是否可以尝试设置更高的重试次数,例如2次或3次,看看这是否会改变行为?@ymochurad正在尝试。希望它能起作用…@ymochurad它起作用了!将重试值设置为2实际上可以让它重试!我无法解释原因,我也不确定这是否是一个bug,但当
docker compose
命令失败时,最内部的重试部分现在对我有效。。。
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.