2

尝试在 Jenkins 中实现以下工作流程:触发器启动并行作业 A、B、C 和 D。一旦 A、B 和 C 完成作业 X 应该开始,对于作业 Y 也是如此,它应该在 C 和 D 之后开始.

工作流程草图:

          -> A -> 
 Trigger  -> B -> X -> Result 1
          -> C =>
          -> D -> Y -> Result 2

我从Build Flow Plugin开始,但我不知道如何在不启动 C 两次的情况下设计工作流程:

parallel (
  { 
     Xpre = parallel ([
        first:  { a = build("TGZ", subjob: "T1") },
        second: { b = build("TGZ", subjob: "T2") },
        third:  { c = build("TGZ", subjob: "T3") }
     ])

     build("TGZ", subjob: "X")
  },
  {
     Ypre = parallel ([
        third2:  { c2 = build("TGZ", subjob: "T3") },
        fourth:  { d = build("TGZ", subjob: "T4") }
     ])

     build("TGZ", subjob: "Y")
  }
)

关于如何在不运行 C 两次的情况下设计此工作流程的任何线索?

4

2 回答 2

1

构建流程在这里无济于事,因为您有两个作业(X 和 Y)正在等待 C 完成,因此不是“线性”(不确定这是不是适当的术语)依赖树,而是一个复杂的图。您正在寻找一个更复杂的异步模型,该模型(尚未)由构建流实现。也许可以稍后引入,但在这个开发阶段的优先级较低:

   parallel( [
        a:  { build("TGZ", subjob: "T1") },
        b: { build("TGZ", subjob: "T2") },
        c:  { build("TGZ", subjob: "T3") }
     ])
   .on( jobs[a].completed && jobs[b].completed && jobs[c].completed ) { build(x) } 
   .on( jobs[c].completed && jobs[d].completed ) { build(y) }
于 2013-03-09T15:12:55.147 回答
1

这在较新的Workflow 插件中是可能的,尽管仍然很尴尬:

def aDone = false def bDone = false def cDone = false def dDone = false parallel a: { runA() aDone = true }, b: { runb() bDone = true }, c: { runC() cDone = true }, d: { runD() dDone = true }, x: { waitUntil {aDone && bDone && cDone} runX() }, y: { waitUntil {cDone && dDone} runY() }

JENKINS-27127讨论了可能的增强功能。

于 2015-04-02T12:40:52.430 回答