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

如何在GitLab CI中使用structure.sql运行Rails项目的RSpec测试?

解决GitLab CI中使用structure.sql时RSpec测试失败的问题

问题根源

当你把Rails项目的schema格式改为:sql(使用structure.sql)后,rake db:reset执行时会调用psql命令导入数据库结构,但这个命令默认不会读取database.yml里的连接配置(比如host: postgres),而是尝试连接localhost;同时你使用的ruby:2.6.3镜像默认没有安装psql客户端,这两个问题共同导致了执行失败。

解决方案

1. 在CI镜像中安装psql客户端

ruby:2.6.3基于Debian系统,需要手动安装postgresql-client才能使用psql命令。在before_script中添加安装步骤:

- apt-get update -qq && apt-get install -y -qq postgresql-client

2. 配置psql连接的环境变量

psql会自动读取PG*开头的环境变量,在.gitlab-ci.yml的variables中添加对应配置,让psql能正确连接到GitLab CI的postgres服务:

variables:
  # 原有变量保留
  POSTGRES_DB: my_project_test
  POSTGRES_USER: admin
  POSTGRES_PASSWORD: 1234
  POSTGRES_HOST_AUTH_METHOD: trust
  RAILS_ENV: test
  BUNDLE_PATH: vendor/bundle
  # 添加psql连接变量
  PGHOST: postgres
  PGPORT: 5432
  PGUSER: admin
  PGPASSWORD: 1234
  PGDATABASE: my_project_test

3. 优化CI脚本(可选)

可以将db:reset拆分为更细的步骤,便于排查问题:

- bundle exec rake db:drop
- bundle exec rake db:create
- bundle exec rake db:structure:load
- bundle exec rake db:test:prepare

不过db:reset本身已包含这些步骤,只要连接配置正确,直接使用也可正常运行。

修改后的完整.gitlab-ci.yml示例

stages:
    - build
    - test

build-job:
    stage: build
    script:
        - echo "Hello"
test-job:
    stage: test
    image: ruby:2.6.3
    cache:
        key: ${CI_COMMIT_REF_SLUG}
        paths:
            - vendor/ruby
    services:
        - postgres:15.1
    variables:
        POSTGRES_DB: my_project_test
        POSTGRES_USER: admin
        POSTGRES_PASSWORD: 1234
        POSTGRES_HOST_AUTH_METHOD: trust
        RAILS_ENV: test
        BUNDLE_PATH: vendor/bundle
        PGHOST: postgres
        PGPORT: 5432
        PGUSER: admin
        PGPASSWORD: 1234
        PGDATABASE: my_project_test
    before_script:
        - apt-get update -qq && apt-get install -y -qq postgresql-client
        - gem install bundler -v 1.17.2
        - bundle install -j $(nproc) --path vendor
    script:
        - bundle exec rake db:reset RAILS_ENV=test
        - bundle exec rspec

验证注意事项

  • 确认postgresql-client安装成功,执行psql --version能正常输出版本信息
  • 确保PGHOST的值和GitLab CI中postgres服务的名称一致(这里是postgres)
  • 检查postgres服务版本(15.1)和项目中pg gem的版本兼容性,若出现版本不兼容问题,可调整postgres服务版本或pg gem版本

内容的提问来源于stack exchange,提问作者Raswidr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:55:37