Jenkins 在并行块中运行的任务的编排

Jenkins 在并行块中运行的任务的编排,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,) 我面临一个问题,希望你能帮助我:-) 问题 我正在尝试编写一个管道,如下所示: 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 f

)

我面临一个问题,希望你能帮助我:-)

问题

我正在尝试编写一个管道,如下所示:

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的完成

我尝试过的事情

存储生成的结果

在“任务A”中,我会这样运行作业:
job\u A=构建作业:“job\u A”
然后在任务B和C中,我将使用“job_a”的属性。 不幸的是,由于没有定义作业a(在任务B和任务C的范围内),因此我得到了一个错误,这不起作用。使用“并行”时可能会出现分叉。 我还尝试在并行块之前定义“job_a”,但仍然在“task a”中将作业分配给它,但这也不起作用,因为在task B和task C中,job_a将只具有最初定义的值

在并行块外调度任务A

我还尝试直接在并行块之前安排作业。 我将获得一个作业对象,然后直接运行job.scheduleBuild2。 这里再次没有成功

知道怎么做吗?

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

  • 所有这些作业都在从机上运行(很可能不同)
  • 如果任务A已完成,并且任务B的构建已完成,则应开始测试。即使任务C的构建尚未完成
  • 如果任务C在任务B之前完成,则相同
  • 如果您能想到如何实现此功能,我将不胜感激:-) 更一般地说,我也很好奇这一切在幕后是如何运作的。 实际上,在并行运行时,必须使用多个进程或线程。在构建过程中,主设备如何与从设备保持通信以更新状态等


    非常感谢:-D

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

    一种解决方案可以是:

    • A、 B和C并联启动
    • B或C完成第一阶段,现在需要A继续
    • 在B和C中引入等待阶段
    • B和/或C轮询A的Jenkins远程api(
      http://jenkins/job/job.A/lastBuild/api/json
      )并查找结果条目
    • 如果结果为空->保持等待,如果结果为
      成功
      ->继续,如果结果为
      失败
      抛出异常,依此类推
    此解决方案的明显缺点是,您必须实现该阶段并执行实际的HTTP调用以获得JSON响应

    另一个解决办法可以是:

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

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

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

    一种解决方案可以是:

    • A、 B和C并联启动
    • B或C完成第一阶段,现在需要A继续
    • 在B和C中引入等待阶段
    • B和/或C轮询A的Jenkins远程api(
      http://jenkins/job/job.A/lastBuild/api/json
      )并查找结果条目
    • 如果结果为空->保持等待,如果结果为
      成功
      ->继续,如果结果为
      失败
      抛出异常,依此类推
    此解决方案的明显缺点是,您必须实现该阶段并执行实际的HTTP调用以获得JSON响应

    另一个解决办法可以是:

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

    这里的缺点是,它比您在问题中希望的设置慢。但是实现起来要省力得多。

    我不太确定要传递给作业B和作业C的属性是什么(在构建部分的存储结果中)。这些结果文件还是你的Jenkins文件中的实际对象?嘿!因此,“构建作业”返回一个具有“result”属性的对象。从我所看到的,结果要么设置为null(作业仍在运行)、失败、成功,要么不稳定。我的想法是轮询结果并等待结果为空。更清楚吗?另一个澄清:我所要寻找的是一种从task B/C并行块内部等待“task a”完成的方法。我不确定您想要传递给job B和C(在构建部分的存储结果中)的这些属性是什么。这些结果文件还是你的Jenkins文件中的实际对象?嘿!因此,“构建作业”返回一个具有“result”属性的对象。从我所看到的,结果要么设置为null(作业仍在运行)、失败、成功,要么不稳定。我的想法是轮询结果并等待结果为空。更清楚吗?另一个澄清:我所要寻找的,是一种从任务B/C并行块内部等待“任务a”完成的方法。感谢Bricktop的回答。我很感激你花时间调查此事:-)我理解