Heim >Backend-Entwicklung >Golang >Golang-Testcontainer mit Azure Devops-Pipeline: Container zufällig getötet?
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.
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!