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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:06:51