使用Maven在gitlab中运行(Docker)测试容器

时间:2019-12-05 03:40:00

标签: maven docker continuous-integration gitlab continuous-delivery

我正在gitlab ci / cd管道中工作。该管道使用maven和docker执行其所有命令(不包括部署)。在这种情况下,我尝试运行集成测试(由maven启动),该测试使用测试容器(用于mysql数据库)。这些测试在本地运行时可以正常工作。但是,当我尝试从gitlab运行它们时遇到了问题。我相当确定我的问题是我无权访问docker(但是,在这种情况下,我需要我的映像同时具有docker和maven)。

这是gitlab文件的适用部分:

#This phase is only run when merging (to master) 
merge_tests:
 image: maven:latest
 stage: mvn_build_and_test
 #TODO can remove services if this does not work    without docker image as base image
  services:
  - docker:stable-dind
 #set variables for use later when running maven in script section
variables:
  MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"
  MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"  
script: 
  #ONLY RUN WHEN MERGE REQUEST IS TO MASTER BRANCH
  #if ["$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" == "master"]; then 
  #check docker is installed and running
  #- docker --version #this fails if uncommented
  - mvn $MAVEN_CLI_OPTS clean install -Pintegration-test-profile
  #; fi   
#only:
 #- merge_requests

这是gitlab上的错误堆栈跟踪:

 org.testcontainers.containers.ContainerLaunchException: Container startup failed
1958 Caused by: org.testcontainers.containers.ContainerFetchException: Can't get Docker image: RemoteDockerImage(imageNameFuture=java.util.concurrent.CompletableFuture@21baa903[Completed normally], imagePullPolicy=DefaultPullPolicy(), dockerClient=LazyDockerClient.INSTANCE)
1959 Caused by: java.lang.IllegalStateException: Could not find a valid Docker environment. Please see logs and check configuration

在任何人建议之前,该测试都在本地工作(并且已经在本地工作了很长时间)。这是示例输出的一部分:

[INFO] --- maven-failsafe-plugin:2.22.1:integration-test (integration-tests) @ reading-comprehension-api ---
[INFO] 
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.connor.retrieving.GetByIsbnIT
-----content ommitted for brevity----------------------------    
Tests run: 3, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 10.451 s - in com.connor.adding.AddAssessmentIT      
--content ommitted, but test containers start  
[INFO] --- maven-failsafe-plugin:2.22.1:verify (integration-tests) @ reading-comprehension-api ---
[INFO] 
[INFO] --- maven-cucumber-reporting:2.8.0:generate (addCucumberReport) @ reading-comprehension-api ---
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
[INFO] About to generate Cucumber report.
[INFO] 
[INFO] --- maven-cucumber-reporting:2.8.0:generate (getCucumberReport) @ reading-comprehension-api ---
[INFO] About to generate Cucumber report.
[INFO] 
[INFO] --- maven-cucumber-reporting:2.8.0:generate (updateCucumberReport) @ reading-comprehension-api ---
[INFO] About to generate Cucumber report.
[INFO] 
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ reading-comprehension-api ---
[INFO] Installing /home/connor/Desktop/code/reading-comprehension-api/target/reading-comprehension-api-0.0.1-SNAPSHOT.jar to /home/connor/.m2/repository/com/connor/reading-comprehension-api/0.0.1-SNAPSHOT/reading-comprehension-api-0.0.1-SNAPSHOT.jar
[INFO] Installing /home/connor/Desktop/code/reading-comprehension-api/pom.xml to /home/connor/.m2/repository/com/connor/reading-comprehension-api/0.0.1-SNAPSHOT/reading-comprehension-api-0.0.1-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  38.282 s
[INFO] Finished at: 2019-12-04T22:31:23-05:00

我该如何解决?我应该创建安装了maven和docker的自己的基础映像吗?我可以轻松地修改容器以在容器中使用apt get吗?欢迎提出任何建议,但我希望同时拥有docker和maven,因为它们在我的技术堆栈中并且可以工作-只是gitlab配置问题。 这是gitlab上的项目位置:https://gitlab.com/connorbutch/reading-comprehension-api

虽然我当然欢迎对项目其他部分的评论,但应该通过电子邮件将这些评论发送给我,以保持页面整洁(不要在此处放置它们)

2 个答案:

答案 0 :(得分:0)

对于任何想知道的人,您都可以通过在ci / cd文件中添加一些变量来解决此问题。我添加的是:  变量:     MAVEN_CLI_OPTS:“-s .m2 / settings.xml --batch-mode”     MAVEN_OPTS:“-Dmaven.repo.local = .m2 /存储库”
    #这些是为了尝试使测试容器工作而添加的-如果不行,则可以删除以下两个容器     DOCKER_HOST:“ tcp:// docker:2375”     DOCKER_DRIVER:“ overlay2”

答案 1 :(得分:0)

对于正在运行 kubernetes runners 的任何人,必须配置运行器的特权才能运行 dind 服务:

  runners:
  ## Run all containers with the privileged flag enabled
  ## This will allow the docker:stable-dind image to run if you need to run Docker
  ## commands. Please read the docs before turning this on:
  ## ref: https://docs.gitlab.com/runner/executors/kubernetes.html#using-docker-dind
  ##
  privileged: true

https://docs.gitlab.com/runner/install/kubernetes.html#running-privileged-containers-for-the-runners

来自 values.yaml 的示例

Example from values.yaml