为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
芜湖不芜 2023-03-07 17:13:34
我有一些集成测试,为了成功运行,需要一个正在运行的 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.dnetworks:  default:    driver: bridgevolumes:  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我错过了什么?谢谢
查看完整描述

2 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

我认为这段代码有不止一个问题。


问题一: 在你的代码中我没有看到你运行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.d

networks:

  default:

    driver: bridge


volumes:

  data:

    driver: local

如果您现在运行docker-compose up,这两种服务都将可用。它应该有效。虽然我不是 github-actions 专家,所以我可能错过了一些东西。至少像这样,你可以像在 CI 中一样在本地运行你的测试,我一直认为这是一个很大的优势。


查看完整回答
反对 回复 2023-03-07
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

您缺少的是在 Github Actions 服务器中设置实际的 Postgres 客户端(这就是找不到 psql 工具的原因)。


将其设置为一个步骤。


     - name: Install PostgreSQL client

        run: |

          apt-get update

          apt-get install --yes postgresql-client

除此之外,如果您通过 docker-compose 运行所有内容,您将需要等待 postgres 启动并运行(健康和接受连接)。


考虑以下 docker-compose:


version: '3.1'


services:

  api:

    build: .

    depends_on:

      - db

    ports:

      - 8080:8080

    environment:

      - RUN_UP_MIGRATION=true

      - PSQL_CONN_STRING=postgres://gotstock_user:123@host.docker.internal:5432/gotstockapi?sslmode=disable

    command: ./entry

    

  db:

    image: postgres:9.5-alpine

    restart: always

    environment:

      - POSTGRES_USER=root

      - POSTGRES_PASSWORD=password

    ports:

      - "5432:5432"

    volumes:

      - ./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/ash

NOT_READY=1

while [ $NOT_READY -gt 0 ] # <- loop that waits till postgres is ready to accept connections

do 

    pg_isready --dbname=gotstockapi --host=host.docker.internal --port=5432 --username=gotstock_user

    NOT_READY=$?

    sleep 1

done;

./gotstock-api # <- actually executes the build of the api

sleep 10

go test -v ./it # <- executes the integration-tests

最后,为了让 psql 客户端在上面的脚本中工作,api 的 docker 文件如下所示:



# syntax=docker/dockerfile:1


FROM golang:1.19-alpine3.15


RUN apk add build-base


WORKDIR /app


COPY go.mod go.sum ./

RUN go mod download && go mod verify


COPY . .


RUN apk add postgresql-client


RUN go build -o gotstock-api


EXPOSE 8080

注意RUN apk add postgresql-client哪个安装了客户端。


快乐黑客!=)


查看完整回答
反对 回复 2023-03-07
  • 2 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信