Jenkins - 让代理等待其他代理完成
Posted
技术标签:
【中文标题】Jenkins - 让代理等待其他代理完成【英文标题】:Jenkins - make agents wait for other agent to finish 【发布时间】:2016-07-16 14:36:06 【问题描述】:我是 Jenkins 的新手,我正在尝试设置一个使用少量构建执行程序的项目。 流程如下:
两个带有webservice
标签的构建执行器返回它们的 IP 地址并等待第三个构建执行器完成其工作
带有tester
标签的第三个构建执行程序收集这些 IP 地址并执行一些长时间运行的工作(例如,将 HTTP 请求发送到部署在这两个代理上的 Web 服务)
如何在 Jenkins 中实现这样的行为?
我发现当构建执行器完成其工作时,它会立即释放,我不知道如何让它等待其他构建执行器完成其工作。
编辑:
我忘了提到,我希望保留带有 webservice
标签的构建执行器(不适用于其他作业),直到带有 tester
标签的构建执行器完成其长期运行的工作。
此外,所有这些构建执行程序都应该位于单独的从属服务器上。这意味着每个从站只有一个构建执行器。
【问题讨论】:
如果您使用 Jenkins 术语(作业/项目、从属)而不是设置使用“代理”的“构建”来重新表述这个问题,这个问题会更容易理解。 对不起。正如我所说,我是詹金斯的新手。当我说“代理”时,我的意思是构建执行器(我还不知道构建执行器和从属是否意味着相同的东西)。我猜“build”应该改为“project”。如果我错了,请纠正我。 谢谢,这更清楚了 :) 一个从属服务器可以拥有多个执行程序(将其想象为一台具有多个 CPU 的机器,用于同时运行任务)。 【参考方案1】:我终于设法使用Pipeline 和以下脚本做到了这一点:
node('webservice')
def firstHostname = getHostname()
node('webservice')
def secondHostname = getHostname()
node('tester')
println 'Running tests against ' + firstHostname + ' and ' + secondHostname
// ...
def getHostname()
sh 'hostname > output'
readFile('output').trim()
它获得了两个带有webservice
标签的构建执行器。我正在获取他们的主机名(我使用它们而不是 IP 地址)并将它们传递给带有 tester
标签的构建执行程序。最后,tester
运行了一些长时间运行的测试。
这两个 webservice
构建执行程序被阻止,直到 tester
完成其工作,并且在此期间没有其他项目可以使用它们。
【讨论】:
不错。因此,您正在使用嵌套管道node
子句来实现多种模式的同时分配——很高兴知道管道插件可以实现这样的事情:)
是的。这个插件非常有用。也许代码看起来不太漂亮(尤其是当webservice
节点的数量增加时),但它可以工作:)【参考方案2】:
正如 Alex O 所说,您可以在 Jenkins 项目 /executors 中配置项目 /executors 之间的主从关系。有一个选项,“构建触发器”->在构建其他项目后构建
或者使用插件来实现 https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin
或 https://wiki.jenkins-ci.org/display/JENKINS/Join+Plugin
【讨论】:
我已经阅读了关于 Join Plugin 的信息并尝试了它,但我发现我忘了提及一件重要的事情。我希望保留带有webservice
标签的这两个构建执行器(不适用于其他作业),直到tester
完成其工作。看起来 Join Plugin 只提供了一个选项来等待一些作业触发另一个,但构建执行程序很快回到“空闲”状态(就在他们的简单工作完成之后)。我已经更新了问题。【参考方案3】:
你真正想要的可能是你的工作同时使用三个奴隶。
以这种方式重新考虑设置,没有必要将 IP 的收集和从属设备的后续使用视为必须以某种方式对齐的三个不同步骤。
不幸的是,Jenkins 不支持使用多个从站进行开箱即用的构建,但可以实现您想要的,例如使用 Aaron 已经提到的 Multijob plugin 和 Join plugin。
有关如何同时使用两个从站的信息,另请参阅 this question。
【讨论】:
以上是关于Jenkins - 让代理等待其他代理完成的主要内容,如果未能解决你的问题,请参考以下文章
使用 Jenkins ECS 插件生成多个代理(等待下一个可用的执行程序)