es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Los contenedores de prueba funcionan normalmente localmente en Windows, pero no cuando Jenkins está ejecutando las pruebas.

Tengo algunos contenedores de prueba en ejecución para mis pruebas de integración JUnit (Spring Boot, JUnit 5).

public static PostgreSQLContainer<?> postgresContainer = new PostgreSQLContainer<>("postgres:13")
            .withDatabaseName("test")
            .withUsername("postgres")
            .withPassword("testIntegration")
            .withExposedPorts(5432)
            .withInitScript("test.sql");

Y uno para otra base de datos PostgreSQL y uno genérico para ActiveMQ.

public static GenericContainer<?> aMQContainer = new GenericContainer<>("rmohr/activemq")
            .withExposedPorts(61616)
            .withEnv("DISABLE_SECURITY", "true")
            .withEnv("BROKER_CONFIG_GLOBAL_MAX_SIZE", "50000")
            .withEnv("BROKER_CONFIG_MAX_SIZE_BYTES", "50000")
            .withEnv("BROKER_CONFIG_MAX_DISK_USAGE", "100");
postgresContainer.start();
postgresContainer2.start();
aMQContainer.start();

Localmente todo funciona bien, pero cuando ejecuto las pruebas en Jenkins, que se encuentra en un entorno Linux (Raspberry Pi 4, Modelo B de 4 GB), obtengo el siguiente error:

Caused by: org.testcontainers.containers.ContainerLaunchException: Container startup failed
Caused by: org.rnorth.ducttape.RetryCountExceededException: Retry limit hit with exception
Caused by: org.testcontainers.containers.ContainerLaunchException: Could not create/start container
Caused by: org.testcontainers.containers.ContainerLaunchException: Timed out waiting for log  output   matching .*database system is ready to accept connections

Intenté agregar condiciones de espera o withStartupTimeoutSeconds(240), pero sin éxito.

¿Alguien con un problema similar?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en Jenkins, timeout, pruebas de integración, testcontainers y testcontainers-junit5, el mensaje de error indica que el contenedor no pudo iniciar y probablemente se deba a problemas de sincronización.

    Una forma de resolver este problema es aumentar la duración del tiempo de espera de inicio para permitir que el contenedor se ejecute el tiempo suficiente. En este caso, la condición “.withStartupTimeoutSeconds(240)” no fue efectiva. Por lo tanto, puede intentar probar la conectividad con el contenedor antes de intentar conectarlo.

    Puede lograr esto probando el contenedor con una implementación de PingableContainer, la cual intenta hacer un ping al contenedor antes de conectarse. De esta manera, cualquier problema subyacente que impida que el contenedor se inicie se resolverá antes de que se conecte.

    También puede intentar modificar el código para incluir lógica de reintento y dar al contenedor más tiempo para iniciar. Típicamente, el inicio del contenedor está vinculado a los recursos disponibles para él, como la cantidad de memoria y CPU asignada. Por lo tanto, mejorar la asignación de recursos en el servidor Jenkins podría ayudar a prevenir el error de tiempo de espera.

    Si los enfoques anteriores no logran resolver el problema, puede considerar configurar manualmente el entorno y ejecutar las pruebas de integración en el servidor Jenkins. De esta manera, puede solucionar cualquier problema que impida que los contenedores se inicien y encontrar una solución funcional.

Comments are closed.