Github Action执行Knex.js数据库迁移失败,疑与环境变量相关
解决Github Action执行Objection.js/Knex迁移时的数据库密码认证失败问题
从你描述的情况和错误日志来看,问题的核心确实是Github Action执行上下文无法正确获取数据库环境变量——毕竟手动SSH登录服务器能正常跑迁移,说明服务器本地的环境配置没问题,但Action的SSH会话默认不会自动加载这些环境变量,导致knex拿不到正确的数据库密码,触发了password authentication failed错误。
下面是一步步的排查和解决方法:
1. 显式加载服务器上的环境变量文件
如果你的数据库配置存在服务器的.env文件或者用户profile(比如.bashrc/.profile)里,Github Action发起的SSH会话是非交互式的,默认不会自动加载这些文件。你需要在执行迁移命令前手动加载:
script: | cd ~/app/app git pull origin master npm install --production npm run build # 根据你的实际文件路径调整,加载环境变量 source ~/app/app/.env npm run migrate pm2 restart digthemes
2. 通过Github Secrets传递敏感变量
如果你的数据库密码是存在Github仓库的Secrets中,需要在Action脚本里把它注入到执行环境中:
- 先去仓库的「Settings」→「Secrets and variables」→「Actions」里添加
DB_PASSWORD(或你对应的变量名)这个Secret; - 然后修改Action脚本,注入环境变量:
script: | cd ~/app/app git pull origin master npm install --production npm run build # 注入从Github Secrets获取的密码及其他数据库变量 export DB_PASSWORD=${{ secrets.DB_PASSWORD }} export DB_USER=${{ secrets.DB_USER }} export DB_HOST=${{ secrets.DB_HOST }} npm run migrate pm2 restart digthemes
3. 验证Action执行时的环境变量状态
为了确认变量是否被正确加载,可以在脚本中临时添加检查命令(敏感信息不要直接输出,测试后记得删除):
script: | cd ~/app/app git pull origin master npm install --production npm run build # 检查变量是否存在(仅用于测试) echo "DB_USER 是否存在?$([ -n "$DB_USER" ] && echo "是" || echo "否")" echo "DB_PASSWORD 是否存在?$([ -n "$DB_PASSWORD" ] && echo "是" || echo "否")" npm run migrate pm2 restart digthemes
从Action的运行日志里就能直观看到变量是否被正确获取。
4. 核对Knex配置文件的环境读取逻辑
确保你的knexfile.js/knexfile.ts在production环境下,确实是从环境变量读取数据库信息,而不是硬编码或者使用了错误的变量名。示例配置:
module.exports = { production: { client: 'pg', connection: { host: process.env.DB_HOST, user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME }, migrations: { directory: './migrations' } } };
按照上面的步骤排查,基本就能解决环境变量导致的迁移失败问题。
内容的提问来源于stack exchange,提问作者quazar
相关产品推荐
相关产品推荐

