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

GitLab Shell Runner下Cucumber报告生成不稳定及HttpHostConnectException问题求助

解决GitLab Shell Runner上Cucumber报告生成不稳定+HttpHostConnectException问题

这种不稳定的报告生成问题+连接拒绝错误,我之前在迁移Jenkins自动化测试项目到GitLab Runner时也遇到过类似情况,大概率是资源未正确清理或环境进程隔离差异导致的,给你几个排查和解决的方向:

1. 优先排查WebDriver资源未彻底释放的问题

线程未正常终止的警告是关键信号——测试结束后Selenium WebDriver没有被正确关闭,会残留进程占用端口(比如你看到的23723),导致后续步骤(比如报告生成工具)无法连接该端口,最终触发Maven构建失败。

修复步骤:

  • 在Cucumber的@After钩子中强制调用driver.quit()(不要用driver.close(),后者只会关闭当前窗口,不会终止Driver进程),并添加异常处理避免钩子失败影响构建:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.cucumber.java.After;
import org.openqa.selenium.WebDriver;

public class Hooks {
    private static final Logger logger = LoggerFactory.getLogger(Hooks.class);
    private WebDriver driver; // 假设你的Driver实例在这里

    @After
    public void tearDown() {
        try {
            if (driver != null) {
                driver.quit();
                driver = null; // 置空帮助GC回收
            }
        } catch (Exception e) {
            logger.warn("清理WebDriver时出现异常,不影响构建继续: {}", e.getMessage());
        }
    }
}
  • 额外添加JVM关闭钩子,确保即使测试异常崩溃也能清理Driver进程:
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
    if (driver != null) {
        try {
            driver.quit();
        } catch (Exception e) {
            logger.error("JVM关闭钩子清理WebDriver失败: ", e);
        }
    }
}));

2. 调整Maven exec-maven-plugin的进程等待配置

你使用的exec插件1.6.0版本可能存在进程管理的bug,导致测试进程未完全终止就开始执行报告生成步骤。

修复步骤:

  • 在pom.xml的exec插件配置中添加<wait>true</wait>和<killAfter>参数,确保Maven等待测试进程彻底结束:
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.6.0</version>
    <executions>
        <execution>
            <id>run-cucumber-tests</id>
            <phase>test</phase>
            <goals>
                <goal>java</goal>
            </goals>
            <configuration>
                <mainClass>your.package.CucumberTestRunner</mainClass>
                <!-- 强制等待测试进程执行完成 -->
                <wait>true</wait>
                <!-- 如果进程超时30秒则强制终止 -->
                <killAfter>30000</killAfter>
            </configuration>
        </execution>
    </executions>
</plugin>
  • 考虑升级exec插件到1.7.0版本(该版本修复了多个进程管理相关的问题):
<version>1.7.0</version>

3. 排查GitLab Runner的环境差异

即使你模拟了Jenkins的Java/Maven版本,Shell Runner的执行环境仍可能有差异:

  • 端口占用排查:在Runner上添加构建前后的端口检查脚本,确认23723端口是否被残留进程占用。比如在.gitlab-ci.yml中:
before_script:
  # Linux环境检查端口占用
  - lsof -i :23723 || echo "端口23723未被占用"
after_script:
  - lsof -i :23723 || echo "端口23723未被占用"
  # 强制清理残留的Java进程(谨慎使用,避免误杀其他服务)
  - pkill -f "java.*cucumber" || true
  • 调整Runner超时设置:在Runner的config.toml文件中延长超时时间,避免Runner提前终止测试进程:
[[runners]]
  name = "Your Shell Runner"
  executor = "shell"
  timeout = 3600 # 延长到1小时
  request_concurrency = 1 # 避免并发构建导致资源冲突

4. 定位连接请求的发起方

如果以上步骤无效,需要明确是哪个组件在尝试连接localhost:23723:

  • 运行Maven时开启 debug 日志:mvn test -X,查看完整的错误栈,找到发起连接的类或方法。
  • 检查你的Cucumber报告插件配置(比如cucumber-reporting插件),是否有错误的端口配置导致它尝试连接本地服务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:00:14