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

Jenkins节点断开致构建停滞,如何实现断点续建?

Jenkins节点断开后恢复Selenium Web UI测试执行的可行方案

完全可以通过Jenkins插件配合Groovy Pipeline脚本实现需求,核心思路是测试步骤拆分+断点记录+节点状态检测与等待,以下是具体落地方案:

一、插件基础依赖

先确保安装以下核心官方稳定插件:

  • Durable Task Plugin:让Pipeline任务在节点断开时不直接失败,进入挂起状态等待节点恢复后继续执行。
  • Pipeline: Nodes and Processes Plugin:提供节点状态检测、waitUntil等Pipeline核心语法支持。
  • Workspace Cleanup Plugin:可选,用于控制工作区是否保留(需要保留断点文件时,关闭构建前清空工作区的配置)。

二、Groovy Pipeline脚本实现(核心方案)

关键是让测试用例可拆分、执行进度可记录,节点断开后自动等待恢复并从断点续跑。以下是完整示例脚本:

pipeline {
    agent { label 'selenium-test-node' } // 指定你的Selenium节点标签
    stages {
        stage('Resume Selenium Tests') {
            steps {
                script {
                    // 初始化执行进度:读取断点文件,无则从第一个用例开始
                    def checkpointFile = 'test_progress.txt'
                    def startIdx = fileExists(checkpointFile) ? readFile(checkpointFile).toInteger() : 0
                    // 按顺序排列的独立测试用例(必须是可单独执行的单元,比如TestNG/JUnit的单个test方法)
                    def testSuite = [
                        "com.example.tests.LoginTest",
                        "com.example.tests.CheckoutFlowTest",
                        "com.example.tests.UserProfileTest"
                    ]

                    // 从断点开始遍历执行
                    for (int i = startIdx; i < testSuite.size(); i++) {
                        def currentTest = testSuite[i]
                        try {
                            echo "Running test: ${currentTest}"
                            // 执行单个测试用例(根据你的构建工具调整命令,比如Maven/Gradle)
                            sh "mvn test -Dtest=${currentTest}"
                            
                            // 执行成功,更新断点为下一个用例的索引
                            writeFile file: checkpointFile, text: "${i + 1}"
                        } catch (Exception ex) {
                            // 判断是否为节点断开相关异常(根据实际报错信息调整匹配规则)
                            def nodeDisconnectErrors = ['Node is offline', 'Connection reset', 'Broken pipe']
                            def isNodeIssue = nodeDisconnectErrors.any { ex.toString().contains(it) }
                            
                            if (isNodeIssue) {
                                echo "Node disconnected! Waiting for node to come back online..."
                                // 循环等待节点恢复,每30秒检查一次
                                waitUntil {
                                    def targetNode = Jenkins.instance.getNode('selenium-test-node')
                                    targetNode != null && targetNode.toComputer().isOnline()
                                }
                                echo "Node recovered, retrying current test: ${currentTest}"
                                // 回退索引,让循环重新执行当前用例
                                i--
                            } else {
                                // 非节点异常,直接抛出终止构建
                                throw ex
                            }
                        }
                    }

                    // 所有测试完成,清理断点文件
                    sh "rm -f ${checkpointFile}"
                    echo "All tests completed successfully!"
                }
            }
        }
    }
}

三、关键注意事项

  1. 测试用例拆分:必须将大型测试拆分为独立、可单独执行的小单元,比如每个test方法对应一个业务步骤,这样断点续跑才有实际意义。
  2. 测试幂等性:每个测试用例必须是幂等的——重复执行不会改变测试环境或结果,比如执行前重置测试数据、恢复页面初始状态。
  3. 工作区持久化:确保节点恢复后,工作区的断点文件和测试环境依然存在,建议用共享存储挂载节点工作区,或使用Docker容器节点(保证环境一致性)。
  4. 异常匹配规则:脚本中的异常判断需要根据你实际节点断开时的报错信息调整,避免误判其他类型的执行异常。

四、插件辅助优化

如果不想写太多Groovy逻辑,可以结合TestNG/JUnit的测试报告+Checkpoint Plugin:

  • 用TestNG的testng.xml拆分测试套件,配合Checkpoint Plugin记录已通过的测试用例;
  • 节点恢复后,插件自动跳过已执行的用例,从第一个失败/未执行的用例开始。

不过这种方式灵活性不如自定义Pipeline脚本,建议优先选择Groovy方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:01:24