6

工具
詹金斯版。1.470
Maven 2
颠覆

环境

假设我的构建有许多项目 AD。如图所示,依赖关系图存在。也就是说:B 依赖于 A 中的类,C 依赖于 B 中的类,D 依赖于 A 中的类。我们创建 jenkins 构建,以便他们将依赖于它们的构建称为构建后操作。

A
|--> B --> C
|--> D

每天晚上,我们在 Jenkins 中触发一个完整的构建(A 构建,触发器 B(触发器 C),触发器 D)。这很容易通过告诉 A 每晚构建,其余的级联来完成。

问题

但是,在提交时,我们希望构建曾经提交过的项目。

  • 情况1:我们轮询存储库(或使用commit hooks,没有区别),发现有一个提交给B,然后B将构建,C将构建。 成功!

  • 情况 2:我们轮询存储库并发现 B 和 C 在一次提交中被提交,然后 Jenkins 将尝试构建 B(触发 C 的构建),并构建 C(第二次构建)。失败。走着瞧吧?C 构建了两次,占用了宝贵的构建时间。 保持快速构建!

有谁知道在每个提交的构建管道中只触发最高项目的方法?

我想一个解决方案是一个复杂的 SVN 钩子,它确定每个管道中的最高项目......

  • 情况 3:一次提交到 BC 和 D。SVN 钩子发现 C 依赖于 B。钩子调用特定于项目的链接来开始构建 B 和 D。

陷阱:非常复杂的 SVN 提交挂钩。必须维护 SVN 挂钩中的管道。

我觉得这是其他人遇到的问题。有没有 Jenkins 插件可以帮助解决这个问题?

4

2 回答 2

1

说 jenkins 等待构建直到 c 依赖的构建完成是一个想法。这是作业配置中的一个标志,用于执行此操作。但是您必须为每项工作执行此操作。顺便说一句......还有另一个标志要求詹金斯等待构建,直到依赖作业完成。

于 2012-07-27T12:12:52.117 回答
0

我也在寻找解决这个问题的有效方法。我已经看到了一些建议,但到目前为止,我们只能通过使用 Locks&Latches 插件对构建进行序列化来避免其中一个陷阱。它不会阻止一个项目从一次签入中多次构建,但它会确保项目在上游项目完成后按顺序重建。

在一般情况下,这实际上是一个复杂的问题,但我一直在考虑编写一个插件来解决这个问题。一个简单的解决方案是检查上游项目是否正在构建,如果是,则将自己从构建队列中删除。由于上游作业将在完成后启动您的构建,因此这是一种选择。

更好的选择是根据您的依赖图自动管理构建队列的插件。这可能很复杂,因为您需要确保在完成所有依赖项之前不会开始构建。从本质上讲,这意味着每次签入都会导致插件自动将所有下游构建添加到队列中,以便对其进行管理。可能有一种更聪明、更简单的方法可以通过现有的上游/下游触发器实现这一点,但我还不清楚如何实现它。已经有构建管道插件声称可以处理这种情况,但它们显然没有采取任何措施来防止下游构建可以通过与上游构建相同的签入来触发的竞争条件。

于 2012-11-28T23:32:39.873 回答