重新配置并重新启动Hudson / Jenkins从站作为构建的一部分

我有一个Jenkins(Hudson)服务器设置,可以在各种从机上运行测试。我想要做的是重新配置从属设备(使用远程API),重新启动从属设备以使其更改生效,然后继续测试的其余部分。到目前为止我遇到了两个障碍: 一旦Jenkins作业开始在从属设备上运行,从属设备就不能断开或断开与服务器的网络连接,否则Jenkins会立即通过测试。通常,我会说这是完全可取的行为。但在这种情况下,我希望Jenkins接受中断,直到奴隶重新上线,Jenkins可以重新连接到它 - 或者奴隶重新连接到Jenkins。 在已连接到从属服务器的作业中,我需要在Jenkins主服务器上运行一些构建任务 - 而不是在从服务器上运行。 这可能吗?到目前为止,我还没有找到使用Jenkins或其任何插件的方法。 编辑 - 进一步解释 我真的非常喜欢詹金斯的奴隶建筑。结合已有的插件,它可以很容易地将作业送到从站,运行,并且结果被撤回。并且能够选择任何匹配的从站允许自动作业/测试分发。 在我们的情况下,我们使用虚拟化(VMware)从机。编写一个脚本可以很容易地使Jenkins在需要在从属设备上运行时使用VMware PowerCLI来启动VM,然后将作业发送给它并将结果拉回来。都好。 除了每个测试的部分设置是以某种方式稍微重新配置虚拟机。禁用UAC,以其他用户身份登录,安装不同的驱动程序等 - 每个更改都要求在更改生效之前重新启动测试VM /从服务器。虽然我可以编写从属按需脚本(启动方法=通过在主服务器上执行命令启动从服务器)来处理此重新配置并重新启动,但必须在作业运行之前完成。这就是问题发生的地方 - 我无法提前配置从站,因为配置更改的类型取决于正在运行的作业,这仅在从站启动后才会发生。 可能的解决方案 1)在单个VM上使用多个从属实例。这不起作用 - 几个配置是互斥的,但Jenkins不知道。因此,它会尝试为一个作业启动一个从站配置,为另一个作业启动另一个从站 - 并且两个从站都将在同一个VM上。锁定作业不会阻止这种情况,因为从属启动不是工作的一部分。 2)(Optimal)一个构建步骤,允许作业知道它的从属连接可能被中断。构建步骤可能必须包含一些选项,以便Jenkins知道如何重新连接从属设备(将自动重新连接,Jenkins是否必须运行脚本,简单的SSH就足够了)。构建步骤将处理从站的断开连接,忽略通常作业失败的断开连接,然后执行重新连接。从站恢复运行后,可以进行下一个构建步骤。如果从站在一定时间内无法重新连接,则可能是作业失败的超时。 **当前的解决方案** - 不是最佳的 现在,我不能使用Jenkins的奴隶功能。相反,我使用一系列构建步骤 - 在master上运行 - 使用Windows和PowerShell脚本启动VM,进行配置并重新启动它。 VM上运行了SSH服务器,我使用它将测试文件上传到测试VM,然后远程执行它们。然后将结果下载回Jenkins以便按作业处理。这个解决方案是功能性的 - 但比典型的Jenkins从属方法要多得多。此外,脚本针对单个VM;我不能轻易使用一群奴隶。     
已邀请:
很容易。您创建一个在Master上运行的Master作业,从作为构建步骤调用客户端作业的主作业开始(这是一种新的构建步骤,我喜欢它)。您需要检查主作业是否应该等待客户端作业完成。然后,您可以运行脚本来重新配置客户端并在客户端上运行第二个测试。 更好的策略是在从属计算机上运行两个节点。您需要在Jenkins中配置两个节点。我使用unix slave成功使用了该策略。原因是我需要设置不同的环境变量,我不想把它推到工作中。我使用ssh客户端,所以我不知道是否可以使用不同的客户端类型。您可能能够同时运行两个测试,或者链接作业或使用上面提到的主策略。     
不确定这是否适合您,但您可以尝试以编程方式使Jenkins代理节点告知主节点它处于脱机状态。 我有一种情况,我需要做一个执行这些步骤的Jenkins工作(所有在主节点上运行时): 将Jenkins代理节点VM还原为已关闭电源的快照 告诉主节点代理节点已断开连接(因为无论何时恢复或硬关闭我的虚拟机,主节点似乎都不会自动注意到代理已关闭) 重新启动代理节点VM 作为“构建后操作”,启动限制在代理节点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作业执行所有操作。而且我不确定如果代理节点在运行作业的过程中断开连接或标记为脱机,会发生什么。 :) 不过,您可能会在这个远程访问API文档中找一点,看看这种方法还有什么可能。     

要回复问题请先登录注册