与Testtainers/LocalStack和Spring Boot的集成测试:为临时文件设置目录

kxkpmulp  于 2022-10-06  发布在  Spring
关注(0)|答案(1)|浏览(197)

我正在使用TestContainers(本地堆栈Module)[https://www.testcontainers.org/modules/localstack/])进行与Spring Boot的高级集成测试,用来自本地堆栈的客户端取代AmazonS3客户端。我已经大致设置了我的集成测试如下(仅相关部分):

// FurnitureDetailsControllerIT.kt

@Testcontainers
@SpringBootTest
@ExtendWith(SpringExtension::class)
@AutoConfigureMockMvc
@DirtiesContext
class FurnitureDetailsControllerIT {

  @Autowired
  private val amazonS3: AmazonS3? = null

  companion object {
    @Container
    var localStack: LocalStackContainer =
      LocalStackContainer(DockerImageName.parse("localstack/localstack:latest")).withServices(LocalStackContainer.Service.S3)

    @JvmStatic
    @DynamicPropertySource
    fun properties(registry: DynamicPropertyRegistry) {
      registry.add("cloud.aws.s3.endpoint") { localStack.getEndpointOverride(LocalStackContainer.Service.S3) }
      registry.add("cloud.aws.credentials.access-key") { localStack.accessKey }
      registry.add("cloud.aws.credentials.secret-key") { localStack.secretKey }
    }
  }
(...)
}

在本地运行集成测试时,一切运行正常(从我的IDE或使用Maven的命令行),这意味着我可以看到本地堆栈容器在日志中旋转:

13:54:16.360 [main] INFO 🐳 [remote-docker.artifactory.mycompany.com/localstack/localstack:0.13.0] - Container remote-docker.artifactory.mycompany.com/localstack/localstack:0.13.0 started in PT4.6099665S

但是,在Jenkins上运行时,构建会因为一条错误消息而失败。

2022-09-28 14:27:19.971  INFO 1185 --- [           main] ?.a.s.com/localstack/localstack:latest]  : Container remote-docker.artifactory.mycompany.com/localstack/localstack:latest is starting: ec383bda85f2636c3bef3f6b3938ac169636e4542244e3067b5184b6b03a6e35

2022-09-28 14:28:20.612 ERROR 1185 --- [           main] ?.a.s.com/localstack/localstack:latest]  : Could not start container

org.testcontainers.containers.ContainerLaunchException: Timed out waiting for log output matching '.*Ready.

我猜这与本地堆栈所需的临时目录有关。当在我的Windows机器上运行时,我必须在测试恢复之前手动点击“Share It”:

我想,由于在Jenkins上的测试失败(因为我不能在那里点击“共享它”),启动容器最终会超时,测试将失败。

我读到您可以使用TMPDIR环境变量配置目录,如https://docs.localstack.cloud/localstack/configuration/中所述。但不建议使用该变量。将临时目录设置为Jenkins工作目录而不必明确同意共享该目录的最佳方法是什么?

注意:我已经成功地使用了TestContainers的MongoBD module,它启动了一个停靠的MongoDB示例。这可以完美地工作,所以我不确定这是Testtainers的问题还是LocalStack的问题。

d5vmydt9

d5vmydt91#

事实证明,这毕竟是公司委托书的问题。出于某种原因,LocalStack需要在运行时下载依赖项:

来自https://docs.localstack.cloud/localstack/configuration/
OUTBOUND_HTTP_PROXY:用于下载运行时依赖项和LocalStack外部连接的HTTP代理

由于我们的Jenkins位于公司代理之后,我必须设置以下环境变量:SKIP_SSL_CERT_DOWNLOADOUTBOUND_HTTP_PROXYOUTBOUND_HTTPS_PROXY。最重要的是,我必须将版本硬编码为1.1.0,而不是使用latest标记。

因此,我的代码现在如下所示:

LocalStackContainer(DockerImageName.parse("localstack/localstack:1.1.0"))
      .withServices(LocalStackContainer.Service.S3)
      .withEnv("SKIP_SSL_CERT_DOWNLOAD", "true")
      .withEnv("OUTBOUND_HTTP_PROXY", "http://{proxy}:{port}")
      .withEnv("OUTBOUND_HTTPS_PROXY", "http://{proxy}:{port}")
      .apply { start() }

相关问题