【问题标题】:Always build library before application in Jenkins?在 Jenkins 中应用之前总是构建库?
【发布时间】:2011-11-29 05:27:11
【问题描述】:

我们有两个版本 AB,其中 A 是一个依赖于库 B 的应用程序>。两者都是 Qt 项目。 Jenkins 每 15 分钟轮询一次 SCM。有时会发生我提交 ABA 的计时器在 B 的计时器之前结束。因此,应用程序使用旧库构建,这会导致构建失败。现在我正在寻找一种方法来告诉 Jenkins,B 必须在 A 的构建开始之前构建。但是,只有在成功构建之后才可能构建。

是否有简单的解决方案,或者我们只是搞砸了构建过程?

【问题讨论】:

  • 您如何管理 A 和 B 之间的依赖关系? svn:externals、Maven、Ivy、定制?
  • @tom 两个项目都存在于不同的 git repos 中。
  • 那么A在构建的时候,如何得到B库呢?
  • 目前有一个 bash 脚本,它可以将上次成功构建的标头和二进制文件复制到应用程序工作区。不过,我更喜欢类似 maven 的 c++ 解决方案。

标签: continuous-integration jenkins


【解决方案1】:

Jenkins 中存在一些与项目引用和混乱的构建顺序相关的未解决的错误。请参阅this bug (or this one)。请参阅 cmets 了解可能的解决方法。

【讨论】:

    【解决方案2】:

    有一个参数化触发器插件,它可以启用“触发器/调用 在“添加构建步骤”菜单中构建其他项目。

    https://stackoverflow.com/q/5701697/366299

    【讨论】:

      【解决方案3】:

      如果您切换到 Apache Ivy 进行依赖管理,那么每当您发布 B 的新版本(使用 Jenkins Ivy Plugin)时,都可以触发 A,假设 A 依赖于 latest.integration(或类似) 版本的 B.

      这不会阻止 A 针对旧版本的 B 构建,但至少它会在 B 完成后自动重新构建。

      另外,考虑将post receive hooks 设置为trigger Jenkins,并将quiet period 添加到A。然后,当您将更改推送到A 和B 时,A 和B 都会立即触发,但A 会等待a建造前不久。当 A 的静默期到期时,可以使用 Block build when upstream project is building 选项强制它等待 B 完成。

      最后,当您使用 Ivy 一段时间后,您可能会得出与其他许多人相同的结论:您不希望 A 依赖于 B 的 latest.integration,而是一个特定的版本。它允许确定性构建并简化 CI 作业设置(仅在代码(包括它所依赖的 B 的版本)发生更改时构建 A),但您需要自己在自己的时间实现这一目标。

      顺便说一句,尽管 Ivy 非常专注于 Java,但我已经在非 Java 项目中非常成功地使用了它;不要被推迟。

      【讨论】:

        【解决方案4】:

        在作业A配置的高级选项下,选择上游项目正在构建时阻止构建。并让工作 A 依赖于工作 B。

        【讨论】:

        • 如果 B 正在构建,这将阻止 A 构建,但它不会解决 A 在 B 之前触发的问题。
        • 感谢@Tom 的澄清。我想我认为计时器问题可以通过 A 的安静期来解决,以确保 B 被触发。
        猜你喜欢
        • 1970-01-01
        • 2012-09-25
        • 2014-05-04
        • 2019-05-24
        • 2018-03-27
        • 2012-05-29
        • 2016-03-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多