如何让Jenkins在构建依赖项时触发依赖项目的构建。

16

关于如何设置Jenkins和Maven 3的问题,我有一个看似简单的问题。为了简单起见,我们假设有四个项目:

Model 没有任何依赖
Commons 依赖于 Model
Server 依赖于 Common 和 Model
Frontend 依赖于 Model

我的目标是,在 Model 成功构建后,触发所有依赖于 Model 的项目(即 Common、Server 和 Frontend)的新构建。

如果 Common 构建失败,则无需构建 Server。

在上述情况下,似乎我可以通过手动设置依赖于 Model 和 Commons 的项目来解决此问题,但是每个项目的 pom 文件中已经包含了这些信息(即 Server 和 Frontend),这使我得出结论/希望 Jenkins 可以自动通过解析 Jenkins 中定义的每个项目的 pom 来推断依赖关系树,并执行某种最佳构建顺序/依赖项处理,或者我必须像上面描述的那样设置 “当上游项目正在构建时阻止构建” 和 “在其他项目构建之后构建 [依赖项目列表]”吗?

我正在使用 Jenkins 版本 1.473 和 Maven 3。
我们的 Maven 项目 POM 文件没有使用 parent 或 module 标签。

/Benjamin

3个回答

8
假设您想坚持使用4个单独的构建,而不是一个多模块构建,那么做法是在这4个项目中的每个项目下勾选“构建触发器”下的复选框:

“每当SNAPSHOT依赖项被构建时构建”

然后您将Model进行提交,jenkins会根据SVN轮询启动该项目的构建,完成构建后,它会看到Common对Model有一个依赖关系,因此会触发对Common的构建,以查看它是否仍可与更新的Model一起构建。这种选项只适用于创建为Maven作业的jenkins作业,对于自由样式项目则不适用,即使它们运行调用Maven的脚本。

1
我没有看到这样的构建触发器。它需要一个插件吗? - not2savvy
1
请确保您已经创建了一个Maven任务而不是自由风格任务。它不需要额外的插件,因为Maven插件已经包含在基本安装中。 - dan carter
谢谢,但事实上我正在使用自由风格项目。不过你可能想把这个信息加入到你的回答中。 - not2savvy
2
你不会碰巧知道如何在 Jenkins 管道中启用它吗?(通过 Jenkinsfile) - Patrick Cornelissen
似乎需要先手动安装“maven integration”插件,因为在我的情况下该插件不是默认安装的。 - Eric

4

对于这种情况,最好的解决方案是创建一个多模块构建,其结果如下所示:

root (pom.xml)
  +--- model (pom.xml)
  +--- commons (pom.xml)
  +--- server (pom.xml)
  +--- frontend (pom.xml)

在每个模块中,例如commons模块,您需要定义对model模块的依赖关系等。Maven将自动完成构建顺序。

有了这样的项目,您可以简单地转到根目录并执行以下操作:

mvn clean package

您也可以使用以下方法:
mvn --pl --am server

这将自动构建服务器以及所有依赖的模块。


这难道不意味着每次都会构建所有模块吗? 我希望它只构建必要的部分,具体取决于哪个项目正在进行构建请求。 - Benjamin
2
在Jenkins中有一个名为“增量构建”的配置,它将仅构建已更改的内容。 - khmarbaise
这是否意味着所有项目都需要合并和/或存在于同一个仓库中?如果它们分布在不同的仓库中怎么办? - JonnyWizz
这不会起作用...只适用于单个存储库内的多模块构建(但我不确定这在Jenkins的最新版本中是否存在)。 (帖子已有7年历史!) - khmarbaise
很遗憾,这与Jenkins无关。 - Amadán

3

两种解决方案。

  1. 创建一个模块POM文件,位于其他项目上方,只声明构建顺序(model、commons、server和frontend)。然后将该项目安装到Jenkins中。

  2. 在每个作业中,有一个复选框可以激活“触发构建”的形式——>在项目之后构建。(选项的名称可能不是我所写的那样,因为我的Jenkins已配置为法语...)


将#1导致Common被构建时Server和Frontend也会被构建,因为它们依赖于Common,但是Model不会被构建,因为它的构建没有被触发(因为没有SCM更改)</br>#2是我试图描述我目前正在做的事情。这意味着我必须手动设置Model和所有其他非顶级项目的构建依赖项。我想知道是否有一种方法让Jenkins自己找出这个问题,而不需要我重新定义每个项目的每个pom中已经可以找到的内容。 - Benjamin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接