【发布时间】:2017-09-30 03:06:51
【问题描述】:
我们有许多运行父作业和多个子作业的多作业。父级进行一些预处理,然后开始第一个子作业。 示例:
- 家长 - 签出 git repos 并准备代码
- 构建代码
- 单元测试
- 上传到 HockeyApp
由于父进程在子作业运行的整个过程中都在运行,因此该进程从一个执行器开始,然后在子作业启动时再启动一秒。放下它,然后在下一次开始时将其捡起。
我们有 4 个节点,每个节点上有 3 - 4 个执行器。我们也没有网络驱动器,因此子作业必须与父作业保持在同一个执行程序上,以避免在作业之间传递整个工作区。
问题是,如果一个作业正在运行并且有两个执行器,那么另一个会被启动,然后另一个,它们有可能最终都在同一个节点上,并且会发生如下情况:
节点 1
- 执行者 1 - Parent1
- 执行者 2 - Child1
- 执行者 3 - Parent2
- 执行者 4 - Parent3
现在 Parent2 和 Parent3 只是坐在那里等待一个免费的执行者。最终 Parent1 上的 Child 工作结束,然后 2 r 3 抓住执行者,所有人都在为它而战。
有没有办法告诉 Jenkins 只在一个至少有 2 个执行器空闲的节点上启动该父节点?我知道如果有人足够快地开始工作,我们仍然可能会遇到人为问题,但这会大大降低发生这种情况的机会。
【问题讨论】: