Jenkins执行Mvn Gatling:test时Gatling连接目标服务超时求助
嗨,我看了你遇到的问题——本地Postman能正常请求目标服务,但在Jenkins里跑mvn gatling:test就出现连接超时,报错是io.netty.channel.ConnectTimeoutException,这大概率是Jenkins环境和你本地环境的网络或配置差异导致的,我整理了几个最可能的排查方向,你可以逐一试试:
1. 先确认Jenkins节点的网络连通性
这是最常见的原因!你本地Postman能通不代表Jenkins所在的服务器(或者构建Agent节点)能访问目标IP和端口。建议你在Jenkins的构建步骤里先加一个网络测试命令:
- 如果是Linux节点,新增执行Shell步骤:
nc -zv 82.71.82.20 32100或者telnet 82.71.82.20 32100 - 如果是Windows节点,新增执行PowerShell步骤:
Test-NetConnection 82.71.82.20 -Port 32100
如果这个测试直接失败,那就是网络层面被拦截了——可能是Jenkins节点的防火墙、目标服务的安全组、公司的网络策略限制了访问,得联系运维开放对应IP和端口的访问权限。
2. 排查HTTPS证书信任问题
你的Gatling代码里用的是HTTPS协议,目标服务的证书如果是自签名的,或者没有被Jenkins节点的JVM信任,Gatling在SSL握手阶段可能会卡住,最终表现为超时错误。可以先做个临时测试验证:
在你的BaseSimulation的httpConfig里临时禁用SSL证书验证(注意这只适合测试,生产环境别这么干):
protected final HttpProtocolBuilder httpConfig = http.baseUrl("https://82.71.82.20:32100") .disableWarmUp() .disableUrlEncoding() .userAgentHeader("Gatling") .header("Accept", "*/*") .header("Accept-Encoding", "gzip, deflate, br") .header("Connection", "keep-alive") .header("Content-Type", "application/json") // 临时添加这行禁用SSL验证 .sslSocketFactory(InsecureSslSocketFactory.INSTANCE);
如果改完之后能正常连接,那就是证书信任的问题。解决方法是把目标服务的证书导入到Jenkins节点使用的JVM信任库中,用keytool命令操作:
keytool -import -alias target-service -keystore $JAVA_HOME/jre/lib/security/cacerts -file /path/to/your/certificate.crt
默认信任库密码是changeit。
3. 调整Gatling的超时时间配置
Jenkins环境的网络延迟可能比你本地高,Gatling默认的连接/响应超时时间可能不够用。你可以在httpConfig里显式设置更长的超时:
.connectTimeout(Duration.ofSeconds(10)) .responseTimeout(Duration.ofSeconds(20))
比如上面这样把连接超时设为10秒,响应超时设为20秒,看看是否还会超时。
4. 检查Jenkins的Maven代理配置
如果你的Jenkins全局配置里给Maven设置了代理,但代理没有允许访问目标服务的IP,那Gatling在Maven执行时会走代理,导致无法连接。可以在mvn gatling:test命令里加上参数,让Maven跳过该IP的代理:
mvn gatling:test -Dhttp.nonProxyHosts=82.71.82.20
或者去Jenkins的「全局工具配置」里检查Maven的settings.xml,看是否有代理配置影响了访问。
另外,你提供的报错信息和代码我也看了,代码本身的逻辑和配置是没问题的,重点还是放在Jenkins环境和本地的差异上!
内容来源于stack exchange

