GitHub Actions中Rails多数据库CI测试配置问题排查
问题根因
CI环境辅助数据库初始化失败由两个配置错误导致:
database.yml中test环境的主库、warehouse辅助库均继承calendarize配置段,该段的用户名、密码读取CALENDARIZE_DATABASE_USERNAME、CALENDARIZE_DATABASE_PASSWORD环境变量,但CI流程未全局配置这两个变量。同时Rails多数据库场景下,单步设置的DATABASE_URL仅对主库生效,辅助库无法读取该配置,最终连库时因缺少鉴权信息被Postgres拒绝,报错截图如下:
- GitHub Actions的Postgres服务容器仅会在首次启动时,自动创建
POSTGRES_DB指定的单个数据库,分步骤设置POSTGRES_DB不会触发服务二次创建新库,加之前述鉴权问题,db:create:warehouse命令无法正常执行。
修复步骤
1. 调整ci.yml配置
核心修改点:全局注入数据库账号密码环境变量、增加Postgres服务健康检查保证启动完成后再执行操作、直接通过命令创建两个测试库避免依赖镜像自动建库逻辑,修正后完整配置如下:
# ci.yml name: Continuous Integration on: pull_request: branches: [ main ] jobs: test: name: Testing runs-on: ubuntu-latest services: postgres: image: postgres:12 ports: - "5432:5432" env: POSTGRES_USER: rails POSTGRES_PASSWORD: password options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 env: RAILS_ENV: test RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }} # 全局配置database.yml依赖的账号密码变量,主库、辅助库均可读取 CALENDARIZE_DATABASE_USERNAME: rails CALENDARIZE_DATABASE_PASSWORD: password steps: - name: Checkout code uses: actions/checkout@v3 - name: Set up Chromedriver uses: nanasess/setup-chromedriver@v1 - name: Install Ruby and gems uses: ruby/setup-ruby@1a68550f2e3309e13c8ccb91ac6b8786f59ee147 with: bundler-cache: true - name: Create test databases run: | PGPASSWORD=password psql -h localhost -U rails -c "CREATE DATABASE calendarize_test;" PGPASSWORD=password psql -h localhost -U rails -c "CREATE DATABASE warehouse_test;" - name: Run database migrations run: | bin/rails db:migrate:primary bin/rails db:migrate:warehouse - name: Start Chromedriver run: | export DISPLAY=:99 chromedriver --url-base=/wd/hub --disable-dev-shm-usage & sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 & - name: Run tests run: bundle exec rspec --color
2. 校验database.yml配置
当前database.yml的test环境逻辑无问题,只要CI环境能正确读取到账号密码环境变量即可正常连接。如果想进一步降低环境变量依赖,也可以直接给test环境写死CI对应的连接参数,调整后test段配置如下:
# database.yml test段 test: primary: <<: *default host: localhost username: rails password: password database: calendarize_test warehouse: <<: *default host: localhost username: rails password: password database: warehouse_test migrations_paths: db/warehouse_migrate
其余环境的配置保持原有逻辑即可。
排查注意事项
- 必须给Postgres服务加健康检查,避免服务未完全启动就执行后续连库操作,触发随机连接失败
- 环境变量名需和
database.yml中读取的名称完全一致,避免拼写错误导致参数读取为空
内容的提问来源于stack exchange,提问作者Hash G
相关产品推荐
相关产品推荐

