下应该做的伎俩:
def jobPool = new ArrayDeque()
jobPool.add({
echo "Doing stuff on ${env.NODE_NAME}"
});
jobPool.add({
echo "Doing other stuff on ${env.NODE_NAME}, a little slower"
sleep 4
});
jobPool.add({
echo "Doing more stuff on ${env.NODE_NAME}, even slower"
sleep 10
});
jobPool.add({
echo "Doing stuff quick on ${env.NODE_NAME}"
});
jobPool.add({
echo "Doing stuff quicker on ${env.NODE_NAME}"
});
def par = [:]
for (x in ["master", "urban"]) {
def nodeName = x; // needed due to variable scoping
par[nodeName] = {
node (nodeName) {
try {
echo "Doing setup on ${env.NODE_NAME}!"
// Do you're setup
echo "Done with setup"
} catch (Exception e) {
echo "Will not use this node as it failed setup!"
return;
}
while (true) {
// echo "${jobPool.size()}"
def subTask = jobPool.poll()
//echo "${jobPool.size()} ${subTask}"
if (subTask == null) {
break;
}
// Might wan't try catch around the next line if you wan't to continue if a job fails
subTask()
}
}
}
}
parallel par
if (!jobPool.isEmpty()) {
error "Not all tasks was done!"
}
只需添加你的“工作池工作”的jobPool
变量和修改设置的一部分。
詹金斯已经有一个工作池。拥有多个池(贴上标签的工人)很常见,但是动态重新贴标签没有完成。我们可以谈谈更多关于你的设置吗?为什么我们不能在你的工人面前这样做(在他们加入詹金斯工人池之前)。你在使用什么类型的工人(在一个他们可以成为虚拟机,ec2实例,码头集装箱的世界里)? –
工人们都是单独的物理机器。设置步骤的主要原因是启动我打算测试的程序。我喜欢将它与其他测试分开,因为它通常不会启动,我希望将此失败表示为启动失败而不是功能失败。我们有很多的失败,如果我必须深入了解每个测试失败的原因,那么进行自动测试的意义何在。我并不反对另一种方法,我只想试图在每个构建版本的每个副本上启动一次程序,并且在每次构建中,我的副本将从5到7个测试任务中完成。 – user2327814
这并不难,特别是如果你把它放在管道中的“阶段”。管道还会分离日志以便于查看,并将其检出。我将在下面开始回答 –