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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:08:17