Jon*_*man 2 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" )
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这需要很长时间来构建所有匹配的工作(现在有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" )
}
}
}
)
Run Code Online (Sandbox Code Playgroud)
^^这仍然有效,但它的工作方式与以前相同.它一次完成一项工作,并且在上一次完成之前不构建下一项工作.
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" ) },
}
}
}
)
Run Code Online (Sandbox Code Playgroud)
^^这个错误
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" ) },
Run Code Online (Sandbox Code Playgroud)
打破
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" ) },
}
}
]
)
Run Code Online (Sandbox Code Playgroud)
打破
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" ) },
}
}
)
Run Code Online (Sandbox Code Playgroud)
上述两个块都出现以下错误:
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)
Run Code Online (Sandbox Code Playgroud)
这里有很多代码,但它相当简单.环顾四周,我找不到很多关于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" )
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果名称通过,则仅返回Closure的替代方法(而不是每个项目的Closure,其中很多将提前完成)是:
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") } }
Run Code Online (Sandbox Code Playgroud)