【问题标题】:Reconfigure and reboot a Hudson/Jenkins slave as part of a build作为构建的一部分,重新​​配置并重新启动 Hudson/Jenkins 从站
【发布时间】:2011-07-29 10:36:54
【问题描述】:

我有一个 Jenkins (Hudson) 服务器设置,可以在各种从属机器上运行测试。我想要做的是重新配置从站(使用远程 API),重新启动从站以使他的更改生效,然后继续进行其余的测试。到目前为止,我遇到了两个障碍:

  1. 一旦 Jenkins 作业开始在 slave 上运行,slave 就不能关闭或断开与服务器的网络连接,否则 Jenkins 会立即失败测试。通常,我会说这是完全可取的行为。但在这种情况下,我希望 Jenkins 接受中断,直到从站重新联机并且 Jenkins 可以重新连接到它 - 或者从站重新连接到 Jenkins。
  2. 在已附加到从站的作业中,我需要在 Jenkins 主站上运行一些构建任务,而不是在从站上。

这可能吗?到目前为止,我还没有找到使用 Jenkins 或其任何插件的方法。

编辑 - 进一步解释 我非常非常喜欢 Jenkins 从属架构。结合已经可用的插件,它可以很容易地将工作分配给从属设备,运行,然后返回结果。并且能够选择任何匹配的从属设备允许自动分配作业/测试。

在我们的情况下,我们使用虚拟化 (VMware) 从机。编写一个脚本非常简单,它可以让 Jenkins 在需要在从属设备上运行时使用 VMware PowerCLI 启动虚拟机,然后将作业发送给它并拉回结果。都好。

除了每个测试的部分设置是以某种方式稍微重新配置虚拟机。禁用 UAC、以其他用户身份登录、安装不同的驱动程序等 - 这些更改中的每一项都需要在更改生效之前重新启动测试 VM/从属设备。虽然我可以编写处理此重新配置和重新启动的从属按需脚本(启动方法=通过在主控上执行命令启动从属),但必须在作业运行之前完成。这就是问题发生的地方——我不能这么早配置从站,因为配置更改的类型取决于正在运行的作业,这仅在从站启动后发生。

可能的解决方案
1) 在单个 VM 上使用多个从属实例。这是行不通的——一些配置是互斥的,但詹金斯不知道。因此,它会尝试为一项作业启动一个从属配置,为一项不同的作业启动另一个从属配置——并且两个从属将位于同一个 VM 上。锁定作业并不能阻止这种情况,因为从属启动不是作业的一部分。

2) (最佳)允许作业知道其从属连接可能被中断的构建步骤。构建步骤可能必须包含一些选项,以便 Jenkins 知道如何重新连接从站(从站是否会自动重新连接,Jenkins 是否必须运行脚本,简单的 SSH 就足够了)。构建步骤将处理从属设备的断开连接,忽略通常作业失败的断开连接,然后执行重新连接。一旦从站重新启动并运行,就可以进行下一个构建步骤。如果从属设备在一定时间内无法重新连接,则可能会导致作业失败。

** 当前解决方案 ** - 不是最优的
现在,我无法使用 Jenkins 的 slave 功能。相反,我使用一系列构建步骤 - 在主服务器上运行 - 使用 Windows 和 PowerShell 脚本来启动 VM、进行配置并重新启动它。 VM 上运行着一个 SSH 服务器,我使用它将测试文件上传到测试 VM,然后远程执行它们。然后将结果下载回 Jenkins 以供作业处理。这个解决方案是功能性的——但比典型的 Jenkins 从属方法要多得多。此外,这些脚本针对的是单个 VM;我不能轻易使用奴隶池。

【问题讨论】:

  • 如果您向我们提供了有关您要完成的工作的更多详细信息。我会更有能力提供帮助。
  • 我很好奇是否也有解决方案。我们想运行一些测试来暂时关闭所有的网络连接。但是,这会杀死 Jenkins slave,因此 master 认为连接已丢失。
  • 更新了原始问题,提供了更多细节 - 关于可能解决方案的想法 - 以及当前不太理想的解决方案。

标签: hudson jenkins reboot slave


【解决方案1】:

不确定这是否适合您,但您可以尝试让 Jenkins 代理节点以编程方式告诉主节点它已离线。

我有一种情况,我需要制作一个执行这些步骤的 Jenkins 作业(所有这些都在主节点上运行):

  • 将 Jenkins 代理节点虚拟机恢复为关闭的快照
  • 告诉主节点代理节点已断开连接(因为主节点似乎不会自动注意到代理已关闭,每当我恢复或硬关闭我的虚拟机时)
  • 重新开启代理节点虚拟机
  • 作为“构建后操作”,启动限制为在代理节点 VM 上运行的单独作业

我使用 curl POST 请求执行代理断开连接步骤,但可能有更简洁的方法:

curl -d "offlineMessage=&json=%7B%22offlineMessage%22%3A+%22%22%7D&Submit=Yes" http://JENKINS_HOST/computer/THE_NODE_TO_DISCONNECT/doDisconnect

然后,当我启动代理节点时,代理启动并自动连接,并且主节点注意到代理重新联机(然后将向其发送作业)。

我还可以使用此命令打开和关闭节点的可用性(使用“toggleOffline”而不是“doDisconnect”):

curl -d "offlineMessage=back_in_a_moment&json=%7B%22offlineMessage%22%3A+%22back_in_a_moment%22%7D&Submit=Mark+this+node+temporarily+offline" http://JENKINS_HOST/computer/NODE_TO_DISCONNECT/toggleOffline

(再次运行相同的命令会使节点状态恢复正常。)

上述内容可能不适用于您,因为听起来您想通过在代理节点上运行的一个 jenkins 作业来完成所有工作。而且我不确定如果代理节点在运行作业的过程中断开连接或将自己标记为脱机会发生什么。 :)

不过,您可能会在 Remote Access API doc 中闲逛一下,看看这种方法还有什么可能。

【讨论】:

  • 这是个好主意。就像你提到的那样,我仍然需要在一份工作中完成这一切。当从站在作业期间断开连接时,作业会立即因失败而终止。因此,即使您发现了这些很酷的功能,我仍然被立即终止原因失败所困扰。
  • 仔细考虑之后,听起来我们在同一条船上 - 对于我描述的场景(在干净的 VMware 快照上开始工作),我目前必须至少有两个工作:A启动/设置作业在执行快照整理的主机上运行,​​第二个作业链接到第一个实际在从属上启动进程的作业。看看是否有可能编写一个插件来实现你提到的“暂停”构建步骤会很有趣……不过,我还没有研究过类似的东西。
【解决方案2】:

很容易。您创建一个在 Master 上运行的 Master 作业,从您将客户端作业称为构建步骤的主作业(这是一种新的构建步骤,我喜欢它)。您需要检查主作业是否应该等待客户端作业完成。然后你可以运行你的脚本来重新配置你的客户端并在客户端上运行第二个测试。

更好的策略是让两个节点在您的从机上运行。您需要在 Jenkins 中配置两个节点。我在一个 unix slave 上成功地使用了这个策略。原因是我需要设置不同的环境变量,而我不想将它推到工作中。我使用了 ssh 客户端,所以我不知道是否可以使用不同的客户端类型。比您可能能够同时运行两个测试,或者您链接作业或使用上面提到的主策略。

【讨论】:

  • 您是在谈论名为“触发/调用在另一个项目上构建”的构建操作吗?如果是这样,那是参数化触发器插件的新功能,而不是 Jenkins 本身的新功能。我得看看这个,看看这个功能是否会有所作为。
  • 我猜你是对的。不记得它是从哪里来的(我同时更新了很多插件和服务器)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 2011-04-15
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多