Jenkins运行Maven Selenium任务间歇性报Connection reset问题排查
问题背景
我们配置了一条Jenkins流水线任务用于承载Java应用,该应用通过Maven管理依赖,执行一系列Selenium自动化任务。构建过程会偶发因Connection Reset错误失败,也可正常构建成功。该问题为间歇性出现,仅凭借堆栈跟踪提供的有限信息无法定位故障原因。程序在本地环境运行完全正常,仅在Jenkins上执行时会出现该偶发故障,已尝试更新Surefire插件依赖,问题未解决。
故障报错日志
[ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream. [ERROR] There was an error in the forked process [ERROR] java.net.SocketException: Connection reset [ERROR] org.apache.maven.surefire.booter.SurefireBooterForkException: There was an error in the forked process [ERROR] java.net.SocketException: Connection reset [ERROR] at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:733) [ERROR] at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:305) [ERROR] at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:265) [ERROR] at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1314) [ERROR] at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1159) [ERROR] at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:932) [ERROR] at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137) [ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210) [ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156) [ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148) [ERROR] at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117) [ERROR] at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81) [ERROR] at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56) [ERROR] at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128) [ERROR] at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305) [ERROR] at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192) [ERROR] at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105) [ERROR] at org.apache.maven.cli.MavenCli.execute(MavenCli.java:957) [ERROR] at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:289) [ERROR] at org.apache.maven.cli.MavenCli.main(MavenCli.java:193) [ERROR] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [ERROR] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) [ERROR] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [ERROR] at java.base/java.lang.reflect.Method.invoke(Method.java:568) [ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282) [ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225) [ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406) [ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347) [ERROR] [ERROR] -> [Help 1]
现象补充
- 耗时25秒构建完成的任务为触发Connection reset的失败任务,绿色标识的任务为构建成功的任务

项目POM.xml配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com</groupId> <artifactId>AUTOMATION</artifactId> <version>0.0.1-SNAPSHOT</version> <name>AUTOMATION</name> <url>xyz</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.14.3</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.aventstack</groupId> <artifactId>extentreports</artifactId> <version>5.0.8</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>io.github.bonigarcia</groupId> <artifactId>webdrivermanager</artifactId> <version>4.4.3</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-chrome-driver</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.17.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.17.1</version> </dependency> </dependencies> <repositories> <repository> <snapshots> <enabled>false</enabled> </snapshots> <id>central</id> <name>repo1</name> <url>https://some.artifactory.com/xyz1</url> </repository> <repository> <snapshots/> <id>snapshots</id> <name>repo2</name> <url>https://some.artifactory.com/xyz2</url> </repository> </repositories> <build> <resources> <resource> <directory>src/main/java/resources</directory> <filtering>true</filtering> </resource> </resources> <pluginManagement> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M5</version> <configuration> <suiteXmlFiles> <suiteXmlFile>testng.xml</suiteXmlFile> </suiteXmlFiles> </configuration> </plugin> <plugin> <artifactId>maven-jar-plugin</artifactId> <version>3.0.2</version> </plugin> </plugins> </pluginManagement> </build> <organization> <name>XYZ Group</name> <url>www.XYZ.com</url> </organization> <issueManagement> <url>git01.xyz.com</url> </issueManagement> </project>
排查方向
这个报错的本质是Surefire启动的fork测试进程和主进程之间的Socket连接意外断开,外层堆栈没有记录fork进程本身的崩溃原因,按以下优先级排查即可:
- 优先查看Surefire生成的dump文件:报错第一行提示的
[date].dump、[date]-jvmRun[N].dumpstream文件存放在Jenkins工作空间的target目录下,文件内会记录fork进程崩溃前的全量输出,比外层通用的SocketException堆栈信息完整度高很多,跳过这一步直接排查会浪费大量时间。 - 检查Jenkins节点资源限制:失败任务仅运行25秒就终止,大概率是测试进程启动阶段就被系统杀死。先确认Jenkins节点是否配置了cgroup内存、进程数上限,Selenium启动Chrome及对应驱动本身内存占用不低,如果节点同时运行多个构建任务,很容易触发OOM被系统查杀,进程被强制终止后就会报Connection Reset。可以在构建脚本开头加入
free -h、ulimit -u命令,构建前后打印内存余量、进程数限制做确认。 - 验证WebDriverManager网络逻辑:当前使用的4.4.3版本WebDriverManager默认会在每次运行时联网检查、下载对应版本浏览器驱动,Jenkins节点到驱动源、内部制品库的网络如果存在间歇性波动、连接重置,会直接导致测试进程启动失败。可以先配置WebDriverManager使用本地预存的固定版本驱动,关闭启动时的版本检查逻辑验证问题是否复现。
- 修复Surefire插件配置问题:当前使用的3.0.0-M5是里程碑版本,本身存在fork进程通信的已知缺陷,先升级到3.2.x正式稳定版,同时在插件配置中显式添加
<forkNode implementation="org.apache.maven.plugin.surefire.extensions.SurefireForkNodeFactory"/>,禁用不稳定的原生fork通信方式;如果不需要做测试进程隔离,可以临时添加配置<forkCount>0</forkCount>,验证是否是fork通信机制本身导致的问题。 - 检查Jenkins进程清理规则:部分企业的Jenkins节点会配置闲置进程自动清理规则,测试启动的Chrome、ChromeDriver进程如果被误判为闲置进程查杀,也会触发相同的连接重置错误,可以在测试代码中添加全局异常钩子,崩溃前打印浏览器、驱动进程的存活状态做确认。
内容的提问来源于stack exchange,提问作者brownginger
相关产品推荐
相关产品推荐

