Rails 7应用Heroku Pipeline测试阶段数据库创建连接失败求助
解决Heroku Pipeline测试环境数据库连接问题
问题根源
你的数据库配置和Heroku CI的运行环境不匹配,核心问题如下:
- 测试环境数据库名称格式错误:
database: db/test是SQLite的路径写法,但你使用的是PostgreSQL,数据库名不能包含斜杠,这会导致Heroku无法识别有效数据库名。 - 硬编码数据库认证信息:
username: postgres是本地PostgreSQL的默认配置,但Heroku CI提供的PostgreSQL实例用户名并非postgres,而是通过DATABASE_URL环境变量自动注入。 - 未适配Heroku CI的数据库连接方式:测试环境没有使用Heroku提供的
DATABASE_URL,而是沿用本地配置,导致无法连接CI环境的临时数据库。
修复步骤
1. 修正config/database.yml配置
替换为适配Heroku CI的配置,让测试环境自动读取Heroku提供的数据库连接信息:
default: &default adapter: postgresql encoding: unicode pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> development: <<: *default database: myapp_development username: postgres password: <%= ENV['WS_DATABASE_PASSWORD'] %> port: 5432 test: <<: *default url: <%= ENV['DATABASE_URL'] %> production: <<: *default url: <%= ENV['DATABASE_URL'] %>
- 移除了default块中的硬编码
username和password,仅在开发环境保留本地配置。 - 测试和生产环境直接使用
DATABASE_URL,该变量由Heroku自动设置,包含所有必要的连接参数(主机、端口、用户名、密码、数据库名)。
2. 更新app.json添加测试初始化脚本
Heroku CI需要明确的命令来初始化测试数据库,修改app.json:
{ "environments": { "test": { "addons": [ "heroku-postgresql:mini", "heroku-redis:mini" ], "scripts": { "test-setup": "bin/rails db:create db:schema:load" } } } }
test-setup脚本会在测试运行前执行,确保数据库被创建并加载最新的schema(用db:schema:load比db:migrate更适合测试环境,避免迁移顺序问题)。
3. 提交修改并重新触发测试
将上述修改提交到Git仓库,推送到关联Heroku Pipeline的分支,然后在Pipeline的测试标签页重新运行测试。
内容的提问来源于stack exchange,提问作者Anders
相关产品推荐
相关产品推荐

