Параллельные задания с использованием плагина сборки потока с циклом в 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) 

Здесь много кода, но он довольно прост. Оглядываясь вокруг, я не могу найти много хороших ресурсов по groovy.


person Jon Heckman    schedule 13.07.2015    source источник


Ответы (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" )
        }
    }
}

Альтернативой, которая возвращает 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") } }
person tim_yates    schedule 13.07.2015
comment
Работает отлично. Спасибо! - person Jon Heckman; 13.07.2015
comment
@JonHeckman Добавлено обновление, которое будет запускать меньше заданий, поскольку оно сначала будет фильтровать, а затем генерировать замыкания только для тех, которые соответствуют вашим требованиям :-) - person tim_yates; 13.07.2015

Вот мое решение, которое может быть полезно с плагином 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)
    }
  }
}
person Sath89    schedule 13.04.2016