Параллельные задания с использованием плагина сборки потока с циклом в 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, но их может быть гораздо больше).
Я пытаюсь заставить это выполнять каждую работу параллельно, но я не могу понять отличный синтаксис.
Я пробовал 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)
Здесь много кода, но все довольно просто. Оглядываясь вокруг, я не могу найти много хороших ресурсов на заводной.
2 ответа
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") } }
Вот мое решение, которое может быть полезным с плагином Folders:
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)
}
}
}