假设我有一个詹金斯作业“abc_job”,它根据某些条件调用另一个詹金斯作业“xyz_job”。
现在由于某些原因,这两个作业都应该在同一个 jenkins 从属服务器上运行,这会导致死锁情况,因为作业“abc_job”已经触发了“xyz_job”,而“xyz_job”正在等待“abc_job”释放 jenkins 从属服务器以使其开始工作。
您怎样克服这种情况?
答案1
据我所知,有三种方法可以解决这个问题,而且我过去也使用过。哪种方法最好取决于您的具体情况。
- 添加更多执行器插槽。您还可以使用执行器标签并将构建限制到某些标签,以确保下游作业始终有一个空闲的执行器插槽,但这很难做到正确。
- 不要等待下游作业完成。使用 运行构建
build(wait: false, job: ...)
。父作业将立即退出,而不是在等待下游时占用执行器槽。这会导致如果下游构建失败,父构建不会失败。 - 不要
build()
在node { }
块内调用。节点块外的代码在主节点上执行,不会占用执行器槽。但是我相信这只有在使用脚本管道而不是声明式管道时才有可能。