获取Jenkins码头工人奴隶的映射端口作为管道参数

时间:2019-07-15 18:22:25

标签: jenkins jenkins-pipeline jenkins-docker

我们将不切换到新的jenkins(版本2.176.1),在此情况下,按需(使用docker插件)在docker云中启动奴隶。 如何在云中启动具有特定端口映射的代理,该端口映射不会与同一云中的其他容器发生冲突,但可以在管道脚本中进一步使用?

旧设置

我们当前的jenkins绝不使用docker,节点始终处于运行状态。 Web项目的常规构建过程使用Maven。在某个时候,该应用程序使用maven cargo插件启动。使用硒网格执行硒测试。正在运行的Web项目的外部端口在每个jenkins从站上配置。

目标

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

问题

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

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

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

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

docker inspect之类的东西与正在运行的从属一起使用失败,因为我们也不知道当前的容器ID。 更新见下文

因此,我们如何启动从属服务器,将一组已知的docker内部端口映射到主机上的一组端口,而又不与其他docker agent冲突,并且仍然知道在构建脚本中使用了哪些端口。 jenkins文件?

更新/解决方法

首先,可以使用环境变量DOCKER_CONTAINER_ID获取容器的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。

0 个答案:

没有答案