在GitLab CI运行Laravel测试时PostgreSQL连接被拒绝求助
解决GitLab CI中Laravel测试连接PostgreSQL被拒绝的问题
问题分析
从错误信息来看,测试连接尝试用127.0.0.1访问PostgreSQL,但GitLab CI中PostgreSQL服务的主机名应为postgres(而非本地回环地址)。另外,GitLab CI的每个Job是独立容器,composer阶段生成的.env文件不会自动传递到测试阶段,这也可能导致配置失效。
修复步骤
1. 确保测试阶段加载正确的环境配置
composer阶段生成的.env仅存在于该Job的容器中,测试阶段需要重新初始化环境配置:
修改pest_tests Job的脚本部分,添加环境变量初始化和服务等待步骤:
pest_tests: stage: testing dependencies: - composer - npm - build_assets script: - cp .env.ci .env - php artisan key:generate # 等待PostgreSQL服务完全启动 - until pg_isready -h postgres -p 5432 -U postgres; do sleep 1; done - php vendor/bin/pest
2. 检查并修正phpunit.xml的环境变量覆盖
如果phpunit.xml中设置了DB_HOST或TESTING_DB_HOST为127.0.0.1,会覆盖.env的配置。打开phpunit.xml,找到<php>节点,确保测试环境的主机名是postgres:
<php> <!-- 其他环境变量保持不变 --> <env name="DB_HOST" value="postgres"/> <!-- 若测试连接单独配置,也可直接指定 --> <env name="TESTING_DB_HOST" value="postgres"/> </php>
3. 验证测试连接的配置逻辑
确认database.php中的testing连接配置逻辑正确,确保主机优先级未出错:
'host' => env('TESTING_DB_HOST') ?? env('DB_HOST', '127.0.0.1'),
只要TESTING_DB_HOST未被额外设置,就会取.env中DB_HOST的值(即postgres),这个逻辑是正确的,只要不被phpunit.xml覆盖即可生效。
额外排查点
- 验证PHP扩展是否加载:在测试阶段脚本中添加
php -m | grep pdo_pgsql,确认pdo_pgsql扩展已正常安装。 - 直接测试数据库连通性:在测试阶段脚本中添加
psql -h postgres -U postgres -d test -c "SELECT 1;",若能成功执行,说明网络连接无问题。
内容的提问来源于stack exchange,提问作者user19747074
相关产品推荐
相关产品推荐

