合并前单元测试无法连接MySQL数据库(GitHub Actions+Laravel)
解决GitHub Actions中Laravel单元测试MySQL连接失败问题
问题根源
在GitHub Actions的容器化环境中,你配置的MySQL是作为独立服务容器运行的,而.env.ci中设置的DB_HOST=localhost指向的是运行测试的Ubuntu runner容器本身,而非MySQL服务容器,导致无法建立连接。
具体修复步骤
修改环境变量中的数据库主机
更新.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适配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确认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
相关产品推荐
相关产品推荐

