Heim  >  Artikel  >  Backend-Entwicklung  >  Golang-Testcontainer mit Azure Devops-Pipeline: Container zufällig getötet?

Golang-Testcontainer mit Azure Devops-Pipeline: Container zufällig getötet?

WBOY
WBOYnach vorne
2024-02-05 21:54:071022Durchsuche

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

Frageninhalt

Während die Implementierung und Ausführung meiner Datenbankintegrationstests mit Golang-Testcontainern lokal perfekt funktioniert, scheinen meine Tests in der Azure-Devops-Pipeline zufällig nicht zu funktionieren.

Pipeline-Protokoll zeigt:

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

Nachdem ich die Containerprotokollierung hinzugefügt, die Wartekriterien verbessert, die Verwendung der DB-Container-Konfigurationsdatei entfernt (damit ich die Dateien nicht in den Container kopieren muss) und Ryuk deaktiviert habe, frage ich mich, was noch getan werden muss. oder wenn ich den Container nicht richtig initialisiere.

Für jeden Unit-Test wird der Testcontainer wie folgt gestartet:

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
}

...verwenden Sie repository 创建存储库,err := new(ctx) und schließlich migrieren, um eine Datenbank ähnlich unserer Produktionsdatenbank einzurichten und gorm für Datenbankverbindungen und -verarbeitung usw. zu verwenden.

Die Grundvorlage für Unit-Tests ist:

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
}

Für die Azure-Pipeline verwenden Sie den Standard-Azure-Agent-Pool, die Go-Version ist „1.18.0 x64“.

Für Tipps wäre ich sehr dankbar, vielen Dank im Voraus.


Richtige Antwort


Als nicht zufriedenstellende Lösung habe ich nach dem Erstellen des Containers, aber vor dem Einrichten der Datenbankverbindung einen Ruhezustand von 5 Sekunden hinzugefügt.

Dies könnte ein Azure DevOps-spezifisches Problem sein, da Unit-Tests zufällig fehlschlagen, selbst wenn sie in einem einzelnen Container ausgeführt werden.

Dies als Reaktion zu akzeptieren, ist auch eine Herausforderung für die Community...

Das obige ist der detaillierte Inhalt vonGolang-Testcontainer mit Azure Devops-Pipeline: Container zufällig getötet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen