猿问

在 Github 操作中运行集成测试:与 postgres 连接的问题

我有一些集成测试,为了成功运行,需要一个正在运行的 postgres 数据库,通过 docker-compose 进行设置,并且我的 go 应用程序从main.go. 这是我的 docker-compose:


version: "3.9"

services:


  postgres:

    image: postgres:12.5

    user: postgres

    environment:

      POSTGRES_USER: postgres

      POSTGRES_PASSWORD: password

      POSTGRES_DB: my-db

    ports:

      - "5432:5432"

    volumes:

      - data:/var/lib/postgresql/data

      - ./initdb:/docker-entrypoint-initdb.d

networks:

  default:

    driver: bridge


volumes:

  data:

    driver: local

和我的 Github Actions 如下:


jobs:

  unit:

    name: Test

    runs-on: ubuntu-latest

    services:

      postgres:

        image: postgres:12.5

        env:

          POSTGRES_USER: postgres

          POSTGRES_PASSWORD: password

          POSTGRES_DB: my-db

        ports:

          - 5432:5432

    env:

      GOMODCACHE: "${{ github.workspace }}/.go/mod/cache"

      TEST_RACE: true 

   steps:

     - name: Initiate Database

       run: psql -f initdb/init.sql postgresql://postgres:password@localhost:5432/my-db


     - name: Set up Cloud SDK

       uses: google-github-actions/setup-gcloud@v0


     - name: Authenticate with GCP

       id: auth

       uses: "google-github-actions/auth@v0"

       with: credentials_json: ${{ secrets.GCP_ACTIONS_SECRET }}


     - name: Configure Docker

       run: |

         gcloud auth configure-docker "europe- docker.pkg.dev,gcr.io,eu.gcr.io"


     - name: Set up Docker BuildX

       uses: docker/setup-buildx-action@v1


     - name: Start App

       run: |

         VERSION=latest make images

         docker run -d -p 3000:3000 -e      POSTGRES_DB_URL='//postgres:password@localhost:5432/my-db?sslmode=disable' --name='app' image/app


我的测试在本地运行得很好,启动 docker-compose withdocker-compose up并从main.go. 但是,在 Github 操作中,我收到以下错误:


failed to connect to `host=/tmp user=nonroot database=`: dial error (dial unix /tmp/.s.PGSQL.5432: connect: no such file or directory

我错过了什么?谢谢


芜湖不芜
浏览 123回答 2
2回答

HUH函数

我认为这段代码有不止一个问题。问题一: 在你的代码中我没有看到你运行docker-compose up,因此我假设 Postgres 没有运行。问题二: 在这一行:docker run -d -p 3000:3000 -e POSTGRES_DB_URL='//postgres:password@localhost:5432/my-app?sslmode=disable' --name='app' image/app您将 Postgres 的主机指向localhost,它在您的本地机器上工作。因为本地主机是您的本地计算机。不过,在您使用时,docker run您并不是在本地机器上运行它,而是在 docker 容器中运行。本地主机指向容器内部。两者的可能解决方案由于您已经在使用 docker-compose,我建议您也在那里添加您的测试 Web 服务器。将您的 docker-compose 文件更改为:version: "3.9"services:  webapp:    build: image/app    environment:      POSTGRES_DB_URL='//postgres:password@postgres:5432/my-app?sslmode=disable'    ports:      - "3000:3000"    depends_on:      - "postgres"  postgres:    image: postgres:12.5    user: postgres    environment:      POSTGRES_USER: postgres      POSTGRES_PASSWORD: password      POSTGRES_DB: my-app    ports:      - "5432:5432"    volumes:      - data:/var/lib/postgresql/data      - ./initdb:/docker-entrypoint-initdb.dnetworks:  default:    driver: bridgevolumes:  data:    driver: local如果您现在运行docker-compose up,这两种服务都将可用。它应该有效。虽然我不是 github-actions 专家,所以我可能错过了一些东西。至少像这样,你可以像在 CI 中一样在本地运行你的测试,我一直认为这是一个很大的优势。

缥缈止盈

您缺少的是在 Github Actions 服务器中设置实际的 Postgres 客户端(这就是找不到 psql 工具的原因)。将其设置为一个步骤。&nbsp; &nbsp; &nbsp;- name: Install PostgreSQL client&nbsp; &nbsp; &nbsp; &nbsp; run: |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; apt-get update&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; apt-get install --yes postgresql-client除此之外,如果您通过 docker-compose 运行所有内容,您将需要等待 postgres 启动并运行(健康和接受连接)。考虑以下 docker-compose:version: '3.1'services:&nbsp; api:&nbsp; &nbsp; build: .&nbsp; &nbsp; depends_on:&nbsp; &nbsp; &nbsp; - db&nbsp; &nbsp; ports:&nbsp; &nbsp; &nbsp; - 8080:8080&nbsp; &nbsp; environment:&nbsp; &nbsp; &nbsp; - RUN_UP_MIGRATION=true&nbsp; &nbsp; &nbsp; - PSQL_CONN_STRING=postgres://gotstock_user:123@host.docker.internal:5432/gotstockapi?sslmode=disable&nbsp; &nbsp; command: ./entry&nbsp; &nbsp;&nbsp;&nbsp; db:&nbsp; &nbsp; image: postgres:9.5-alpine&nbsp; &nbsp; restart: always&nbsp; &nbsp; environment:&nbsp; &nbsp; &nbsp; - POSTGRES_USER=root&nbsp; &nbsp; &nbsp; - POSTGRES_PASSWORD=password&nbsp; &nbsp; ports:&nbsp; &nbsp; &nbsp; - "5432:5432"&nbsp; &nbsp; volumes:&nbsp; &nbsp; &nbsp; - ./db:/docker-entrypoint-initdb.d/您需要注意几件事。首先,在我们environment的部分中,它是作为环境变量传递的数据库的连接字符串。注意主机是。apiPSQL_CONN_STRING=postgres://gotstock_user:123@host.docker.internal:5432/gotstockapi?sslmode=disablehost.docker.internal除此之外,我们command: ./entry在 api 部分中有。该entry文件包含以下#!/bin/ash脚本:#!/bin/ashNOT_READY=1while [ $NOT_READY -gt 0 ] # <- loop that waits till postgres is ready to accept connectionsdo&nbsp;&nbsp; &nbsp; pg_isready --dbname=gotstockapi --host=host.docker.internal --port=5432 --username=gotstock_user&nbsp; &nbsp; NOT_READY=$?&nbsp; &nbsp; sleep 1done;./gotstock-api # <- actually executes the build of the apisleep 10go test -v ./it # <- executes the integration-tests最后,为了让 psql 客户端在上面的脚本中工作,api 的 docker 文件如下所示:# syntax=docker/dockerfile:1FROM golang:1.19-alpine3.15RUN apk add build-baseWORKDIR /appCOPY go.mod go.sum ./RUN go mod download && go mod verifyCOPY . .RUN apk add postgresql-clientRUN go build -o gotstock-apiEXPOSE 8080注意RUN apk add postgresql-client哪个安装了客户端。快乐黑客!=)
随时随地看视频慕课网APP

相关分类

Go
我要回答