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

Github Actions中MariaDB集成测试失败排查求助

排查Github Actions中Spring Boot测试连接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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:33:11