在并行块中编排任务 运行

Orchestration of tasks ran in parallel blocks

)

我遇到了一个问题,希望你能帮帮我 :-)

问题

我正在尝试编写如下所示的管道:

parallel(
    "task A": { build some stuff and run verifications},
    "task B": { build more stuff. Wait for task A to be finished. Run tests.},
    "task C": { build some more stuff. Wait for task A to be finished. Run tests.}
)

我的问题是我找不到等待任务 A 完成的方法。

我尝试过的事情

存储构建结果

在"task A",我会运行这样的工作:job_a = build job: "Job_A" 然后在任务 B 和 C 中,我将使用 "job_a" 的属性。 不幸的是,这不起作用,因为我收到错误消息,因为 job_a 未定义(在任务 B 和 C 的范围内)。使用 "parallel" 时可能会发生分叉。 我还尝试在并行块之前定义 "job_a" 并仍然在 "task A" 中将作业分配给它,但这在任务 B 和任务 C 中都不起作用,job_a 只会有值这是第一个定义的。

在并行块外安排任务A

我也试过直接在并行块之前安排作业。 我会得到一个工作对象,然后直接 运行 job.scheduleBuild2。 这里又没有成功。

知道怎么做吗?

我想以这种方式设置管道的主要原因是:

  1. 所有这些工作 运行 在奴隶身上(很可能不同)。
  2. 如果任务 A 完成,任务 B 的构建也完成,测试应该开始。即使任务 C 的构建还没有完成。
  3. 如果任务 C 在任务 B 之前完成,则相同。

如果您知道如何实现这个,我将不胜感激:-) 更一般地说,我也很好奇这一切是如何在幕后运作的。 实际上,当 运行ning 并行时,必须使用多个进程或线程。 master 如何在构建期间与 slave 保持通信以更新状态等

非常感谢:-D

我试图找到解决您问题的方法,但我只能想出一些接近您要求的方法。据我所知,Jenkinsfiles 中的并行目前的实现方式不支持不同进程之间的通信运行并行。您的每个并行任务 运行 都在自己的沙箱中,因此无法直接访问有关其他任务的信息。

一种解决方案如下:

  • A、B、C并行启动
  • B 或 C 完成了第一阶段,现在需要 A 才能继续
  • 在B和C中引入等待阶段
  • B and/or C 轮询 A (http://jenkins/job/job.A/lastBuild/api/json) 的 Jenkins 远程 api 并查找结果条目
  • 如果结果为null -> 继续等待,如果结果为SUCCESS -> 继续,如果结果为FAILURE 抛出异常等等

此解决方案的明显缺点是,您必须实施该阶段并进行实际的 HTTP 调用以获得 JSON 响应。

另一种解决方案可能是:

  • 将 B 和 C 分别分成两个作业
  • 运行 B 和 C 的第一部分与 A 并行
  • 运行 第一个并行阶段完成后,B 和 C 的第二部分并行

这里的缺点是,它比您在问题中希望的设置慢。但是实施起来会少得多。