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

GitLab CI/CD中Rails流水线无法读取环境变量致测试失败求助

问题根源与解决方案

核心问题出在你的config/database.yml配置里——数据库适配器的默认值写错了。

错误原因分析

你在default配置块里把adapter的默认值设成了localhost:

adapter: <%= ENV['DB_CONNECTION'] || 'localhost' %>

但PostgreSQL对应的Active Record适配器名称是postgresql,localhost是数据库主机地址,不是适配器类型。

本地能正常运行,是因为你本地环境中大概率已经通过.env文件、shell环境变量等方式,把DB_CONNECTION设置成了postgresql,覆盖了默认值;而GitLab流水线里没有设置这个变量,所以Rails用了错误的默认值localhost,导致找不到对应的适配器,抛出LoadError。

修复步骤

  1. 修正database.yml的adapter默认值
    把默认值从localhost改成postgresql:

    default: &default
      adapter: <%= ENV['DB_CONNECTION'] || 'postgresql' %>
      encoding: unicode
      pool: 5
      host: <%= ENV['DB_HOST'] || 'localhost' %>
      port: <%= ENV['DB_PORT'] || 5432 %>
      username: <%= ENV['DB_USERNAME'] || 'postgres' %>
      password: <%= ENV['DB_PASSWORD'] || 'postgres' %>
    
  2. 优化CI脚本(可选但推荐)
    你的CI脚本里数据库初始化步骤顺序混乱,db:migrate和db:create db:schema:load重复且顺序不对。测试环境直接用db:setup即可,它会自动完成数据库创建、schema加载的操作,无需分开执行:

    script:
      - gem install bundler -v 2.4.14
      - bundle install
      - bundle exec rails db:setup
      - bundle exec rails test
    
  3. 移除不必要的.env复制操作
    GitLab CI中定义的variables会直接注入到运行环境中,Rails会自动读取这些变量,不需要复制.env.pipeline到.env,这个操作对你的问题没有帮助,可以删除。

验证

修改后重新触发GitLab流水线,适配器会正确使用postgresql,连接到你配置的postgres服务,测试应该能正常执行。

内容的提问来源于stack exchange,提问作者A. Vreeswijk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:05:37