亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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:[email protected]: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:[email protected]: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 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號