【问题标题】:Running maven integration tests with docker-maven-plugin in Jenkins在 Jenkins 中使用 docker-maven-plugin 运行 maven 集成测试
【发布时间】:2018-03-29 20:59:38
【问题描述】:

我有一个 maven 项目,它使用 io.fabric8 docker-maven-plugin 来启动数据库,作为我的集成测试的一部分。当我在本地运行集成测试时,它可以工作,但是在我的 Jenkins 服务器上运行时,我收到一条错误消息,提示没有 DOCKER_HOST 变量。

[ERROR] Failed to execute goal io.fabric8:docker-maven-plugin:0.20.1:start (prepare-itdatabase) on project myproject: Execution prepare-itdatabase of goal io.fabric8:docker-maven-plugin:0.20.1:start failed: No <dockerHost> given, no DOCKER_HOST environment variable, no read/writable '/var/run/docker.sock' or '//./pipe/docker_engine' and no external provider like Docker machine configured -> [Help 1]

值得一提的是,我的 Jenkins 实例本身是通过 docker 启动的,只需使用 docker run jenkins 之类的东西。

我尝试在启动 Jenkins 时将 DOCKER_HOST 变量设置为 tcp://192.168.59.103:2375,但这只是导致它在构建中超时。

【问题讨论】:

  • 已经有一些关于如何在 docker (dind) 中运行 docker 的示例。主要是您需要告诉您的 docker 容器从其主机使用 docker(没有尝试过,只是为了展示这个想法): docker run --rm --user root --name myjenkins -v /var/run/docker.sock :/var/run/docker.sock -p 8080:8080 -p 50000:50000 詹金斯
  • 我做到了,谢谢!然而,我现在的问题是我的测试(在 jenkins docker 中运行)无法连接到 127.0.0.1 上的 mysql docker。使用 --net="host" 运行 jenkins docker 并没有帮助。
  • 我认为如果需要运行多个容器以进行测试,最好使用 docker-compose,因为它可以让您按容器名称链接容器,而不会自己弄乱大多数网络
  • docker-compose 的问题在于它意味着我必须更改我的 maven 文件(如果可能的话?)。我想利用 docker-maven 插件来启动我的测试运行所需的依赖项。
  • 您使用的插件版本可能不包括该插件版本,但当前版本 (0.24.0) 对 compose 有一些支持:dmp.fabric8.io/#docker-compose - 如果您更喜欢在 xml 或 compose yaml 文件中配置设置 -两者都应该可以使用该插件。我只是发现撰写文件更具可读性,它是从插件 xml 配置中生成的。

标签: maven docker jenkins


【解决方案1】:

我的 Jenkins 实例本身是通过 docker 启动的,只需使用 docker run jenkins 之类的东西

我假设您直接在容器的 Jenkins 主服务器上运行构建(没有从服务器)。您的构建过程在容器内运行,该容器没有安装 Docker 二进制文件或套接字。

您必须在容器中安装 Docker 套接字并安装 Docker 二进制文件。 This blog post explains things in details,总之你能做的是:

使用 Docker 套接字启动您的 Jenkins 容器:

docker run -p 8080:8080 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --name jenkins \
  jenkins/jenkins:lts

并在容器内安装 Docker。所述博客文章提供了一个在容器内运行的方便脚本:

apt-get update && \
apt-get -y install apt-transport-https \
     ca-certificates \
     curl \
     gnupg2 \
     software-properties-common && \
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
   $(lsb_release -cs) \
   stable" && \
apt-get update && \
apt-get -y install docker-ce

您可以手动运行此脚本,也可以将其作为 Jenkins 构建的一部分。从现在开始,您应该能够在您的容器内(以及在您的构建中)运行 Docker 命令。

或者,您可以独立于您的 Master 配置 Jenkins Slave,并在此 Slave 上安装 Docker。

【讨论】:

  • 这已经是我正在做的事情了。问题是,当我运行我的测试(在 Jenkins docker 中执行的 java 程序)时,它无法连接到 mysql docker(由测试启动),因为 mysql docker 实际上没有在 Jenkins docker 中运行,但是作为 Jenkins 码头工人的兄弟姐妹。我的问题实际上是如何让它连接并在 Jenkins docker 中公开 mysql docker。
  • 我相信你最初的问题已经解决了;)(显然感谢@wemu),你现在可以从你的 Jenkins 容器中启动你的测试了。链接您的 Mysql 和 Jenkins 容器是一个不同的问题,请尝试查看 Docker 网络以链接两个容器。您应该通过描述情况来针对此特定问题发布另一个问题(否则可能会导致混淆,因为您的初始问题与给定答案无关)。欢迎在此处评论新问题链接,我很乐意为您提供帮助。
猜你喜欢
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
  • 2011-12-09
  • 2018-07-12
  • 2019-08-28
  • 1970-01-01
相关资源
最近更新 更多