【问题标题】:How can I user docker image jenkins/jnlp-slave with Jenkins docker-swarm-plugin (pass agent name)如何使用 Jenkins docker-swarm-plugin 使用 docker image jenkins/jnlp-slave(传递代理名称)
【发布时间】:2026-01-11 04:50:02
【问题描述】:

我有一组三个节点(一个经理,两个工人)。在我的 swarm 中,我正在运行安装了 docker-swarm-plugin (https://github.com/jenkinsci/docker-swarm-plugin) 的 jenkins 服务。我想使用该插件在我的 swarm 中为每个 jenkins 作业创建一个构建代理容器。对于代理,我想使用 jenkins/jnlp-slave docker 映像 (https://hub.docker.com/r/jenkinsci/jnlp-slave/)。图像需要两个参数作为开始:

  1. 秘密(可以通过 JENKINS_SECRET 环境变量设置)
  2. 代理名称(可通过 JENKINS_AGENT_NAME 环境变量设置)

docker-swarm-plugin 创建三个环境变量:

  1. $DOCKER_SWARM_PLUGIN_JENKINS_AGENT_SECRET(我用这个来设置秘密)
  2. $DOCKER_SWARM_PLUGIN_JENKINS_AGENT_JAR_URL
  3. $DOCKER_SWARM_PLUGIN_JENKINS_AGENT_JNLP_URL(其中包含代理名称)

我通过 JENKINS_SECRET 环境变量(在 Jenkins 插件配置的 ENV 部分)将秘密传递给代理:

JENKINS_SECRET=$DOCKER_SWARM_PLUGIN_JENKINS_AGENT_SECRET

我尝试使用正则表达式(也在 Jenkins 插件配置的 ENV 部分)传递代理名称:

JENKINS_AGENT_NAME=`echo $DOCKER_SWARM_PLUGIN_JENKINS_AGENT_JNLP_URL | sed ...`

但是命令没有执行(我理解这是出于安全考虑,避免代码注入)。

我想达到什么目标: 我想在我的 docker swarm 上运行 jenkins,并且我希望 jenkins 在自己的构建代理容器中运行每个作业,该容器在作业完成后被删除。我希望构建代理容器遍布整个集群(jenkins docker-plugin 在运行 jenkins master 的节点上启动它们)。我知道 docker-swarm-plugin 应该做我想做的事。而且我认为 jenkins/jnlp-slave 图像可以用来构建我想要使用的代理容器。但我找不到如何让它们一起工作的解决方案。

谁能给我一些建议? 我是否应该使用另一个与插件配合得更好的图像?

【问题讨论】:

    标签: docker jenkins jenkins-plugins docker-swarm docker-swarm-mode


    【解决方案1】:

    我为此在 docker-swarm-plugin 上打开了问题 https://github.com/jenkinsci/docker-swarm-plugin/issues/37,现在使用 PR https://github.com/jenkinsci/docker-swarm-plugin/pull/39 添加了一个带有创建代理名称的新环境变量。这可以传递给 docker 镜像,一切正常!

    【讨论】:

      最近更新 更多