背景/环境:
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 的本地监听器,也是我期望的值。我可以curl
从wget
主机毫无问题地获取此地址。
问题
启动代理时:
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 传递给客户端
这也让我困惑了很长一段时间