我们想切换到一个新的 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 inspect
from 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。