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

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后问题依旧。

核心原因分析

  1. Sequelize与原生mariadb连接器混用:报错来自Sequelize,但提供的Database类使用原生mariadb.createConnection,说明应用中存在未正确配置的Sequelize连接实例,未传入用户/密码参数。
  2. 环境变量空值干扰:Jenkins环境中可能存在空字符串的DATABASE_USER/DATABASE_PASSWORD环境变量,若Sequelize直接读取环境变量未做处理,会导致空用户无密码的连接请求。
  3. 权限配置验证不充分:虽已创建用户,但需确认权限是否真正生效,且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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:35:21