2017-03-31 39 views
0

enter image description herejenkins复杂的buildflow,有可能吗?

我想要一个Jenkins构建流程,看起来像这样。

  • 构建触发后,所有从站并行运行相同的作业(安装作业)。
  • 如果有任何从站失败,则不应继续。
  • 对于通过这项工作的所有奴隶来说,他们应该从一堆需要完成的工作中抓出一份工作。一旦一个奴隶完成了一份工作,他们应该回去完成另一份工作。

我几周前才开始与Jenkins一起工作,现在他们的方式是让每个工作都由一个奴隶接受,他们必须先运行安装作业。这实际上减慢了构建时间,因为我有大约30个工作,设置需要大约2分钟。

我将Jenkins用作自动化测试平台,作业池中的所有作业都可以独立运行。我目前有5个奴隶,约30个工作。

+0

詹金斯已经有一个工作池。拥有多个池(贴上标签的工人)很常见,但是动态重新贴标签没有完成。我们可以谈谈更多关于你的设置吗?为什么我们不能在你的工人面前这样做(在他们加入詹金斯工人池之前)。你在使用什么类型的工人(在一个他们可以成为虚拟机,ec2实例,码头集装箱的世界里)? –

+0

工人们都是单独的物理机器。设置步骤的主要原因是启动我打算测试的程序。我喜欢将它与其他测试分开,因为它通常不会启动,我希望将此失败表示为启动失败而不是功能失败。我们有很多的失败,如果我必须深入了解每个测试失败的原因,那么进行自动测试的意义何在。我并不反对另一种方法,我只想试图在每个构建版本的每个副本上启动一次程序,并且在每次构建中,我的副本将从5到7个测试任务中完成。 – user2327814

+0

这并不难,特别是如果你把它放在管道中的“阶段”。管道还会分离日志以便于查看,并将其检出。我将在下面开始回答 –

回答

0

下应该做的伎俩:

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变量和修改设置的一部分。

+0

对不起,如果这是一个不好的问题,但我会在哪里放置这样的脚本?我一直在jenkins UI中创建了作业,并使用了Execute shell build选项。 – user2327814

+0

啊哈,对不起,创建一个Pipeline Job类型的工作,而不是自由式工作 –

+0

这非常接近我想要的。然而,似乎当我去构建这样的工作时:build'testing_helloworld'jenkins选择一个随机节点,而不是发出构建命令的节点。 – user2327814

0

看来你想在同一个工作中分开几个阶段。在jenkins 2的管线中这样做更容易。这里有一些图片: https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Stage+View+Plugin

的[常规]代码最终看起来像这样:

node { 
    stage 'Checkout' 
    svn 'https://svn.mycorp/trunk/' 
    stage 'Build' 
    sh 'make all' 
    stage 'Test' 
    sh 'make test' 
} 
相关问题