Jenkins параллельный запуск дочерних задач

В предыдущей заметке, я описывал как в 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) //выводим результат
        }
      }
    }
  }
}

Вот в принципе и все, не так и сложно

Комментарии ()

    Есть вопрос или предложение пиши в Telegram @cloudsv

    MTProto прokси для Telegram

    Прямой эфир

    cloudsv 10 сентября 2020, 13:17
    MySQL Workbench падает при подключении 2
    cloudsv 31 августа 2020, 15:55
    Let's Encrypt это легко и просто 2
    cloudsv 05 августа 2020, 11:57
    Мне вчера стукнуло 34 4
    Алексей 19 июня 2020, 15:06
    Обновление Scala Rider G4 34
    Tmks 24 января 2020, 01:05
    Настройка прокси mtproto для Telegram 50
    cloudsv 26 октября 2019, 20:11
    Linux I/O Scheduler, для кого какой? 2
    alex 26 февраля 2019, 11:28
    Установка и настройка minidlna 1
    Георгий 18 декабря 2018, 09:13
    Пароль от резервной копии Bitrix 2
    cloudsv 17 октября 2020, 12:55
    Arch Linux Отключить DHCP IPv6 в systemd 0
    cloudsv 31 июля 2020, 00:54
    О жизни Мне вчера стукнуло 34 4
    cloudsv 15 апреля 2020, 18:45
    Arch Linux Основные hotkeys редактора Vim 0
    cloudsv 01 октября 2019, 11:00
    Arch Linux Локальный редирект порта в Linux 0
    cloudsv 25 августа 2019, 19:14
    О жизни Социальная сеть от Яндекса Aura 0
    cloudsv 31 июля 2019, 00:34
    О жизни 33 year old 0
    cloudsv 25 июня 2019, 21:29
    Telegram Полезные боты в Telegram 0