我正在试验jenkins工作流中的并行步骤。目前我的流程看起来(本质上)是这样的:
parallel 'Deploy-A-Machine': {
node {
input 'Shall we deploy the A machine?'
step([$class: 'DeployMachineBuilder', deploymentName: aPodName])
}
}, 'Deploy-B-Machine': {
node {
input 'Shall we deploy the B machine?'
step([$class: 'DeployMachineBuilder', deploymentName: bPodName])
}
}
两个输入显示为在不同的执行器上运行,但是当我在两个执行器上单击"proceed"时,实际上只有第一个部署开始。部署作为为遗留作业编写的自定义插件运行,并以极低的方式转换为工作流。我没有看到任何关于等待执行器的明显消息,部署只是没有开始。第一个任务完成后,第二个任务将立即开始。
我必须实现DurableTask(或其他东西?)之前并行步骤将允许两者运行?到目前为止,我的转换非常轻,所以也许是时候尝试更真实的转换了。
假设DeployMachineBuilder
是您编写的SimpleBuildStep
,实际上它的perform
方法只会在其持续时间内阻塞Workflow虚拟机:Groovy解释器使用coöperative多任务处理。
在可行的情况下,最简单的解决方案是使用sh
步骤而不是自定义构建器。这存活slave断开和/或Jenkins重启,并显示增量进度,并与parallel
正常工作。JENKINS-26055将提供一种更方便的方式来定义自定义的"持久"步骤。JENKINS-25879将提供一种更方便的方式来定义不持久的步骤,但至少避免阻塞本机线程(因此在parallel
中表现更好,并且增量记录)。
顺便说一下,在您的示例脚本中,我建议将input
步骤移出node
块:在等待(可能无限期)用户批准时占用执行器是没有意义的。