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。
修复步骤
修正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' %>优化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移除不必要的.env复制操作
GitLab CI中定义的variables会直接注入到运行环境中,Rails会自动读取这些变量,不需要复制.env.pipeline到.env,这个操作对你的问题没有帮助,可以删除。
验证
修改后重新触发GitLab流水线,适配器会正确使用postgresql,连接到你配置的postgres服务,测试应该能正常执行。
内容的提问来源于stack exchange,提问作者A. Vreeswijk

