在Jenkins / Hudson中为一个提交强制执行一个构建

时间:2011-07-11 21:44:42

标签: hudson jenkins

我们使用Jenkins在每次提交SCM时对项目进行增量构建。我们希望为每个提交获得单独的构建。但是,在以下场景中,天真的方法(设置SCM并使用提交后挂钩来触发构建)会出现问题:

  • 触发构建。
  • 构建发生时(可能需要几分钟)两次单独提交SCM由两位开发人员完成。
  • 触发一个新构建。它接收来自上一次构建期间提交的两个提交的更改。

这种“竞争条件”使找到哪一个提交已经破坏了构建/引入的警告变得复杂。

目前使用的解决方案是检查一个作业的变化(“调度程序作业”)并触发另一个作业来进行实际的结帐和构建。

这个问题有没有合适的解决方案?

6 个答案:

答案 0 :(得分:7)

还没有,有一个功能请求涵盖了这种构建,但它仍然是开放的:Issue 673

答案 1 :(得分:2)

也许它错过了重点,但我们在这里运行了一个非常好的构建过程。

  • 我们使用git作为源控制系统
  • 我们使用gerrit作为审核工具
  • 我们使用gerrit触发器在我们的jenkins服务器上运行构建
  • 我们检查开发分支上的更改,以便在合并变更集时运行jenkins

简而言之,理想的开发者日就像这样

  1. 开发人员1根据我们的主要开发分支
  2. ,在新的分支机构中进行更改
  3. 开发人员1以他喜欢的方式提交
  4. 开发人员1认为他完成了他的工作,他将他的变化结合到一个变化中并将其推向了gerrit
  5. 创建了一个新的gerrit更改,jenkins尝试构建完全此更改
  6. 如果构建期间没有错误,则会对此更改进行审核
  7. 当提交审核时,变更集将合并到主存储库的开发分支中(未将更改合并到开发分支中,无需审核)
  8. Jenkins构建合并版本以确保没有合并错误
  9. 没有开发者2加入聚会并尝试做一些工作

    这个过程完全一样,无论是开始工作,还是分支机构。开发人员1更快,他的更改合并到开发分支。现在,在开发人员2发布他的更改之前,他必须在开发人员1所做的更改之后修改他的更改。

    因此,我们确信,构建过程是针对对代码库进行的每次更改而触发的。

    我们将此用于C#开发 - 在Windows上不在Linux上

答案 2 :(得分:1)

我认为可能有所帮助的是将安静时段(Jenkins>管理Jenkins>配置系统)设置为0并将SCM轮询设置为非常短的时间。但即使在那个短暂的间隔期间,也可能有两次提交。截至目前,Jenkins没有将构建拆分为多个SVN提交的单一构建的功能。

以下是有关该主题的教程:Quiet Period Feature

答案 3 :(得分:1)

我不相信你想做的事情是可能的。 Daniel Kutik提到的“安静时期”实际上用于告诉Hudson / Jenkins等待多长时间,以便允许其他提交同一个项目。含义 - 如果您将此值设置为60秒并且您已进行提交,则它将在开始新构建之前等待一分钟,从而允许其他提交的时间被提取(在该一分钟内)。 / p>

答案 4 :(得分:1)

如果您使用规则“NO COMMIT on a broken build‏”并将其视为合乎逻辑的结论,那么实际上您最终会得到“没有提交破坏的构建或正在构建的进度”,在这种情况下,您描述的问题是程。

让我解释一下。如果你有两个开发人员在同一个项目上工作,他们都尝试提交(或推送,如果你使用的是DVCS)。其中一个将成功,而另一个将失败,需要在提交之前更新。

必须执行更新的开发人员从提交历史中知道另一个提交是最近的,因此正在构建(即使它尚未检出)。他们不知道那个构建是否已经破坏了,所以唯一安全的选择就是等等看。

唯一阻止你使用上述方法的是如果构建需要很长时间,在这种情况下你可能会发现你的开发人员永远不会有机会提交(它总是在构建)。这是一个将您的构建拆分为多个步骤的驱动程序的驱动程序,因此Post Commit作业不会超过5分钟,但理想情况下为1分钟。

答案 5 :(得分:1)

正如Issue 673中的某个人所指出的,您可以尝试使用参数作为您要构建的实际git提交来启动参数化构建。这与VCS提交挂钩结合使用。