Jenkins可以并行管道条件流吗?

时间:2017-11-10 18:09:28

标签: jenkins jenkins-pipeline jenkins-cli

那么有条件地并行运行Jenkins管道吗?所以我有一个完整的版本,可以并行运行所有阶段,但是让我说我​​只想运行2/5的阶段...这可能,有没有人知道这个语法会是什么样子?这是我的groovy脚本:

def call() {
  def my_automation = load("my-lib/groovies/my_automation.groovy")
  parallel thing1: {
    stage('thing1'){
      my_automation.my_func("thing1")
    }},
    thing2: {
    stage('thing2'){
      my_automation.my_func("thing2")
    }}, thing3: {
    stage('thing3'){
      my_automation.my_func("thing3")
    }}, thing4: {
    stage('thing4'){
      my_automation.my_func("thing4")
    }}, thing5: {
    stage('thing5'){
      my_automation.my_func("thing5")
    }}, thing6: {
    stage('thing6'){
      my_automation.my_func("thing6")
    }}, thing7: {
    stage('thing7') {
      my_automation.my_func("thing7")
    }
  }
}return this;

但是寻找这样的事情:

for(all things defined, run them at once in parallel)
{
etc...
}

这可能吗?

2 个答案:

答案 0 :(得分:0)

您需要做的是有条件地定义要传递给并行的内容,而不是有条件地处理它。您可以使用for循环构建要在地图中执行的事物的地图,然后将其传递到并行步骤:

def branches = [:] 

for (int i = 0; i < 4 ; i++) {
       int index = i

       branches["thing${index}"] = { 
           stage("thing${index}") {
               node ('label_example'){
                   my_automation.my_func("thing${index}")
               }
           }
       }

}

parallel branches

如果需要,可以使用其中的逻辑跳过向地图添加内容。这不是语法检查或测试,但你应该明白这个想法。

答案 1 :(得分:0)

我最终做了类似这样的事情,我将传递图像名称并匹配它,这将决定哪一个反对(花了足够长的时间来响应,但想到这可能会帮助将来的某个人):

String call(String image_name) {
  def map = ["CentOS-7":"rpm", "CentOS-6":"rpm", "RHEL-7":"rpm","RHEL-6":"rpm","Ubuntu-14.04":"deb"]
  for (element in map) {
    echo "${element.key} ${element.value}"
    if ("${element.key}" == image_name){
      return "${element.value}"}
  }
  return "notfound"
}
return this;