在并行块中编排任务 运行
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。
这里又没有成功。
知道怎么做吗?
我想以这种方式设置管道的主要原因是:
- 所有这些工作 运行 在奴隶身上(很可能不同)。
- 如果任务 A 完成,任务 B 的构建也完成,测试应该开始。即使任务 C 的构建还没有完成。
- 如果任务 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 的第二部分并行
这里的缺点是,它比您在问题中希望的设置慢。但是实施起来会少得多。
)
我遇到了一个问题,希望你能帮帮我 :-)
问题
我正在尝试编写如下所示的管道:
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。 这里又没有成功。
知道怎么做吗?
我想以这种方式设置管道的主要原因是:
- 所有这些工作 运行 在奴隶身上(很可能不同)。
- 如果任务 A 完成,任务 B 的构建也完成,测试应该开始。即使任务 C 的构建还没有完成。
- 如果任务 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 的第二部分并行
这里的缺点是,它比您在问题中希望的设置慢。但是实施起来会少得多。