2

我们想切换到一个新的 Jenkins(版本 2.176.1),其中从站在 docker 云中按需启动(使用 docker 插件)。

如何在云中启动一个代理,具有特定的端口映射,不会与同一云中的其他容器发生冲突,但可以在管道脚本中进一步使用?

旧设置

我们当前的 jenkins 不以任何方式使用 docker,节点始终在运行。Web 项目的通常构建过程使用 maven。在某些时候,应用程序使用 maven cargo 插件启动。使用硒网格执行硒测试。正在运行的 Web 项目的外部端口在每个 jenkins 从站上配置。

目标

使用按需 docker 容器作为从站运行此设置,仍然使用外部工具。

问题

测试项目的基本构建工作,问题在于硒部分。

使用一个端口映射对一个容器有效,当然如果我们同时运行更多会发生冲突。

首先,我们尝试使用来自 docker 插件的全局 docker 代理模板中的端口范围。这允许启动多个容器,但是我们在管道脚本中没有找到实际使用的端口的参数,因此无法为测试设置它。

包括进一步的尝试agent{ docker{ image 'my_image' args '-p...'} }或来自此处的“sidecar”方法https://jenkins.io/doc/book/pipeline/docker/并在容器启动时设置端口,使用 EXECUTOR_NUMBER 参数使端口唯一。在这两种情况下,jenkins 都会尝试在代理容器中启动另一个容器。这为时已晚,因为代理容器的映射端口在创建容器后无法更改。和 n

使用类似 docker inspectfrom with a running slave 的方法失败了,因为我们也不知道当前的容器 ID。更新见下文

那么我们如何启动一个从属服务器,将一组已知的 docker 内部端口映射到主机上的一组端口,而不与其他 docker 代理发生冲突,并且仍然知道构建脚本中使用了哪些端口,也就是。詹金斯文件?

更新/解决方法

首先,可以使用环境变量获取容器的 ID DOCKER_CONTAINER_ID。另一种方法是当前节点的主机名,因为这也是容器 ID,可以在脚本中解析。

结果行如下所示:

HTTP_PORT = (sh(script: 'docker -H tcp://${BIDGE_IP}:4243 inspect --format=\'{{(index (index .NetworkSettings.Ports \"8080/tcp\") 0).HostPort}}\' `hostname` ', returnStdout: true)).trim()

该变量${BRIDGE_IP}在 jenkins 全局变量中定义,是运行 docker 引擎的主机的 docker 网络 ip。

4

0 回答 0