Jenkins集成SonarScanner分析时出现Read timed out错误原因咨询
从你给出的错误日志和环境配置来看,这个SonarScanner请求超时的问题核心是Jenkins容器内访问SonarQube服务时,要么服务未完全就绪,要么请求超时时间不足,或者SonarQube资源不够导致响应缓慢。下面分点拆解原因和对应的解决办法:
1. 最可能的原因:SonarQube服务未完全就绪就执行扫描
Docker Compose的depends_on只会保证SonarQube容器启动,但不会等SonarQube内部的Web服务完全启动(比如数据库连接、索引加载完成)。你浏览器能访问是因为宿主机访问时SonarQube已经就绪,但Jenkins启动后可能立刻触发扫描,此时SonarQube还在初始化,导致请求超时。
解决办法:在Jenkins扫描前添加等待SonarQube就绪的步骤
在你的Jenkins Job或者Jenkinsfile中,加入一段脚本,等待SonarQube的系统状态变为UP后再执行扫描:
# 循环检查SonarQube服务状态,直到就绪 until curl -s http://sonarqube:9000/sonarqube/api/system/status | grep -q '"status":"UP"' do echo "等待SonarQube服务就绪中..." sleep 10 done
这段脚本会每隔10秒检查一次SonarQube的健康API,直到服务完全启动。
2. SonarScanner默认超时时间太短
SonarScanner的默认Web请求超时时间可能不足以应对第一次扫描(需要加载大量配置或项目数据),或者SonarQube响应较慢时就会触发超时。
解决办法:增加SonarScanner的超时参数
在Jenkins的SonarScanner配置中,添加额外参数来延长超时时间(单位为秒,这里设置为5分钟):
- 如果是自由风格Job:在"SonarQube Scanner"构建步骤的"Additional arguments"中添加:
-Dsonar.ws.timeout=300 - 如果是Jenkinsfile流水线:在
sonar-scanner命令中加入参数:withSonarQubeEnv('你的SonarQube服务器名称') { sh 'sonar-scanner -Dsonar.ws.timeout=300 -Dsonar.projectKey=AplicacaoTeste ...' }
3. SonarQube容器资源不足
SonarQube 7.9.1版本至少需要2GB内存才能流畅运行,默认Docker容器分配的内存可能不够,导致服务响应缓慢,进而触发请求超时。
解决办法:给SonarQube容器分配足够的资源
修改你的Docker Compose文件,给SonarQube服务添加资源限制和JVM参数:
sonarqube: # ... 原有配置 deploy: resources: limits: memory: 4G # 最大内存 reservations: memory: 2G # 预留内存 environment: # 原有环境变量保留,添加JVM内存配置 - SONAR_WEB_JVM_OPTS="-Xmx2048m -Xms1024m" - SONAR_CE_JVM_OPTS="-Xmx2048m -Xms1024m"
同时,检查Docker Desktop的资源分配(设置 -> 资源),确保宿主机给Docker分配了足够的内存(至少4GB以上)。
4. 额外排查步骤:验证Jenkins容器内部的网络访问
如果上面的方法都无效,你可以进入Jenkins容器手动测试SonarQube的API,确认网络是否正常:
# 进入Jenkins容器 docker exec -it jenkins-container bash # 测试SonarQube API的访问 curl -v http://sonarqube:9000/sonarqube/api/settings/values.protobuf?component=AplicacaoTeste
如果这里也超时,说明是Jenkins和SonarQube之间的网络问题(比如Docker网络配置异常),可以尝试重启Docker网络或者重新创建容器;如果能正常返回,那大概率是扫描时的超时配置或项目大小导致的。
内容的提问来源于stack exchange,提问作者Ricardo

