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) //выводим результат
        }
      }
    }
  }
}

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

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

    Авторизация

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

    MTProto прokси для Telegram

    Прямой эфир

    cloudsv 26 октября 2024, 11:31
    MySQL Workbench падает при подключении 4
    Diego mont 25 мая 2023, 07:04
    Полезные боты в Telegram 2
    cloudsv 24 апреля 2023, 17:56
    Обновление Scala Rider G4 52
    cloudsv 12 ноября 2022, 19:16
    Установка и настройка minidlna 3
    cloudsv 03 ноября 2022, 03:42
    Настройка прокси mtproto для Telegram 52
    cloudsv 03 января 2022, 10:50
    Let's Encrypt это легко и просто 4
    cloudsv 05 августа 2020, 11:57
    Мне вчера стукнуло 34 4
    cloudsv 07 августа 2023, 22:56
    Linux Asus ROG x13 flow 2022 GV301RE и Linux 0
    cloudsv 15 апреля 2023, 16:23
    Linux Уведомление о смены workspace в X11 Linux 0
    cloudsv 17 октября 2020, 09:55
    Linux Отключить DHCP IPv6 в systemd 0
    cloudsv 30 июля 2020, 21:54
    О жизни Мне вчера стукнуло 34 4
    cloudsv 15 апреля 2020, 15:45
    Linux Основные hotkeys редактора Vim 0
    cloudsv 01 октября 2019, 08:00
    Linux Локальный редирект порта в Linux 0
    cloudsv 25 августа 2019, 16:14
    О жизни Социальная сеть от Яндекса Aura 0
    cloudsv 30 июля 2019, 21:34
    О жизни 33 year old 0
    cloudsv 25 июня 2019, 18:29
    Telegram Полезные боты в Telegram 2