Jenkins流水线中Node.js应用连接MariaDB遇1045权限拒绝错误
Jenkins流水线中Node.js应用连接MariaDB的访问拒绝问题解决
问题场景
为Node.js应用搭建Jenkins流水线,使用集成MariaDB的Ubuntu Docker镜像。数据库可正常启动,Jenkinsfile能连接并执行SQL脚本创建testuser,且连接信息打印正确,但运行测试时Node应用抛出错误:
SequelizeAccessDeniedError: (conn=14, no: 1045, SQLState: 28000) Access denied for user ''@'127.0.0.1' (using password: NO)
本地环境下应用连接MariaDB及集成测试均正常,尝试设置socketPath后问题依旧。
核心原因分析
- Sequelize与原生mariadb连接器混用:报错来自Sequelize,但提供的Database类使用原生
mariadb.createConnection,说明应用中存在未正确配置的Sequelize连接实例,未传入用户/密码参数。 - 环境变量空值干扰:Jenkins环境中可能存在空字符串的
DATABASE_USER/DATABASE_PASSWORD环境变量,若Sequelize直接读取环境变量未做处理,会导致空用户无密码的连接请求。 - 权限配置验证不充分:虽已创建用户,但需确认权限是否真正生效,且MariaDB中
localhost(socket连接)与127.0.0.1(TCP连接)为不同主机身份。
解决方案步骤
1. 排查并修正Sequelize配置
检查应用中所有Sequelize实例的配置,确保使用正确的用户、密码、主机参数:
// 示例Sequelize配置修正 const sequelize = new Sequelize( process.env.DATABASE_NAME || 'instance1', process.env.DATABASE_USER || 'testuser', process.env.DATABASE_PASSWORD || 'password', { host: process.env.API_IP || 'localhost', dialect: 'mariadb' } );
2. 强制设置Jenkins环境变量
在Running Integration Tests阶段明确注入环境变量,避免空值干扰:
stage ('Running Integration Tests') { steps { echo "*** Starting Integration Tests ***" sh ''' export DATABASE_USER=testuser export DATABASE_PASSWORD=password export API_IP=localhost (npm run dev-api & npm run dev-frontend-instance1 & npm run dev-frontend-instance2) && npm run test-integration ''' } }
3. 强化环境变量读取逻辑
将Database类中的三元运算符替换为空值合并运算符(仅在变量为null/undefined时取默认值,避免空字符串干扰):
private _connectionDetails = { host: process.env.API_IP ?? "localhost", user: process.env.DATABASE_USER ?? "testuser", password: process.env.DATABASE_PASSWORD ?? "password", port: 3306, database: "" };
4. 验证MariaDB权限生效
在Jenkins的Setup test data in database阶段添加权限验证命令,确认用户权限正确:
sh "echo password | mariadb -u root -p -e \"SHOW GRANTS FOR 'testuser'@'127.0.0.1';\"" sh "echo password | mariadb -u root -p -e \"SHOW GRANTS FOR 'testuser'@'localhost';\""
5. 确认数据库服务就绪
在启动MariaDB后添加延迟,确保服务完全初始化后再执行后续操作:
sh "service mariadb start -v --skip-name-resolve" sh "sleep 5" // 等待服务就绪
内容的提问来源于stack exchange,提问作者chladnefazole
相关产品推荐
相关产品推荐

