1

我正在尝试建立一个复杂的构建管道,依赖关系图如下所示。

      Prj-A
        |
      Prj-B
  /     |    \ 
Prj-C Prj-D Prj-E
 |      |     |
 |      |     |
 |      |     |
 --------------
        |
      Prj-F

管道从 Prj-A 开始,然后是 Prj-B。Prj-C DE 可以并行运行。当 Prj-C、D、E 都完成后,运行 Prj-F。

例如,其中一项要求是,由于 Prj-C 依赖于 Prj-A 和 Prj-B,如果仅更改 Prj-C 中的源代码,我只想运行 Prj-C 然后 Prj-G。这是为了避免构建其他作业以节省整个构建时间。

经过大量的谷歌搜索,我没有发现任何解决方案可用于此类情况。所以我想到的解决方案(我不尝试)是:

  1. 为每个项目创建一个触发器作业,仅检查该项目的源代码是否更改,因此我们将有 7 个触发器作业。
  2. 为管道创建依赖解析器作业。
  3. 当任何触发器作业检测到更改时,它会触发依赖关系解析器作业。依赖解析器作业会知道哪个项目被更改,并确定在此构建中可以跳过的项目,并设置相应的环境变量。例如,当更改 Prj-C 时,它设置 skip-proja=true,skip-projb=true,skip-projd=true,skip proj-e=true。之后,它会触发构建管道。
  4. 当每个项目运行时,它会根据依赖解析器作业设置的环境变量检查是否可以跳过。

希望我已经让自己理解了,请让我知道是否有针对此案例的其他解决方案或您对我的解决方案的评论。谢谢!

4

1 回答 1

1

您的解决方案似乎可行,但理想情况下,您希望 proj-f 仅使用从 B 的相同版本(构建计数器)传递的 C、D 和 E 的组合触发。

对于如此复杂的设置,最好使用像Go(我在那里工作)这样的工具,它是在考虑这些场景的基础上构建的。你有一个扇入场景,除非你有一个理解扇入的工具,否则它会产生虚假的构建。

http://support.thoughtworks.com/entries/22229668-Go-s-Dependency-Management

http://www.thoughtworks-studios.com/go-continuous-delivery/compare

于 2013-07-28T10:19:36.967 回答