Jenkins上运行Spring Boot Maven测试时无法连接MySQL数据库
解决Jenkins流水线无法连接远程MySQL的问题
问题分析
你遇到的ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock'错误,说明Jenkins流水线执行mysql命令时,实际在尝试连接本地MySQL而非你指定的远程IP192.168.112.2。即使你加了-h参数,也可能被以下因素干扰:
- 流水线中存在无效命令导致后续执行异常
- 硬编码凭证的写法有问题,或未正确使用Jenkins凭证变量
- Jenkins Agent的Shell环境与本地终端不同(比如全局MySQL配置文件
~/.my.cnf覆盖了连接参数)
修正步骤
1. 清理无效命令并规范MySQL连接逻辑
你的流水线里sh "mysql connection"是无效命令,执行时会直接报错,导致后续逻辑异常。同时不要硬编码用户名密码,改用Jenkins凭证变量:
stage('Run the test cases'){ steps{ withCredentials([usernamePassword(credentialsId: '4a632d56-baf5-4455-90fe-21e6823f58f1', passwordVariable: 'DB_PASSWORD', usernameVariable: 'DB_USER')]) { sh "echo 'Starting MySQL connection test...'" # 使用--password参数避免特殊字符解析问题,同时明确指定默认端口 sh "mysql -h 192.168.112.2 -P 3306 -u${DB_USER} --password=${DB_PASSWORD} -e 'SELECT 1;'" sh "echo 'MySQL connection test passed'" # 传递凭证变量给Maven测试 sh "mvn test -Dspring.datasource.username=${DB_USER} -Dspring.datasource.password=${DB_PASSWORD}" } } }
- 用
-e 'SELECT 1;'直接执行测试SQL,避免进入交互模式卡住流程 - 明确指定
-P 3306端口,防止被配置文件覆盖 - 改用
--password=${DB_PASSWORD}替代-p${DB_PASSWORD},如果密码包含!、@等特殊字符,后者会出现解析错误
2. 排查Jenkins Agent的环境差异
- 登录Jenkins Agent机器,切换到Jenkins运行用户(通常是
jenkins)执行相同的mysql命令,确认是否能连接:sudo su jenkins mysql -h 192.168.112.2 -P 3306 -u<你的用户名> -p<你的密码> -e 'SELECT 1;' - 检查Jenkins用户下是否存在
~/.my.cnf配置文件,如果有,里面的host参数可能覆盖了命令行的-h,需要删除或修改该文件
3. 验证网络连通性
在流水线中先测试远程MySQL的端口是否可达:
sh "nc -zv 192.168.112.2 3306" # 若nc不存在,改用telnet sh "telnet 192.168.112.2 3306"
如果这一步失败,说明Jenkins Agent到MySQL服务器的网络有问题(比如防火墙、安全组限制),需要先打通网络。
4. 检查Spring Boot测试配置
确保测试用例的数据库配置指向远程IP而非localhost:
# src/test/resources/application-test.properties spring.datasource.url=jdbc:mysql://192.168.112.2:3306/你的数据库名?useSSL=false&serverTimezone=UTC spring.datasource.username=${spring.datasource.username} spring.datasource.password=${spring.datasource.password}
内容的提问来源于stack exchange,提问作者Maninder
相关产品推荐
相关产品推荐

