在GitHub Actions中运行Go集成测试时PostgreSQL连接失败排查
核心问题
你的测试代码或数据库连接配置默认用了Unix域套接字(从错误里的host=/tmp能看出来),但GitHub Actions里官方提供的PostgreSQL服务默认不会在/tmp路径下创建Unix套接字,而是只开启TCP端口连接(默认5432端口)。本地docker-compose能正常运行,大概率是你配置了把容器内的套接字挂载到宿主机器的/tmp目录,但GitHub Actions的PostgreSQL服务没做这个配置。
具体解决步骤
1. 改用TCP连接修改数据库连接字符串
把连接串里的host=/tmp换成host=localhost(GitHub Actions里PostgreSQL服务默认绑定localhost),同时补全端口、用户名、密码和数据库名。
比如原来的代码可能是:
db, err := sql.Open("postgres", "host=/tmp user=nonroot dbname=your_db sslmode=disable")
改成:
db, err := sql.Open("postgres", "host=localhost port=5432 user=postgres password=your_pwd dbname=your_db sslmode=disable")
注意:GitHub Actions的PostgreSQL服务默认用户名是postgres,密码需要在工作流文件里用POSTGRES_PASSWORD环境变量设置,数据库名没指定的话默认是postgres。
2. 检查GitHub Actions工作流配置
确保你的工作流文件正确配置了PostgreSQL服务,并设置好对应环境变量:
jobs: test: runs-on: ubuntu-latest services: postgres: image: postgres:latest env: POSTGRES_PASSWORD: your_pwd # 和连接串里的密码一致 POSTGRES_DB: your_db # 和连接串里的数据库名一致 ports: - 5432:5432 options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 steps: - uses: actions/checkout@v4 - name: 配置Go环境 uses: actions/setup-go@v5 with: go-version: '1.21' - name: 运行测试 env: DATABASE_URL: "host=localhost port=5432 user=postgres password=your_pwd dbname=your_db sslmode=disable" run: go test ./...
3. 用环境变量统一管理连接参数(推荐)
本地和GitHub Actions通过环境变量区分连接配置,比如本地把DATABASE_URL设为Unix套接字的连接串,GitHub Actions里设为TCP的连接串,这样不用改代码,只需要在不同环境配置环境变量就行。
额外可选方案(不推荐)
如果非要用Unix套接字连接,得在GitHub Actions的PostgreSQL服务配置里,把宿主机的/tmp目录挂载到容器内PostgreSQL套接字的默认路径(一般是/var/run/postgresql/),然后把连接串的host改成/var/run/postgresql/。但这种方式比TCP连接麻烦,没必要优先选。
内容的提问来源于stack exchange,提问作者panza

