我们将不切换到新的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。