我有一个 Jenkins (Hudson) 服务器设置,可以在各种从机上运行测试。我想要做的是重新配置从站(使用远程 API),重新启动从站以使他的更改生效,然后继续进行其余的测试。到目前为止,我遇到了两个障碍:
- 一旦 Jenkins 作业开始在 slave 上运行,slave 就不能关闭或断开与服务器的网络连接,否则 Jenkins 将立即失败测试。通常,我会说这是完全可取的行为。但在这种情况下,我希望 Jenkins 接受中断,直到从站重新联机并且 Jenkins 可以重新连接到它 - 或者从站重新连接到 Jenkins。
- 在已附加到从站的作业中,我需要在 Jenkins 主站上运行一些构建任务 - 而不是在从站上。
这可能吗?到目前为止,我还没有找到使用 Jenkins 或其任何插件的方法。
编辑 - 进一步解释 我真的非常喜欢 Jenkins 从架构。结合已经可用的插件,它可以很容易地将工作分配给从属设备,运行,然后返回结果。并且能够选择任何匹配的从属设备允许自动分配作业/测试。
在我们的情况下,我们使用虚拟化 (VMware) 从机。编写一个脚本很容易,它可以让 Jenkins 在需要在从属设备上运行时使用 VMware PowerCLI 启动虚拟机,然后将作业发送给它并拉回结果。都好。
除了每个测试的部分设置是以某种方式稍微重新配置虚拟机。禁用 UAC、以不同的用户身份登录、安装不同的驱动程序等 - 这些更改中的每一个都需要在更改生效之前重新启动测试 VM/从站。虽然我可以编写处理此重新配置和重新启动的从属按需脚本(启动方法 = 通过在主控上执行命令启动从属),但必须在作业运行之前完成。这就是问题发生的地方——我不能这么早配置从站,因为配置更改的类型取决于正在运行的作业,这仅在从站启动后才会发生。
可能的解决方案
1) 在单个 VM 上使用多个从属实例。这是行不通的——一些配置是互斥的,但詹金斯不知道。因此,它会尝试为一项作业启动一个从属配置,为一项不同的作业启动另一个从属配置——并且两个从属将位于同一个虚拟机上。锁定作业并不能阻止这种情况,因为从属启动不是作业的一部分。
2)(最佳)允许作业知道它的从属连接可能被中断的构建步骤。构建步骤可能必须包含一些选项,以便 Jenkins 知道如何重新连接从站(从站是否会自动重新连接,Jenkins 是否必须运行脚本,简单的 SSH 就足够了)。构建步骤将处理从属设备的断开连接,忽略通常作业失败的断开连接,然后执行重新连接。一旦从站重新启动并运行,就可以进行下一个构建步骤。如果从属设备在一定时间内无法重新连接,则可能会导致作业失败的超时。
** 当前解决方案 ** - 不是最优
的 现在,我不能使用 Jenkins 的从属功能。相反,我使用一系列构建步骤 - 在主服务器上运行 - 使用 Windows 和 PowerShell 脚本来启动 VM、进行配置并重新启动它。VM 上运行着一个 SSH 服务器,我使用它来将测试文件上传到测试 VM,然后远程执行它们。然后将结果下载回 Jenkins 以供作业处理。这个解决方案是功能性的——但比典型的 Jenkins 从属方法要多得多。此外,这些脚本针对的是单个 VM;我不能轻易使用奴隶池。