繁体   English   中英

Springboot 无法使用 Jenkins CI/CD 管道上的测试容器连接到 postgresql

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

我正在使用内部使用 Hikari 连接池的 springboot。

我正在使用 testcontainers 运行我的数据库集成测试,并且在本地机器上运行良好。

但是当我在 Jenkins CI/CD 管道上运行相同的测试时,它失败并出现错误。

以下是详细信息。

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>

测试容器初始化

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();
    }
  }
}

我正在使用 flyway 进行数据库迁移。

此代码在本地构建上运行良好。 但是当我在 Jenkins 上运行时,它给出了一个错误。

我在Kubernetes v1.21.9版本上运行我的 jenkins,containerId 是containerd://1.4.12

这是堆栈跟踪。

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

我怀疑这个问题与你在类路径中有 spring cloud contract 的事实有关。 从你的堆栈跟踪:

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

尝试删除它以查看效果。 还要检查此对话: https ://github.com/testcontainers/testcontainers-java/issues/2290#issuecomment-633626250

上下文是否第二次加载?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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