2013-02-23 50 views
0

詹金斯方案的细节:
======================
- 构建执行人数(无论是在主/从)在詹金斯:
- 上游作业:USJob和这个工作可以在任何构建执行人运行
- 下行工作:DSJob &该作业具有120秒一个静默期+它绑定在特定的bui上运行只有执行者。詹金斯上游 - 下游的工作 - 平静期


  • USJob有这样的构建步骤:回声“生日快乐詹姆斯” ,它需要5秒钟就可以完成这项工作
  • DSJob有这样的构建步骤:回声“詹姆斯·邦德死了” ,它需要5秒钟就可以完成这项工作

现在,让我们说,我们跑USJob(父母/上游作业)5倍,这将--->调用DSJob(儿童/下行作业)5次为好,那么,我什么想要的是:

  1. Jenkins应运行USJob 5次,因此在每次调用期间调用DSJob子作业。
  2. DSJob不会运行DSJob(只要它从USJob调用),DSJob就会处于空闲状态或在队列中等待“120秒”(即设置为安静期)。

  3. 现在,如果我们看到这种情况,UPJob将调用DSJob 5次,并且DSJob将排队等候,直到达到相当的时间。因此,一旦安静时期结束,詹金斯将开始DSJob。

我的问题: 什么我想看到的是什么样的设置/选项我DSJob(子作业)设置,以便DSJob只运行一次,并不在乎它是多少时调用。 换句话说:如果詹姆斯·邦德/有人死一次,他不能再死! ...... 拿到了吧!但有人可以祝他生日快乐N次在他的BDay。这个概念类似于在TFS(Team Foundation Server - 内部构建定义的TRIGGER部分)中以累积方式运行持续集成(CI)构建,即在源控制发生变化时立即运行构建BUT积累所有对源代码控制的更改,直到正在运行的CI构建完成,下一个CI构建将选择开发人员完成的所有其他源代码管理更改。

回答

1

我建议以下想法:根本不要链接美国和DS作业。美国的工作是否做到了,完成了。让DS作业检查一下是否要开始。

要实现这一点,请使用Script Trigger Plugin。我用它来解决类似的需求,它效果很好!您可以完全控制触发并使用写得很好的脚本,您可以应用任何您想要的逻辑,从而使您可以绝对控制触发和流动。

请注意 - 用于评估版本的脚本不必保存为外部文件。它也可以写入作业的配置中。 Groovy脚本也被支持。

希望这会有所帮助。

+1

我同意,因为这是一种选择,我最终会走这条路。感谢您分享Eldad。我们基本上不想通过在工作区中放置文件来使用,因为我们在任何机器上的任何可用的从机上运行作业,并且不希望在可供所有机器/从机访问的中央NAS上创建文件。另外,如果父子/上游工作完成了X状态,我不希望子/下游工作查找,然后运行它。 – 2013-02-28 16:42:27

+0

只需注意 - 脚本不必保存为外部文件。它也可以写入作业的配置中。Groovy脚本也被支持。 – 2013-03-01 05:49:51

1

我同意这是一种选择,我最终会这样。感谢您分享Eldad。我们基本上不想通过在工作区中放置文件来使用,因为我们在任何机器上的任何可用的从机上运行作业,并且不希望在可供所有机器/从机访问的中央NAS上创建文件。另外,如果父子/上游工作完成了X状态,我不希望子/下游工作查找,然后运行它。




我这样做的方式是在DSJob上将静默期设置为120秒+从USJob或DSJob的任何其他父级调用“DSJob”(可以选择传递/或不直接/通过属性文件传递参数) +发现它工作正常。当我安排了多个USJob时,USJob第一次被称为DSJob,它等待了120秒(或者你想要的X秒),然后一旦USJob第一个工作完成,第二个USJob开始并完成,并且它再次调用DSJob,但是这没有不会将新的DSJob放入队列中,尽管它碰到了剩余的X号。秒工作DSJob从X运行 - 无论花费多少时间,再回到X秒,这很好。我还使用了“Build Blocker插件”,但我只是用它来使我的观点在逻辑上清晰,因为事情就像我想使用DSJob上设置的“安静时段”概念一样工作。解决了!

1

如果我正确理解你,你不希望5次(快速)执行USJob后发生5次DSJob执行。您宁愿让DSJob执行一次,从末尾触发USJob?灵感来自quiet period功能如何适用于SCM?

如果是这样,那么我面临同样的问题。我所做的就是编写一个Groovy脚本,作为USJob中的最后一步执行。首先,它会得到所有下游作业的列表(这将简单地返回DSJob)。如果你不需要动态工作,你可以跳过这一步。如果这些作业中的任何一个排队,那么脚本会将它们从队列中移除。然后USJob会像平常一样触发DSJob(再次)。

最终的结果是,如果USJob在120s的时间范围内触发了多次,DSJob只会触发一次。只有USJob的最后一个触发器才会生效。

我是一个Groovy新手,所以我的脚本是我在网上发现的其他脚本的混乱组合。我知道有更好的方法可以做到这一点。如果这是您正在寻找的解决方案,我会发布(杂乱)脚本。