Jenkins Scenario详细信息:
========================
- Jenkins中构建执行程序的数量(在主/从上): 3
- UpStream作业: USJob ,此作业可以在任何构建执行程序上运行
- DownStream工作: DSJob &这项工作的安静时间为120 秒 + 它仅限于在特定的构建执行程序上运行。
现在,假设我们运行 USJob (父/ UpStream作业) 5次,这将是--->拨打 DSJob (子/ DownStream作业)5次,然后,我想要的是:
而不是运行DSJob(一旦从USJob调用它),DSJob将闲置或在队列中“120秒”(即它设置为静默期)。
现在,如果我们看到这种情况,UPJob将调用DSJob 5次,DSJob将在队列中停留,直到满足相当长的时间。因此,一旦安静期结束,詹金斯将启动DSJob。
我的问题: 我想看到的是我可以在DSJob(子作业)中设置什么设置/选项,这样DSJob只运行一次并且不关心它被调用了多少次。 换句话说 :如果詹姆斯邦德/某人已经 一次 ,他就不能再死了! ...... 得到它!但有人可以祝他在他的BDay上过N次生日快乐。
- 这个概念类似于在TFS(Team Foundation Server - 内部构建定义的TRIGGER部分)中以累积方式运行持续集成(CI)构建,即一旦源控制发生变化就运行构建但是会累积所有源代码控制的更改,直到正在运行的CI构建正在进行中,一旦完成,下一个CI构建将选择开发人员完成的所有其他源代码控制更改。
答案 0 :(得分:2)
我同意这是一个选择,我最终会这样做。感谢分享Eldad。我们基本上不想通过在Workspace中放置文件来使用,因为我们在任何机器上的任何可用从站上运行作业,并且不希望在所有机器/从站可访问的中央NAS上创建文件。此外,我不想让子/下游作业查找父/上游作业,如果它已完成X状态,然后运行它。
我这样做的方法是在USJob或DSJob的任何其他父级DSJob + Called“DSJob”上使用Quiet period设置为120秒(您可以选择直接/通过属性文件传递/不传递params)+发现它工作得很好。当我安排多个USJob时,第一次出现的USJob称为DSJob并且它等待了120秒(或者你想要的X秒),然后一旦USJob第一次完成工作,第二次USJob开始并完成它再次调用DSJob但这没有不要把新的DSJob放在队列中,尽管它只是撞到剩下的X号。作业DSJob从X运行的秒数 - 到目前为止花费的任何时间..再次回到X秒,这很好。我还使用了“Build Blocker插件”,但我只是用它来清楚地说明我的观点,因为事情就像我想要在DSJob上使用“安静时期”概念一样。解决!
答案 1 :(得分:2)
如果我理解正确,你不希望在5次(快速)执行USJob后执行5次DSJob。您是否希望DSJob从USJob的 last 触发器执行一次?灵感来自quiet period功能如何为SCM工作?
如果是这种情况,那么我面临同样的问题。我所做的是编写一个Groovy脚本,作为USJob的最后一步执行。首先,它获取所有下游作业的列表(在您的情况下只会返回DSJob)。如果您不需要动态工作,则可以跳过此步骤。如果这些作业中的任何一个排队,则脚本会将其从队列中删除。然后,USJob会正常触发DSJob(再次)。
最终结果是,如果USJob在120秒的时间范围内多次触发,DSJob将只触发一次。只有USJob的最后一次触发才会生效。
我是一个Groovy新手,所以我的脚本是我在网络上找到的其他脚本的混乱组合。我知道有更好的方法可以做到这一点。如果这是您正在寻找的解决方案,我会发布(杂乱的)脚本。
答案 2 :(得分:1)
我建议以下想法:根本不要链接美国和DS工作。让美国的工作完成它的事情并完成。让DS工作检查一下是否要开始。
要实现此功能,请使用Script Trigger Plugin。我用它来满足类似需求而且效果很好!您可以完全控制触发并使用编写良好的脚本,您可以应用任何您想要的逻辑,让您绝对控制触发和流动。
只需注意 - 用于评估构建的脚本不必保留为外部文件。它也可以写入作业的配置中。还支持Groovy脚本。
希望这有帮助。