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

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

WBOY
Freigeben: 2024-02-05 21:54:07
nach vorne
1027 Leute haben es durchsucht

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
Nach dem Login kopieren

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
}
Nach dem Login kopieren

...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
}
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage