当前位置: 首页 > 知识库问答 >
问题:

Jenkins上游-下游作业-平静期

赏夕
2023-03-14

Jenkins场景详细信息:
======================
-Jenkins中构建执行器的数量(在主/从上):3
-UpStream作业:USJobs,此作业可以在任何构建执行器上运行
-DownStream作业:DSJobs


  • USJob在构建步骤中有这个:回声“生日快乐詹姆斯”,完成这项工作需要5秒钟
  • DSJob在构建步骤中有这个:回显“詹姆斯邦德死了”,完成这项工作

    需要5秒钟

现在,假设我们运行 USJob(父/上流作业)5 次,这将---

>

  • Jenkins 应该运行 USJob 5 次,因此在每次调用期间调用 DSJob 子作业。
  • DSJob 不会运行 DSJob(一旦从 USJob 调用它),而是将闲置或排队等待“120 秒”(即它被设置为安静期)。

    现在,如果我们看到这个场景,UPJobs将调用DSJobs 5次,DSJobs将排队等待,直到满足该时间段。因此,一旦安静期结束,Jenkins将启动DSJobs。

    我的问题:我想知道的是我可以在DSWork(儿童作业)中设置什么设置/选项,以便DSJobs只运行一次,而不管它被调用了多少次。换句话说:如果詹姆斯·邦德/某人死了一次,他就不能再死了!......明白了!但是有人可以在他的生日那天祝他生日快乐N次。

    -- 这个概念类似于在 TFS(Team Foundation Server - 在 Build Definition 的 TRIGGER 部分内)以累积方式运行持续集成 (CI) 构建,即在源代码管理发生更改后立即运行构建,但累积对源代码管理的所有更改,直到正在运行的 CI 构建进行,一旦完成, 下一个 CI 生成将选取开发人员完成的所有其他源代码管理更改。

  • 共有3个答案

    谯嘉木
    2023-03-14

    我建议以下想法:不要将美国和DS工作联系起来。让美国的工作做它的事情并完成。让 DS 作业检查一些东西,以决定是否要启动。

    要实现这一点,请使用脚本触发器插件。我用它来满足类似的需求,效果很好!你可以完全控制触发和使用一个写得很好的脚本,你可以应用任何你想要的逻辑,给你绝对的控制触发和流程。

    只是一个注意 - 用于评估构建的脚本不必保留为外部文件。它也可以写入作业的配置中。还支持 Groovy 脚本。

    希望这有帮助。

    章哲彦
    2023-03-14

    如果我理解正确,您不希望在5次(快速)执行USJob之后再执行5次DSJob。您更希望DSJob从USJob的最后一个触发器执行一次?受SCM的静默期功能的启发?

    如果是这样,那么我也面临同样的问题。我所做的是编写一个Groovy脚本,作为USJob中的最后一步执行。首先,它获取所有下游作业的列表(在您的情况下,这将简单地返回DSJob)。如果不需要动态工作,可以跳过此步骤。如果这些作业中的任何一个已排队,则脚本将它们从队列中删除。然后,USJob将正常地(再次)触发DSJob。

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

    我有点像一个时髦的新手,所以我的脚本是我在网络上找到的其他脚本的混乱组合。我知道有更好的方法来做到这一点。如果这是您正在寻找的解决方案,我将发布(凌乱的)脚本。

    微生烨然
    2023-03-14

    我同意,因为这是一种选择,我最终会走这条路。感谢分享Elda。我们基本上不想通过在工作区中放置文件来使用,因为我们在任何机器上的任何可用从机上运行作业,并且不想在所有机器/从机都可以访问的中央NAS上创建文件。此外,我不想让子/下游作业查找父/上游作业,如果它是否以X状态完成,然后运行它。我这样做的方法是在DSWork上使用设置为120秒的安静时间,该工作称为“DSJobs”,来自USJobs或DSWork的任何其他父级(您可以选择直接/通过属性文件传递/或不传递参数)发现它工作正常。当我安排多个USJobs时,第一次出现的USJobs称为DSJobs,它等待了120秒(或您想要的X秒),然后一旦USJobs第一个作业完成,第二个USJobs开始并完成,它再次调用DSJobs,但这并没有将一个新的DSJobs放入队列中,尽管它只是颠簸了剩余的X号。作业DSJobs从X运行的秒数——无论到目前为止花费了多少时间...再次回到X秒,这很好。我还使用了“Build Blocker插件”,但我只是用它来从逻辑上明确我的观点,因为事情就像我想要的那样使用DSJobs上设置的“安静期”概念。解决了!

     类似资料:
    • 问题内容: 该设置用于构建和部署到Adobe AEM。 主构建作业从git存储库中提取,构建和打包,运行测试,然后触发应使用上游作业中已构建软件包的下游作业。 问题是下游作业失败并显示以下消息: 在我看来,由下游作业触发的某种方式的CopyArtifacts插件正在寻找错误位置的工件。正确的位置是 但是然后,它抱怨 下游作业从另一个项目复制工件,然后该生成是“触发此作业的上游生成”或“从最新完成的

    • 问题内容: 我正在使用詹金斯。 詹金斯(Jenkins)有上游工作:A 詹金斯(Jenkins)有下游工作:B A的控制台日志输出为: B的控制台日志输出为: 我想要得到的是: 有什么办法,我可以在作业A的控制台日志中获取作业B的控制台输出,然后确定作业“ A”是否成功(使用日志解析/ grep表示故障/错误等关键字)。 问题答案: 不确定您要达到的目标,但是看起来有些人为。查看以下方法是否满足您

    • 问题内容: 我有2个工作(A和B)。作业A指向URL-A上的git存储库。作业B指向URL-B上的另一个git repo。 作业A完成并稳定后,它将触发作业B并传递在作业A的构建中使用的git commit哈希。 最简单的方法是什么? (作业B对应于从URL-B中检出的脚本,该脚本具有2个参数:git commit哈希和JAR工件,这些工件将包装在Docker映像中并推送到Docker中心) 问题

    • 问题内容: 我要完成的工作是从分支中签出代码,将其合并到分支,构建,运行测试,如果测试成功则推送到分支。 测试应在需要的单独工作中运行。 我当前的设置如下: Job 从中检出,将其合并并构建 作业会在“ 后期制作”步骤中 触发作业(需要预先创建) 如果成功,则在 发布构建操作中推送到分支 __ 我尝试使用 Copy Artifact Plugin, 但是问题在于,在 Post构建步骤中 触发时,我

    • 问题内容: 我正在尝试编写一个Jenkins作业(例如CopyJob),该作业将复制另一个作业(在此作业中使用Multijob插件),并且还将其所有下游作业复制到新作业中。想法是要有一个Multijob作为模板,以便可以将其复制到新的Multijobs中(例如,用于特定的分支或功能)。 看到: 当手动触发“ CopyJob”时,它将使用新的SubJobs创建一个新的MultiJob: 到目前为止,

    • 我对 jenkins (2.74) 在归档 maven 项目中的工件时究竟在做什么有点困惑。从日志中可以看出,jenkins 正在自动存档项目中的工件,而无需指定生成后操作。工件文件确实在