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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:27:21