Groovy 在jenkins中使用带循环的构建流插件进行并行作业

Groovy 在jenkins中使用带循环的构建流插件进行并行作业,groovy,jenkins,jenkins-plugins,jenkins-build-flow,Groovy,Jenkins,Jenkins Plugins,Jenkins Build Flow,我正在使用build flow插件构建jenkins流,该插件将捕获所有作业,将名称与正则表达式进行比较,如果名称匹配,则将触发作业的生成。 我有一个完美的工作: import jenkins.model.Jenkins import java.util.regex.* Pattern myRegex = ~/release_status.*/ for (item in jenkins.model.Jenkins.instance.items) { if (item.name ==~ my

我正在使用build flow插件构建jenkins流,该插件将捕获所有作业,将名称与正则表达式进行比较,如果名称匹配,则将触发作业的生成。
我有一个完美的工作:

import jenkins.model.Jenkins
import java.util.regex.*
Pattern myRegex = ~/release_status.*/
for (item in jenkins.model.Jenkins.instance.items) 
{
  if (item.name ==~ myRegex) {
    build( "$item.name" )
  }
}
然而,这需要很长时间来构建所有匹配的工作(目前有20个,但可能还有更多)。
我试图让它并行运行每个作业,但我无法理解groovy语法。
我尝试了3种不同的方法:

import jenkins.model.Jenkins
import java.util.regex.*
Pattern myRegex = ~/release_status.*/
parallel (
  {
    for (item in jenkins.model.Jenkins.instance.items) 
    {
      if (item.name ==~ myRegex) {
        build( "$item.name" )
      }
    }
  }
)
^^这仍然有效,但其工作方式与以前相同。它一次执行一个作业,直到前一个作业完成后才构建下一个作业

import jenkins.model.Jenkins
import java.util.regex.*
Pattern myRegex = ~/release_status.*/
parallel (
  {
    for (item in jenkins.model.Jenkins.instance.items) 
    {
      if (item.name ==~ myRegex) {
        { build( "$item.name" ) },
      }
    }
  }
)
^^这是一个错误

Script1.groovy: 9: Ambiguous expression could be either a parameterless closure expression or an isolated open code block;
   solution: Add an explicit closure parameter list, e.g. {it -> ...}, or force it to be treated as an open block by giving it a label, e.g. L:{...} @ line 9, column 9.
           { build( "$item.name" ) },
中断

中断

上述两个块均存在以下错误:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
Script1.groovy: 5: unexpected token: for @ line 5, column 5.
       for (item in jenkins.model.Jenkins.instance.items) 

这里有很多代码,但相当简单。环顾四周,我找不到很多关于groovy的好资源

parallel
获取闭包列表,因此您应该能够使用
collect
返回列表:

import jenkins.model.Jenkins
import java.util.regex.*

Pattern myRegex = ~/release_status.*/
parallel jenkins.model.Jenkins.instance.items.collect { item ->
    { -> 
        if (item.name ==~ myRegex) {
            build( "$item.name" )
        }
    }
}
只有在名称通过时才返回闭包(而不是每个项都返回闭包,其中很多项都会提前完成)的另一种方法是:


以下是我的解决方案,可能对文件夹插件有帮助:

import jenkins.model.Jenkins
//Configuration block
def dryRun = true
def projectFolder = 'Path/To/Folder'
def phases = ['.*-Build','.*-Deploy', '.*-Regression', '.*Service-Full-Performance-Test']
//Configuration block

def phasesRegex = []
phases.each{
  phasesRegex.push(~/${projectFolder}\/${it}/)
}

def jobs = []

items = jenkins.model.Jenkins.instance.getItemByFullName(projectFolder);

items.getAllJobs().collect{
  jobs.push(it.getFullName())
}


phasesRegex.each{
  run = jobs.grep(it)
  parallel run.collect{ job ->
    { ->
      if (dryRun) println "Dry Run of Job: ${job}"
      else build(job)
    }
  }
}

工作完美。谢谢大家!@JonHeckman添加了一个更新,它将启动更少的作业,因为它将首先过滤,然后只为符合您需求的作业生成闭包:-)
import jenkins.model.Jenkins
import java.util.regex.*

Pattern myRegex = ~/release_status.*/
parallel jenkins.model.Jenkins.instance.items.collect { item ->
    { -> 
        if (item.name ==~ myRegex) {
            build( "$item.name" )
        }
    }
}
import jenkins.model.Jenkins
import java.util.regex.*

Pattern myRegex = ~/release_status.*/

parallel Jenkins.instance.items.findAll { item -> item.name ==~ myRegex}
                               .collect { item -> { -> build("$item.name") } }
import jenkins.model.Jenkins
//Configuration block
def dryRun = true
def projectFolder = 'Path/To/Folder'
def phases = ['.*-Build','.*-Deploy', '.*-Regression', '.*Service-Full-Performance-Test']
//Configuration block

def phasesRegex = []
phases.each{
  phasesRegex.push(~/${projectFolder}\/${it}/)
}

def jobs = []

items = jenkins.model.Jenkins.instance.getItemByFullName(projectFolder);

items.getAllJobs().collect{
  jobs.push(it.getFullName())
}


phasesRegex.each{
  run = jobs.grep(it)
  parallel run.collect{ job ->
    { ->
      if (dryRun) println "Dry Run of Job: ${job}"
      else build(job)
    }
  }
}