groovy - 在 jenkins 中使用带有循环的构建流程插件的并行作业

标签 groovy jenkins jenkins-plugins jenkins-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 个,但可能会有更多)。
我试图使其并行运行每个作业,但我无法弄清楚常规语法。
我尝试了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" ) },

中断

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) {
        useless: { 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" ) },
      }
    }
)

上面的两个 block 都出现以下错误:

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
import java.util.regex.*

Pattern myRegex = ~/release_status.*/

parallel Jenkins.instance.items.findAll { item -> item.name ==~ myRegex}
                               .collect { item -> { -> build("$item.name") } }

关于groovy - 在 jenkins 中使用带有循环的构建流程插件的并行作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31387614/

相关文章:

gradle - 成功建立计划后,如何通过电子邮件发送驻留在 Bamboo 制品中的文件?

java - 如何加快oracle普通语句批量操作?

grails - 在Grails配置中,如何在其他环境中访问变量?

spring - 将更改保存到Grails中的属性文件

python - 在 Jenkins Pipeline Shell 中运行 Python 脚本

msbuild - UnitTestFramework 引用无法解析

jenkins - 如何将 Jenkins UI 转换为 Jenkins DSL?

git - 如何使用 Jenkins 为许多 repos 创建和推送新的 Github 分支?

java - 使用 jenkins 执行 .bat 文件

Jenkins 作业等待多个开放执行器插槽