В предыдущей
заметке, я описывал как в Jenkins из pipeline запустить дочерний пайп и получить из него результат, но иногда жизнь нас заставляет запускать несколько подобных пайплайнов, и если они являются независимыми друг от друга их можно запустить параллельно, это ускорит процесс.
Из предыдущей заметки возьмем функцию запуска джобы, немножко ее модицифируеми и напишем pipeline с параллельным запуском задач
def runJob(jobName, params) {
def job
try {
job = build job: jobName, parameters: params
}catch (err) {
error "Run child job ${jobName} error"
return false
}
return [num: job.getNumber(), var: job.getBuildVariables(), url: job.getAbsoluteUrl()]
}
def tasksResult = [:] //Переменная в которую положим результаты выполнения наших пайплайнов
def tasksList = [ //Переменная со списком пайплайнов которые нужно запустить паралельно
'Second': [
'timeout': 12
],
'Third': [
'timeout': 5
]
]
pipeline {
agent any
stages {
stage('Init') {
steps {
echo 'Init'
// cleanWs() // Очистка проекта
// checkout scm //Подтянуть изменения из SCM
}
}
stage('Create parallel tasks') {
steps {
script {
echo 'Create parallel tasks'
def parallelTasks = [:] //Переменная которую в дальнейшем передадим функции parallel, в ней хранятся список скриптов которые надо запустить паралельно
tasksList.each { //Перебираем все таски из списка
def taskName = it.key //Объявлять переменную обязательно, что бы передалось корректное значение
def taskValues = it.value
parallelTasks["parallel-job-${taskName}"] = {
script {
def parameters = [
string(name: 'timeout', value: "${taskValues.timeout}") //Объявляем параметры для дочернего пайплайна
]
def childJob = runJob("Parallel/${taskName}", parameters) //Вызываем нашу функцию запуска пайпа и передаем туда имя и параметры
tasksResult[taskName] = childJob.var //Записываем в taskResult результаты выполнейного пайплайна, если такие имеются
echo "Chilb job ${taskName} build number: ${childJob.num} url: ${childJob.url}" //Просто сообщение для отладки
}
}
}
parallel parallelTasks //Запуск
}
}
}
stage('Print Result') {
steps {
script {
println(tasksResult) //выводим результат
}
}
}
}
}
Вот в принципе и все, не так и сложно
Комментарии ()