Gitlab 中的测试容器

ber*_*ert 5 gitlab spring-boot docker-in-docker testcontainers

我想在 Gitlab 中运行 Testontainers 来测试 Spring Boot 应用程序。创建 Gitlab 运行程序后(更改了 URL 和令牌):

sudo gitlab-runner register -n \
  --url https://gitlab.com/ \
  --registration-token REGISTRATION_TOKEN \
  --executor docker \
  --description "My Docker Runner" \
  --docker-image "docker:19.03.12" \
  --docker-privileged \
  --docker-volumes "/certs/client"
Run Code Online (Sandbox Code Playgroud)

我写了一个简单的 ci 管道:

stages:
  - test

services:
  - docker:19.03.12-dind

variables:
  DOCKER_HOST: tcp://docker:2376
  DOCKER_TLS_CERTDIR: "/certs"
    
test:
  stage: test
  image: amazoncorretto:11
  script:
    - java -version
    - chmod +x gradlew
    - ./gradlew test
  tags:
    - docker-dind
Run Code Online (Sandbox Code Playgroud)

测试看起来像:

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

@SpringBootTest
@Testcontainers
class DemoApplicationTests {
    
    @Container
    protected static GenericContainer<?> kc = new GenericContainer<>("jboss/keycloak")
            .withEnv("KEYCLOAK_USER", "admin")
            .withEnv("KEYCLOAK_PASSWORD", "admin")
            .withExposedPorts(8080)
            .waitingFor(Wait.forHttp("/auth").forStatusCode(200));

    @Test
    void contextLoads() {
    }
}
Run Code Online (Sandbox Code Playgroud)

它可以是其他东西而不是 Keycloak,但结果是相同的:

DemoApplicationTests > initializationError FAILED
    org.testcontainers.containers.ContainerLaunchException at GenericContainer.java:327
        Caused by: org.testcontainers.containers.ContainerFetchException at GenericContainer.java:1278
            Caused by: java.lang.IllegalStateException at DockerClientProviderStrategy.java:214s
Run Code Online (Sandbox Code Playgroud)

在我看来,构建容器 (amazoncorreto:11) 不是作为 docker 中的 docker 运行的。如果我检查 DockerClientProviderStrategy.java:214,我可以看到:

Could not find a valid Docker environment. Please see logs and check configuration
Run Code Online (Sandbox Code Playgroud)

Testontaniners 版本是 1.15.0。我做错了什么?我有使命吗?

Ant*_*ton 0

我将 Spring Boot 与 TestContainers 和 gitlab runner 一起使用。我在这里写的完整解决方案/sf/answers/5452202731/
但我的简短回答是你需要使用包含 maven 和 dind 的图像
例如:

maven-job:
  image: intension/docker-dind-maven:3.8.5-r0-openjdk17
  stage: build

  variables:
    DOCKER_TLS_CERTDIR: ""

  script:
    - mvn --version  # check that mvn is working
    - docker images  # check that docker is working
    - mvn $MAVEN_CLI_OPTS clean package
Run Code Online (Sandbox Code Playgroud)