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
相关产品推荐
相关产品推荐

