You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins步骤未按预期重试却误报超时问题的修复方案咨询

我来帮你梳理下问题所在,然后给出修复方案——你的Jenkins Pipeline代码逻辑有两个关键问题,导致测试失败时直接抛出超时错误,完全没触发预期的重试流程:

问题根源

  1. 异常捕获范围太广:你外层的try-catch捕获了所有异常,包括sh命令执行失败(也就是docker-compose测试不通过)的异常,然后直接抛出Timeout!错误。这就导致docker-compose第一次失败时,直接进入catch块,内层的retry(1)根本没机会执行重试操作。
  2. 重试与超时的层级逻辑混乱:你希望超时后整体重试,但原代码的外层retry包裹了整个timeout块,逻辑上是先重复执行整个超时流程,而不是超时发生后再重试。

修复后的代码

这里是调整后的Pipeline代码,完全符合你的预期逻辑:

node('tester') { 
    stage("Test") { 
        withEnv([ "USERNAME=some_user", "UID=1000", "GID=1000" ]) { 
            dir("some_directory") { 
                // ... 你的前置步骤 
                // 外层重试:仅当超时发生时,整体重试1次(最多运行2轮完整测试)
                retry(1) {
                    try {
                        // 全局超时控制:整个测试流程(含内层重试)最多15分钟
                        timeout(time: 15, unit: 'MINUTES') {
                            // 内层重试:docker-compose测试失败时,自动重试1次(最多执行2次命令)
                            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) {
                        // 只处理超时异常,触发外层重试
                        if (err.getClass().simpleName == 'TimeoutException') {
                            error "测试流程超时,触发整体重试"
                        } else {
                            // 非超时异常(比如测试失败),直接抛出给内层retry处理
                            throw err
                        }
                    }
                }
            }
        }
    }
}

代码逻辑说明

我们来拆解下这个修复后的流程:

  • 内层retry(1):直接包裹docker-compose命令,只要是命令执行失败(测试不通过、容器启动失败等非超时原因),就会自动重试1次,最多执行2次该命令。
  • 全局timeout:把内层重试逻辑整个包裹起来,确保即使内层重试,整个测试流程的总时间不会超过15分钟。如果超时,Jenkins会抛出TimeoutException。
  • 异常过滤:try-catch块只捕获TimeoutException,抛出自定义错误触发外层的retry;其他异常直接重新抛出,让内层的重试机制正常工作。
  • 外层retry(1):只有当超时发生时,才会重新执行整个测试流程(包括timeout和内层重试),最多重试1次。

兼容性说明

这个逻辑在你的Jenkins 2.270版本完全适用,TimeoutException是Jenkins Pipeline的标准异常类,retry和timeout步骤的行为在该版本没有任何兼容性问题。

内容的提问来源于stack exchange,提问作者ptk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:29:53