简体   繁体   中英

Springboot cannot connect to postgresql using testcontainers on Jenkins CI/CD pipeline

I am using springboot which is internally use Hikari connection pool.

I am running my database integration test using testcontainers,And which is working completely fine on local machine.

But when I run same test on Jenkins CI/CD pipeline, it fail with errors.

Below are the details.

pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.5.RELEASE</version>
  </parent>
    <dependency>
      <groupId>org.testcontainers</groupId>
      <artifactId>testcontainers</artifactId>
      <version>1.16.1</version>
    </dependency>
    <dependency>
      <groupId>org.testcontainers</groupId>
      <artifactId>postgresql</artifactId>
      <version>1.16.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.testcontainers</groupId>
      <artifactId>junit-jupiter</artifactId>
      <version>1.16.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.testcontainers</groupId>
      <artifactId>rabbitmq</artifactId>
      <version>1.16.1</version>
      <scope>test</scope>
    </dependency>


   <dependency>
      <groupId>com.zaxxer</groupId>
      <artifactId>HikariCP</artifactId>
      <version>5.0.0</version>
    </dependency>

Test container initialization

import org.springframework.beans.factory.DisposableBean;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.testcontainers.containers.Network;
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.junit.jupiter.Container;

@TestConfiguration
@EnableJpaRepositories
public class TestDatabaseInitializer
    implements ApplicationContextInitializer<ConfigurableApplicationContext>, DisposableBean {

  Network network = Network.newNetwork();

  @Container
  public static PostgreSQLContainer postgreSQLContainer =
      new PostgreSQLContainer("postgres:10.11")
          .withDatabaseName("report")
          .withUsername("test-user")
          .withPassword("test-password");

  @Override
  public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
    postgreSQLContainer.start();
    TestPropertyValues.of(
        "spring.datasource.url=" + postgreSQLContainer.getJdbcUrl(),
        "spring.datasource.username=" + postgreSQLContainer.getUsername(),
        "spring.datasource.password=" + postgreSQLContainer.getPassword())
        .applyTo(configurableApplicationContext.getEnvironment());
  }

  @Override
  public void destroy() {
    if (postgreSQLContainer != null && postgreSQLContainer.isRunning()) {
      postgreSQLContainer.stop();
    }
  }
}

I am using flyway for database migration.

This code is working fine on local build. but when I run same on Jenkins it is giving an error.

I am running my jenkins on Kubernetes version v1.21.9, and containerId is containerd://1.4.12

Here is the stacktrace.

2022-02-27;14:59:22.885;main;DEBUG;c.z.hikari.HikariConfig;allowPoolSuspension.............false
2022-02-27;14:59:22.885;main;DEBUG;c.z.hikari.HikariConfig;autoCommit......................true
2022-02-27;14:59:22.885;main;DEBUG;c.z.hikari.HikariConfig;catalog.........................none
2022-02-27;14:59:22.885;main;DEBUG;c.z.hikari.HikariConfig;connectionInitSql...............none
2022-02-27;14:59:22.885;main;DEBUG;c.z.hikari.HikariConfig;connectionTestQuery.............none
2022-02-27;14:59:22.885;main;DEBUG;c.z.hikari.HikariConfig;connectionTimeout...............30000
2022-02-27;14:59:22.885;main;DEBUG;c.z.hikari.HikariConfig;dataSource......................none
2022-02-27;14:59:22.885;main;DEBUG;c.z.hikari.HikariConfig;dataSourceClassName.............none
2022-02-27;14:59:22.885;main;DEBUG;c.z.hikari.HikariConfig;dataSourceJNDI..................none
2022-02-27;14:59:22.886;main;DEBUG;c.z.hikari.HikariConfig;dataSourceProperties............{password=<masked>}
2022-02-27;14:59:22.886;main;DEBUG;c.z.hikari.HikariConfig;driverClassName................."org.postgresql.Driver"
2022-02-27;14:59:22.886;main;DEBUG;c.z.hikari.HikariConfig;exceptionOverrideClassName......none
2022-02-27;14:59:22.886;main;DEBUG;c.z.hikari.HikariConfig;healthCheckProperties...........{}
2022-02-27;14:59:22.886;main;DEBUG;c.z.hikari.HikariConfig;healthCheckRegistry.............none
2022-02-27;14:59:22.887;main;DEBUG;c.z.hikari.HikariConfig;idleTimeout.....................600000
2022-02-27;14:59:22.887;main;DEBUG;c.z.hikari.HikariConfig;initializationFailTimeout.......1
2022-02-27;14:59:22.887;main;DEBUG;c.z.hikari.HikariConfig;isolateInternalQueries..........false
2022-02-27;14:59:22.887;main;DEBUG;c.z.hikari.HikariConfig;jdbcUrl.........................jdbc:postgresql://localhost:49214/report?loggerLevel=OFF
2022-02-27;14:59:22.887;main;DEBUG;c.z.hikari.HikariConfig;keepaliveTime...................0
2022-02-27;14:59:22.887;main;DEBUG;c.z.hikari.HikariConfig;leakDetectionThreshold..........0
2022-02-27;14:59:22.887;main;DEBUG;c.z.hikari.HikariConfig;maxLifetime.....................1800000
2022-02-27;14:59:22.887;main;DEBUG;c.z.hikari.HikariConfig;maximumPoolSize.................10
2022-02-27;14:59:22.887;main;DEBUG;c.z.hikari.HikariConfig;metricRegistry..................none
2022-02-27;14:59:22.887;main;DEBUG;c.z.hikari.HikariConfig;metricsTrackerFactory...........none
2022-02-27;14:59:22.887;main;DEBUG;c.z.hikari.HikariConfig;minimumIdle.....................10
2022-02-27;14:59:22.888;main;DEBUG;c.z.hikari.HikariConfig;password........................<masked>
2022-02-27;14:59:22.888;main;DEBUG;c.z.hikari.HikariConfig;poolName........................"HikariPool-1"
2022-02-27;14:59:22.888;main;DEBUG;c.z.hikari.HikariConfig;readOnly........................false
2022-02-27;14:59:22.888;main;DEBUG;c.z.hikari.HikariConfig;registerMbeans..................false
2022-02-27;14:59:22.888;main;DEBUG;c.z.hikari.HikariConfig;scheduledExecutor...............none
2022-02-27;14:59:22.888;main;DEBUG;c.z.hikari.HikariConfig;schema..........................none
2022-02-27;14:59:22.888;main;DEBUG;c.z.hikari.HikariConfig;threadFactory...................internal
2022-02-27;14:59:22.888;main;DEBUG;c.z.hikari.HikariConfig;transactionIsolation............default
2022-02-27;14:59:22.888;main;DEBUG;c.z.hikari.HikariConfig;username........................"test-user"
2022-02-27;14:59:22.888;main;DEBUG;c.z.hikari.HikariConfig;validationTimeout...............5000
2022-02-27;14:59:22.888;main; INFO;c.z.h.HikariDataSource;HikariPool-1 - Starting...
2022-02-27;14:59:22.919;main;DEBUG;o.p.c.v.ConnectionFactoryImpl;Trying to establish a protocol version 3 connection to localhost:49214
2022-02-27;14:59:22.929;main;DEBUG;c.z.hikari.pool.PoolBase;HikariPool-1 - Failed to create/setup connection: Connection to localhost:49214 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
2022-02-27;14:59:22.932;main;DEBUG;c.z.h.pool.HikariPool;HikariPool-1 - Cannot acquire connection from data source
org.postgresql.util.PSQLException: Connection to localhost:49214 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:284)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
    at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:211)
    at org.postgresql.Driver.makeConnection(Driver.java:459)
    at org.postgresql.Driver.connect(Driver.java:261)
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)
    at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359)
    at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201)
    at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470)
    at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561)
    at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:100)
    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)
    at org.flywaydb.core.internal.jdbc.JdbcUtils.openConnection(JdbcUtils.java:56)
    at org.flywaydb.core.internal.jdbc.JdbcConnectionFactory.<init>(JdbcConnectionFactory.java:80)
    at org.flywaydb.core.Flyway.execute(Flyway.java:437)
    at org.flywaydb.core.Flyway.migrate(Flyway.java:147)
    at org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:65)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1855)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
    at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$634/0x0000000025a622e0.getObject(Unknown Source)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1108)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
    at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:126)
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99)
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)
    at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:123)
    at org.springframework.cloud.contract.wiremock.WireMockTestExecutionListener.applicationContextBroken(WireMockTestExecutionListener.java:123)
    at org.springframework.cloud.contract.wiremock.WireMockTestExecutionListener.beforeTestClass(WireMockTestExecutionListener.java:40)
    at org.springframework.test.context.TestContextManager.beforeTestClass(TestContextManager.java:213)
    at org.springframework.test.context.junit.jupiter.SpringExtension.beforeAll(SpringExtension.java:77)
    at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeBeforeAllCallbacks$7(ClassBasedTestDescriptor.java:355)
    at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor$$Lambda$261/0x0000000024edb680.execute(Unknown Source)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeBeforeAllCallbacks(ClassBasedTestDescriptor.java:355)
    at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.before(ClassBasedTestDescriptor.java:189)
    at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.before(ClassBasedTestDescriptor.java:77)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:132)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$216/0x0000000024ec7490.execute(Unknown Source)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$215/0x0000000024ec6ff0.invoke(Unknown Source)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$214/0x0000000024ec6320.execute(Unknown Source)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService$$Lambda$220/0x0000000024eb9900.accept(Unknown Source)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$216/0x0000000024ec7490.execute(Unknown Source)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$215/0x0000000024ec6ff0.invoke(Unknown Source)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$214/0x0000000024ec6320.execute(Unknown Source)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90)
    at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:142)
    at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:117)
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:383)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:344)
    at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:125)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:417)
Caused by: java.net.ConnectException: Connection refused (Connection refused)
    at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
    at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
    at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403)
    at java.base/java.net.Socket.connect(Socket.java:609)
    at org.postgresql.core.PGStream.<init>(PGStream.java:81)
    at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:92)
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:196)
    ... 85 common frames omitted

I have a suspicion that the issue is related to the fact that you have spring cloud contract in your class path. From your stacktrace:

org.springframework.cloud.contract.wiremock.WireMockTestExecutionListener.beforeTestClass

Try removing it to see the effect. Also check this conversation: https://github.com/testcontainers/testcontainers-java/issues/2290#issuecomment-633626250

Is the context loaded a 2nd time?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM