在詹金斯中使用带有循环的构建流程插件的并行作业
Parallel jobs using build flow plugin with loop in jenkins
我正在使用构建流程插件构建一个 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" ) },
中断
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" ) },
}
}
)
上面的两个块都出现以下错误:
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
到 return 列表:
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" )
}
}
}
如果名称通过则仅 return 闭包(而不是每个项目的闭包,其中很多项目会提前完成)的替代方案是:
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)
}
}
}
我正在使用构建流程插件构建一个 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" ) },
中断
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" ) },
}
}
)
上面的两个块都出现以下错误:
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
到 return 列表:
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" )
}
}
}
如果名称通过则仅 return 闭包(而不是每个项目的闭包,其中很多项目会提前完成)的替代方案是:
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)
}
}
}