2014-02-11 76 views
0

我有一个Jenkins作业,它在Jenkins之外启动了一个长时间运行的过程。这项工作本身由Gerrit触发。阻止已触发的Jenkins作业,直到* Jenkins完成*

如果在长时间运行过程中再次触发此作业,我需要确保作业保留在Jenkins队列中,直到完成所有过程。实际上,我希望确保这项工作永远不会与自己并行运作,而“工作”真的是詹金斯的工作以及外部长期运行的过程。

我找不到任何方法来实现这一点。外部资源调度程序插件似乎可以工作,但每次我们在我们的系统上配置它时,Jenkins都非常不稳定(拒绝页面加载数分钟,奴隶线程与NPE相遇)。我可以看到的其他所有内容(例如Exclusions插件)都依赖于Jenkins本身来控制整个工作。

我试过用节点标签篡改某些东西 - 让作业依赖于标签“can_run”,将该标签分配给主控,然后让该作业执行一个从主控中移除该标签的Groovy脚本。 (理论上,Jenkins的另一项工作是将标签添加回来,这将在长时间运行的过程结束时触发)。但是这并不奏效:如果Jenkins上有任何排队的工作实例,他们就会去即使标签已被删除,也立即开始。

我不知道还有什么要尝试!是否有其他任何比所需的节点标签丢失,这将导致詹金斯队列工作,如果它被触发,但不是开始它?

回答

0

我想长时间运行的过程被触发,你的工作立即返回,这使得它成为一个异步过程,对吧?我建议你在触发过程中处理长时间运行的过程检测和等待逻辑。每次触发作业之前,请检查长时间运行的进程是否正在运行,如果没有,则触发它。

其实我并不完全明白你想要做什么。基本上由于这个长期运行的过程,你不可能同时运行2个作业。如果这是真的,那么使它成为非平行工作。

相关问题