如何在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
相关产品推荐
相关产品推荐

