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

合并前单元测试无法连接MySQL数据库(GitHub Actions+Laravel)

解决GitHub Actions中Laravel单元测试MySQL连接失败问题

问题根源

在GitHub Actions的容器化环境中,你配置的MySQL是作为独立服务容器运行的,而.env.ci中设置的DB_HOST=localhost指向的是运行测试的Ubuntu runner容器本身,而非MySQL服务容器,导致无法建立连接。

具体修复步骤

  1. 修改环境变量中的数据库主机
    更新.env.ci文件的DB_HOST值为服务容器名mysql:

    APP_KEY=
    APP_ENV=local
    DB_CONNECTION=mysql
    DB_HOST=mysql # 替换原localhost
    DB_PORT=3306
    DB_DATABASE=test_database
    DB_USERNAME=test_user
    DB_PASSWORD=test_password
    
  2. 适配MySQL 8.0认证插件(可选但推荐)
    MySQL 8.0默认使用caching_sha2_password认证插件,部分PHP版本的mysqlnd扩展可能存在兼容问题,可在工作流的MySQL服务配置中添加环境变量强制使用原生认证插件,同时优化健康检查命令:

    services:
      mysql:
        image: mysql:8.0
        env:
          MYSQL_ROOT_PASSWORD: test_root_password
          MYSQL_DATABASE: test_database
          MYSQL_USER: test_user
          MYSQL_PASSWORD: test_password
          MYSQL_AUTHENTICATION_PLUGIN: mysql_native_password # 新增此行
        ports:
          - 3306:3306
        options: --health-cmd="mysqladmin ping -u test_user -ptest_password" --health-interval=10s --health-timeout=5s --health-retries=3
    
  3. 确认Laravel数据库配置未硬编码主机
    检查config/database.php中的MySQL连接配置,确保使用环境变量而非硬编码值:

    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        // 其他保留配置
    ],
    

原理说明

GitHub Actions的服务容器与runner容器通过内部Docker网络通信,服务名(这里是mysql)会被解析为对应容器的内部IP地址,因此使用服务名作为数据库主机才能正确建立连接。

内容的提问来源于stack exchange,提问作者emabusi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:55:18