是否有任何 CI 服务器(CruiseControl、Jenkins、Hudson、...)支持项目之间正确的 DAG(直接非循环图)依赖关系?那是:
假设您有一个公共库项目 A、两个实用程序库项目 B 和 C,它们都使用 A,但彼此独立,以及一个程序项目 D,它同时使用 B 和 C。在 CruiseControl.rb(我目前正在使用),指定 B 依赖于 A、C 依赖于 A、D 依赖于 B 和 C 是很简单的。
如果有人提交到 B 或 C,则 CC.rb 将构建它,然后按预期构建 D。但是如果有人提交到 A,CC.rb 将构建 A,然后并行构建 B 和 C - 到目前为止,一切都很好。但是,假设 B 先完成构建;此时,CC.rb 将急切地开始构建 D,这很可能会失败,并且无论如何都是浪费时间,因为当 C 完成构建时,CC.rb 将去构建 D 第二次(这是构建我们实际上想要)。
我了解此行为并非特定于 CC.rb;如果 CI 服务器一次只考虑一个项目的依赖关系,这似乎是固有的。我正在寻找的是一个足够聪明的 CI 服务器,它可以确定 D 依赖于 B 和 C,并推迟构建它,直到两者都使用相同版本的 A 完成构建。或者,换句话说,一个 CI 服务器如果每个项目都是一个单独的 make 动作,它的工作原理类似于“make -j”会做的事情。
有这样的野兽吗?