Jenkins在Commit Hook上进行部分构建/模块化构建

时间:2012-06-19 20:49:14

标签: build continuous-integration hudson jenkins svn-hooks

工具的:
詹金斯诉。 1.470
Maven 2
颠覆

环境

假设我的构建有许多项目A-D。依赖图存在,如图所示。也就是说:B依赖于A中的类,C依赖于B中的类,D依赖于A中的类。我们创建jenkins构建,使得它们将构建依赖于它们作为构建后动作。

一个
| - > B - > ç
| - > d

每晚,我们触发Jenkins的完整版本(A版,触发器B(触发器C),触发器D)。通过告诉A每晚建造,其余的级联,这很容易做到。

问题

但是,在提交时,我们希望构建一次提交的项目。

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

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

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

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

  • 情况3 :在一次提交中提交B C和D. SVN钩子发现C依赖于B.钩子调用项目特定的链接来启动B和D的构建。

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

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

2 个答案:

答案 0 :(得分:1)

让jenkins等待构建直到c依赖的构建完成是一个想法。这是作业配置中的一个标志,以便做到这一点。但是你必须为每项工作做到这一点。 顺便说一下......还有一个标志要求jenkins等待构建,直到完成一个dependend作业。

答案 1 :(得分:0)

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

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

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