在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
),而且感觉像是黑客攻击。
关于如何正确解决我的问题,有什么想法吗?
经过数小时的阅读,我找到了一个不错的解决方案:
- 在Jenkins中安装下游Ext插件
- 设置项目:模型和gui
- 具有正确includeregion的源代码管理,例如,对于型号:
model/.*
- 禁用"轮询SCM">
- 具有正确includeregion的源代码管理,例如,对于型号:
- 创建詹金斯构建:master
- 设置此生成在任何提交时激发的includeRegions:例如
.*
或model/.* ,gui/.*
- 启用"轮询SCM">
- 添加生成后操作:"生成其他项目(扩展)">
- 要构建的项目:
model, gui
(正确的顺序很重要:上游、…、下游) - 勾选"仅在下游项目发生SCM更改时触发">
- 要构建的项目:
- 设置此生成在任何提交时激发的includeRegions:例如
- 可选:在Jenkins中安装依赖队列插件
解释:
- 由于缺少轮询,SCM更改不会触发项目生成
- 每次提交时都会触发主构建,无论提交了哪个项目
- 主构建除了按顺序分析下游构建之外,什么都不做。如果由于SCM更改而必须触发下游生成,则它将被排队,否则不会
- 可选队列由于依赖队列插件而简化