Jenkins:SVN触发器没有首先正确地构建依赖关系



在Jenkins(1.550)中,我有两个maven项目,Model和GUI。GUI项目取决于模型:

<groupId>com.acme</groupId>
<artifactId>gui</artifactId>
<version>1.0.0</version>
...
<dependencies>
<dependency>
<groupId>com.acme</groupId>
<artifactId>model</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>

现在,对于每个项目,我都将Jenkins配置为定期检查SVN并触发构建,这很好。

问题

只有当一个项目中的文件被更改时,它才有效。然而,通常情况下,两个项目都会进行提交,所以假设将提交以下两个文件:

A /model/Car.java
A /gui/CarDialog.java

现在Jenkins将看到GUI项目中有一个更改,构建它,但由于缺少/model/Car.java(因为模型还没有构建)而失败。然后,一段时间后,一个内建模型被触发(由于模型中的SVN更改),它构建得很好。之后,gui将再次构建,这次成功了。

我认为这种设置很常见,所以我很确定我忽略了一些东西,但我在任何地方都找不到答案。

解决方法

不起作用的是在GUI上设置"在构建依赖项时阻止",因为在构建GUI时,模型构建可能还没有注意到SVN发生了变化,因此没有构建模型。

到目前为止,我只找到了解决方案,最好的解决方案如下:

配置模型以每4分钟检查一次SVN更新:

*/4 * * * *

配置GUI以每8分钟检查一次SVN更新:

*/8 * * * *

此外,阻止GUI构建60秒,如果正在构建依赖项,则阻止构建,并在依赖项完成构建后启动构建。

这样做的缺点是不鼓励使用*/4(应该使用H/4),而且感觉像是黑客攻击。

关于如何正确解决我的问题,有什么想法吗?

经过数小时的阅读,我找到了一个不错的解决方案:

  1. 在Jenkins中安装下游Ext插件
  2. 设置项目:模型和gui
    1. 具有正确includeregion的源代码管理,例如,对于型号:model/.*
    2. 禁用"轮询SCM">
  3. 创建詹金斯构建:master
    1. 设置此生成在任何提交时激发的includeRegions:例如.*model/.* ,gui/.*
    2. 启用"轮询SCM">
    3. 添加生成后操作:"生成其他项目(扩展)">
      • 要构建的项目:model, gui(正确的顺序很重要:上游、…、下游)
      • 勾选"仅在下游项目发生SCM更改时触发">
  4. 可选:在Jenkins中安装依赖队列插件

解释

  • 由于缺少轮询,SCM更改不会触发项目生成
  • 每次提交时都会触发主构建,无论提交了哪个项目
  • 主构建除了按顺序分析下游构建之外,什么都不做。如果由于SCM更改而必须触发下游生成,则它将被排队,否则不会
  • 可选队列由于依赖队列插件而简化

最新更新