首頁  >  文章  >  後端開發  >  Golang 測試容器與 Azure Devops 管線:容器被隨機殺死?

Golang 測試容器與 Azure Devops 管線:容器被隨機殺死?

WBOY
WBOY轉載
2024-02-05 21:54:071011瀏覽

Golang 测试容器与 Azure Devops 管道:容器被随机杀死?

問題內容

雖然使用golang testcontainers 實作和運行我的資料庫整合測試在本地非常有效,但我的測試似乎在azure devops 管道中隨機不起作用。

管道日誌顯示:

2023/01/09 16:06:02 (...) error: read tcp 127.0.0.1:52546->127.0.0.1:49161: read: connection reset by peer

新增容器日誌記錄、改進等待標準、刪除db 容器設定檔的使用(因此我不必將檔案複製到容器中)並停用ryuk 後,我想知道還需要做什麼,或者如果我我初始化容器不正確。

對於每個單元測試,測試容器都是這樣啟動的:

func setuptestdatabase(ctx context.context) (testcontainers.container, project.repository, error) {
    containerreq := testcontainers.containerrequest{
        skipreaper:   true,
        image:        "postgres:11.18-alpine3.17",
        exposedports: []string{"5432/tcp"},
        cmd:          []string{"postgres", "-c", "fsync=off"},
        env: map[string]string{
            "postgres_db":         "postgre",
            "postgres_password":   "postgres",
            "postgres_user":       "postgres",
            "pguser":              "postgres",
            "postgres_extensions": "uuid-ossp",
        },
    }

    containerreq.waitingfor = wait.forall(
        wait.forlisteningport("5432/tcp"),
        wait.forexec([]string{"pg_isready", "-t 10", "-q"}), // postgre docs: https://www.postgresql.org/docs/9.4/app-pg-isready.html
    ).withdeadline(3 * time.minute)

    dbcontainer, err := testcontainers.genericcontainer(
        ctx,
        testcontainers.genericcontainerrequest{
            containerrequest: containerreq,
            started:          true,
        })
    if err != nil {
        log.fatalf("database container could not be started. error: %s", err)
        return nil, nil, errors.withstack(err)
    }

    err = dbcontainer.startlogproducer(ctx)
    if err != nil {
        log.fatalf("logproducer could not be started. error: %s", err)
        return nil, nil, errors.withstack(err)
    }
    defer dbcontainer.stoplogproducer()
    lc := logconsumer{}
    dbcontainer.followoutput(&lc)

    port, err := dbcontainer.mappedport(ctx, "5432")
    if err != nil {
        log.fatalf("mapped port could not be retrieved. error: %s", err)
        return nil, nil, errors.withstack(err)
    }
    host, err := dbcontainer.host(ctx)
    if err != nil {
        log.fatalf("hostname could not be retrieved. error: %s", err)
        return nil, nil, errors.withstack(err)
    }

    global.config.postgres.host = host
    global.config.postgres.port = port.port()
    global.config.postgres.user = "postgres"
    global.config.postgres.password = "postgres"
    global.config.postgres.dbname = "postgre"
    global.config.local = true

    global.logger = logger.newnull(config.config{
        logging: config.logging{
            level: "debug",
        },
    })

    repository, err := new(ctx)
    if err != nil {
        log.fatalf("repository could not be setup. error: %s", err)
        return nil, nil, errors.withstack(err)
    }

    return dbcontainer, repository, nil
}

...使用 repository 建立儲存庫,err := new(ctx) 最後使用 migrate 來設定與我們的生產資料庫類似的資料庫,並使用 gorm 進行資料庫連接和處理等。

單元測試的基本範本是:

func Test_pg_Has(t *testing.T) {
    ctx := context.TODO()
    dbContainer, repository, err := SetupTestDatabase(ctx)
    if err != nil {
        t.Errorf("error running testcontainers, error: %s", err)
    }
    t.Cleanup(func() {
        if err := dbContainer.Terminate(ctx); err != nil {
            t.Fatalf("failed to terminate container: %s", err)
        }
        time.Sleep(10 * time.Second)
    })
    
    ... TEST_CODE
}

對於 azure pipeline,使用庫存 azure 代理池,go 版本為「1.18.0 x64」。

如有任何提示,我們將不勝感激,提前謝謝您。


正確答案


作為一個不太令人滿意的解決方案,我在創建容器後、設定資料庫連接之前添加了 5 秒的睡眠。

這可能是 Azure DevOps 特有的問題,因為我們發現即使在單一容器中執行的單元測試也會隨機失敗。

接受這個作為回應對社區來說也是一種挑戰...

以上是Golang 測試容器與 Azure Devops 管線:容器被隨機殺死?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除