Github Actions中MariaDB集成测试失败排查求助
核心问题分析
从报错栈来看,ScriptStatementFailedException和SQLSyntaxErrorException是关键线索:要么是数据库连接参数配置错误导致无法建立连接,要么是初始化脚本schema-mariadb-init.sql存在MariaDB不兼容的语法,或者容器初始化未完全完成就启动了测试流程。
逐一排查与解决方案
1. 端口映射与访问端口不匹配
Github Actions Runner可能因端口占用,自动将services的端口映射为随机端口,而非固定的3306。你当前的Verify MariaDB connection步骤使用了动态端口变量,但测试用application.properties里写死了3306,这会导致连接地址不匹配。
解决方法:
- 修改workflow中MariaDB的ports配置为动态映射:
ports: - 3306/tcp - 在测试步骤前添加脚本,替换
application.properties里的端口:- name: Update DB port in test config run: | sed -i "s/3306/${{ job.services.mariadb.ports[3306] }}/g" src/test/resources/application.properties
2. 初始化脚本存在语法错误
ScriptStatementFailedException明确指向初始化脚本执行失败,大概率是脚本中的SQL语法与mariadb:latest版本不兼容(比如最新版MariaDB对某些语法规则做了调整)。
解决方法:
- 将
schema-mariadb-init.sql中的语句复制到本地最新版MariaDB中执行,排查是否存在语法错误(比如关键字冲突、不支持的函数、字符集设置问题)。 - 例如:将脚本中的
TYPE=InnoDB改为ENGINE=InnoDB;将utf8替换为utf8mb4以适配更多字符场景。
3. 数据库密码配置不匹配
确认application.properties里的密码与Github Secrets中的MARIADB_ROOT_PASSWORD完全一致,注意特殊字符的转义(比如密码包含$、&等符号时,在properties文件中需要转义处理)。
验证方法:
在Verify MariaDB connection步骤后添加登录测试:
- name: Test DB login with password env: PORT: ${{ job.services.mariadb.ports[3306] }} PASSWORD: ${{ secrets.MARIADB_ROOT_PASSWORD }} run: | mysql -h127.0.0.1 -P$PORT -uroot -p"$PASSWORD" -e "SELECT 1;"
4. MariaDB容器初始化未完全完成
健康检查healthcheck.sh --connect --innodb_initialized仅能确认服务启动,但目标数据库({databaseName})的创建、权限配置可能尚未完成,此时执行测试会因数据库未就绪而失败。
解决方法:
修改验证步骤,等待数据库完全可用:
- name: Wait for DB to be fully initialized env: PORT: ${{ job.services.mariadb.ports[3306] }} PASSWORD: ${{ secrets.MARIADB_ROOT_PASSWORD }} DB_NAME: '{databaseName}' run: | while ! mysql -h127.0.0.1 -P$PORT -uroot -p"$PASSWORD" -e "USE $DB_NAME;" > /dev/null 2>&1; do echo "Waiting for database $DB_NAME to be ready..." sleep 2 done
5. JDBC驱动版本与MariaDB版本不兼容
你使用的mariadb-java-client:2.6.2是2021年的旧版本,而mariadb:latest为当前最新稳定版(如10.11+),旧驱动可能不支持新的MariaDB协议或认证方式。
解决方法:
升级驱动到最新兼容版本(比如3.3.3),修改build.gradle:
implementation group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version: '3.3.3'
内容的提问来源于stack exchange,提问作者devHyun

