我正在尝试jenkins工作流程中的并行步骤。目前我的流程(基本上)看起来像这样:
string SubAssemblySerialNumber = form.serail;
string Refdes = row.Cells["RefDesc"].Value.ToString().Replace(";", "");
string URL = "http://" + MSSRestSrv + ":8018/Quality/SerialNumbers/BoxBuilds/" + serial + "/Attach/?SubAssemblySerialNumber=" + SubAssemblySerialNumber + "&Refdes=" + Refdes + "";
try
{
using (WebClient client = new WebClient())
{
System.Collections.Specialized.NameValueCollection reqparm = new System.Collections.Specialized.NameValueCollection();
byte[] responsebytes = client.UploadValues(URL, "POST", reqparm);
string responsebody = Encoding.UTF8.GetString(responsebytes);
}
}
catch (WebException we)
{
MessageBox.Show(we.Response.ToString());
}
两个输入都显示为在不同的执行程序上运行,但是当我点击"继续"在两者上,只有第一次部署实际开始。这些部署作为自定义插件运行,该插件是为旧作业编写的,并且非常简单地转换为工作流。我没有看到任何关于等待执行者的明显信息,部署根本就没有开始。第一个完成后,第二个将立即开始。
在并行步骤允许两者运行之前,我必须实现DurableTask(或其他东西?)到目前为止我的转换非常轻松,所以也许是时候尝试更真实的转换了。
答案 0 :(得分:2)
假设DeployMachineBuilder
是您编写的SimpleBuildStep
,实际上它的perform
方法将在其持续时间内阻止Workflow虚拟机:Groovy解释器使用协同多任务处理。
在可行的情况下,最简单的解决方案是使用sh
步骤而不是自定义构建器。这可以避免从属断开连接和/或Jenkins重新启动,并显示增量进度并与parallel
一起正常工作。 JENKINS-26055将提供一种更方便的方式来定义自定义的“持久”步骤。 JENKINS-25879将提供一种更方便的方法来定义不耐用的步骤,但至少避免阻塞本机线程(因此在parallel
中表现得更好并且以递增方式记录)。
顺便提一下,在我的示例脚本中,我建议将input
步骤移到node
块之外:在等待(可能是无限期)用户批准时,没有必要占用执行程序。< / p>