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

Github Actions配置Ruby项目遇PG::ConnectionBad域名解析失败求助

解决GitHub Actions中PostgreSQL连接错误:PG::ConnectionBad: could not translate host name "db" to address

问题核心

错误提示里的主机名是db,但你在GitHub Actions的环境变量中配置的是localhost,说明你的Rails项目config/database.yml文件的test环境配置里,数据库主机被硬编码为db,没有正确读取环境变量,导致连接失败。同时还存在环境变量密码不匹配的问题。

修复步骤

1. 修正config/database.yml的test环境配置

确保test环境的配置优先读取环境变量,避免硬编码主机名:

test:
  adapter: postgresql
  database: <%= ENV.fetch("PG_DATABASE") { "your_app_test" } %>
  host: <%= ENV.fetch("PG_HOST") { "localhost" } %>
  username: <%= ENV.fetch("PG_USER") { "postgres" } %>
  password: <%= ENV.fetch("PG_PASSWORD") { "postgres" } %>
  port: 5432
  encoding: unicode

替换your_app_test为你实际的测试数据库名称。

2. 统一GitHub Actions中的密码配置

你在services.postgres里设置的POSTGRES_PASSWORD是postgres,但在Setup database步骤的PG_PASSWORD写的是password,两者不匹配会导致认证失败,修正为一致的密码:

- name: Setup database
  env:
    PG_DATABASE: postgres
    PG_HOST: localhost
    PG_USER: postgres
    PG_PASSWORD: postgres # 与services中的密码保持一致
    RAILS_ENV: test
    WITH_COVERAGE: true
    DISABLE_SPRING: 1
  run: |
    bundle exec rails db:setup

3. 简化冗余的GitHub Actions步骤

ruby/setup-ruby@v1的bundler-cache: true已经会自动安装bundler和依赖包,不需要单独执行gem install bundler和bundle install,优化后的完整配置如下:

name: CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  test:
    runs-on: ubuntu-latest

    services: 
      postgres:
        image: postgres
        env:
          POSTGRES_PASSWORD: postgres
        ports: ['5432:5432']
        # 添加健康检查,确保PostgreSQL完全启动后再执行后续步骤
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    steps:
      - uses: actions/checkout@v2
      - name: Setup Ruby
        uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true

      - name: Install System Dependencies
        run: sudo apt install -yqq libpq-dev

      - name: Setup database
        env:
          PG_DATABASE: postgres
          PG_HOST: localhost
          PG_USER: postgres
          PG_PASSWORD: postgres
          RAILS_ENV: test
          WITH_COVERAGE: true
          DISABLE_SPRING: 1
        run: |
          bundle exec rails db:setup
          
      - name: Run Tests
        env:
          PGHOST: localhost
          PGUSER: postgres
          PGPASSWORD: postgres
          RAILS_ENV: test
        run: |
          bundle exec rake test

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:55:22