在Jenkins中,是否总是需要先构建库再构建应用程序?

6
我们正在进行两个构建,AB,其中A是一个依赖于库B的应用程序,两者均为Qt项目。 Jenkins每15分钟轮询SCM。有时我提交AB,但A的计时器结束之前B的计时器结束了。因此,应用程序会使用旧库进行构建,导致构建失败。现在我正在寻找一种方法告诉Jenkins,在A的构建开始之前必须先构建B。然而,只有在成功构建之后才能构建其他东西。 是否有简单的解决方案或者我们只是搞砸了构建过程?

你是如何管理A和B之间的依赖关系的?使用svn:externals、Maven、Ivy还是自定义工具? - Tom Howard
@tom 两个项目存在不同的 git 仓库中。 - atamanroman
那么当 A 进行构建时,它如何获取 B 库? - Tom Howard
目前有一个bash脚本,它将上一次成功构建的头文件和二进制文件复制到应用程序工作区。不过我更喜欢类似于Maven的C++解决方案。 - atamanroman
4个回答

3

2

在Jenkins中,涉及项目引用和混乱构建顺序的问题仍然存在一些未解决的问题。请参见此错误或此错误)的注释以了解可能的解决方法。


2
如果您将依赖管理切换到Apache Ivy,则可以在发布B的新版本时(使用Jenkins Ivy插件),假设A依赖于B的latest.integration(或类似)版本,就会触发A的构建。
这不会阻止A针对旧版本的B进行构建,但至少当B完成后,它将自动再次构建。
此外,请考虑设置post receive hooks触发Jenkins, 并将quiet period添加到A。然后,当您推送更改到A和B时,A和B都将立即触发,但是A将等待一段时间才能构建。当A的安静期到期时,可以使用“在上游项目正在构建时阻止构建”选项来强制其等待B完成。
最后,当您使用Ivy一段时间后,您可能会得出与许多人相同的结论:您不希望A依赖于B的latest.integration,而是一个特定的版本。这样可以实现确定性构建,并简化CI作业设置(仅在代码发生更改时构建A(包括它所依赖的B的版本)),但您需要自己在自己的时间内达到这个认识。

顺便说一下,尽管Ivy非常专注于Java,但我已经在非Java项目上非常成功地使用它;不要被吓到。


0
在作业A的配置中,选择高级选项,并选择当上游项目正在构建时阻止构建。然后使作业A依赖于作业B。

1
如果B正在构建,这将阻止A的构建,但它无法解决在B之前触发A的问题。 - Tom Howard
感谢您的澄清,@Tom。我想我假设定时器问题可以通过A的安静期来解决,以确保B被触发。 - Dave Bacher

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