Jenkins 代理不遵守 hudson.TcpSlaveAgentListener.hostName

Jenkins 代理不遵守 hudson.TcpSlaveAgentListener.hostName

背景/环境:

Ubuntu 20.04 上的 Jenkins 2.3x

我正在尝试使用安装在与 Jenkins 服务器相同的系统上的 Jenkins Agent。理想情况下,它在与 Jenkins 控制器通信时只会连接到“localhost”。

Jenkins 位于需要 2FA 身份验证的反向代理后面(使用官方插件)。

如果一个原因对我来说,使用这个本地代理是必要的,因为有一个独立的代理是一个解决方法这个错误


执行:

由于代理无法使用设置中配置的主 Jenkins URL(因为这是具有 2FA 的代理 URL),因此 Jenkins 提供了-Dhudson.TcpSlaveAgentListener.hostName覆盖主服务器主机名设置的设置。这已记录在案这里

我已经设置了该值,并且可以在查询设置时确认我的“自定义”名称已设置:

println(System.getProperty("hudson.TcpSlaveAgentListener.hostName") )

返回:

http://localhost:8080

这是 Jenkins 的本地监听器,也是我期望的值。我可以curlwget主机毫无问题地获取此地址。


问题

启动代理时:

java -jar /data/jenkins_home/agent.jar \
  -workDir "/data/jenkins_home/agent_workspace" \
  -failIfWorkDirIsMissing \
  -jnlpUrl http://localhost:8080/computer/local/jenkins-agent.jnlp

它尝试(但失败了)连接到主要 Jenkins URL,忽略hudson.TcpSlaveAgentListener.hostName设置

java.io.IOException: Failed to connect to <<MY_ACTUAL_JENKINS_URL>>

所以就是忽略价值hudson.TcpSlaveAgentListener.hostName这似乎是主要问题。我怎样才能让它不使用主 URL 值,而是使用我提供的 URL?

  • 当主 Jenkins URL 直接设置为主机而不是代理时,一切都正常。但是我无法让代理通过代理进行连接,因为它涉及 2FA 并且供人类使用。我使用直接主机名针对 Jenkins 编写了几个脚本,没有出现问题,这是我第一次遇到问题。
  • 不使用 JNLP 是一种选择,但是它没有很好的文档记录,而且我似乎也无法让它运行。文档还指出它需要一个秘密,并且此本地代理旨在匿名连接。
  • 我尝试过启用和禁用代理配置设置Use WebSocket。都不起作用。
  • 如果我可以告诉代理使用不同的 URL,整个问题就解决了。

让代理连接到本地监听器似乎是一件简单的事情,但显然我误判了复杂性。我愿意配置一切需要的东西来实现这一点,所以请大声说出你的想法!

答案1

我想我找到了一种方法。我在 jenkins 服务器上预先注册了代理。这会在 /var/lib/jenkins/nodes/ 中生成代理名称/config.xml 文件中的 config.xml 可以指定与服务器通信的隧道。下面的配置中是内部 dns(绕过我的代理)。还请注意,它使用 Tcp 端口进行代理连接。

<?xml version='1.1' encoding='UTF-8'?>
<slave>
  <name>ubuntu-1</name>
  <description>build node at ubuntu-1 (ip-192-168-xx-yy)</description>
  <remoteFS>/jenkins_workdir</remoteFS>
  <numExecutors>6</numExecutors>
  <mode>NORMAL</mode>
  <retentionStrategy class="hudson.slaves.RetentionStrategy$Always"/>
  <launcher class="hudson.slaves.JNLPLauncher">
    <tunnel>jenkins-1.cicd-preprod-internal.com:8081</tunnel>
    <workDirSettings>
      <disabled>false</disabled>
       <internalDir>remoting</internalDir>
       <failIfWorkDirIsMissing>false</failIfWorkDirIsMissing>
    </workDirSettings>
    <webSocket>false</webSocket>
  </launcher>
  <label>Ubuntu x86_64 jammy android ubuntu</label>
  <nodeProperties/>
</slave>

它是隧道服务器上的部分,然后通过 jnlp 传递给客户端

这也让我困惑了很长一段时间

相关内容