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

Как то столкнулся с такой задачей, что у меня есть некий главный pipeline и он должен запускать дочерние pipeline и получать из них некий артефакт. Так как я с Jenkins знаком недавно, то я погрузился в гугл и нашел туториал.



В предыдущей заметке я описывал как поднять в docker gitea + jenkins

Их и будем использовать для наших экспериментов.

Для начала создадим в Gitea репозиторий pipelines

В нем три файла, это скрипты для разных job'ов
first.groovy — первый дочерний job
pipeline {
    agent {
        docker { image 'ubuntu:latest' }
    }
    parameters{
      string(name: 'message', defaultValue: 'Default message', description: 'Some description')
    }
    stages {
        stage('Init') { 
            steps { 
                echo 'Init'
                checkout scm
            }
        }
        stage('Processing') { 
            steps { 
              script{
                echo "Message: ${params.message}, build number: ${env.BUILD_NUMBER}"
                //Иницилизируем рандом
                Random rnd = new Random()
                //Выставляем переменную которая веренется через 
                env.setProperty('returnData', rnd.nextInt())
              }
            }
        }
    }
}
second.groovy — второй дочерний job
pipeline {
    agent {
        docker { image "ubuntu:latest" }
    }
    parameters{
      string(name: 'message', defaultValue: 'Default message', description: 'Some description')
      string(name: 'someData', defaultValue: '', description: 'Some input data')
    }
    stages {
        stage('Init') { 
            steps { 
                echo 'Init'
                checkout scm
            }
        }
        stage('Processing') { 
            steps { 
              script{
                sh 'env'
                echo "Message: ${params.message}, Some data: ${params.someData}, build number: #${env.BUILD_NUMBER}"
                env.setProperty('returnData', "Some data from second job, ${env.BUILD_URL}" )
              }
            }
        }
    }
}
main.groovy — основной job
def runJob(jobName, params){
  def job
  try{
    job = build job: jobName, parameters: params
  }catch(err){
    return false
  }
  return job.getBuildVariables()
}

def firstJobResult
def secondJobResult

pipeline {
    agent any 
    stages {
        stage('Init') { 
            steps { 
                echo 'Init'
                checkout scm
            }
        }
        stage('First child Job'){
            steps {
              script{
                firstJobResult = runJob('First', [
                  string(name: 'message', value: 'Hello first JOB from main pipeline')
                ])
                if(firstJobResult == false){
                  currentBuild.status = 'FAILURE'
                  return
                }
                echo "First job return data: ${firstJobResult.returnData}"
              }
            }
        }
        stage('Second child job') {
            steps {
              script{
                secondJobResult = runJob('Second', [
                  string(name: 'message', value: 'Hello second JOB from main pipeline'),
                  string(name: 'someData', value: firstJobResult.returnData)
                ])
                if(secondJobResult == false){
                  currentBuild.status = 'FAILURE'
                  return
                }
                echo "Second job return data: ${secondJobResult.returnData}"
              }
            }
        }
    }
}
В этих примерах используется agent docker, поэтому установите плагин в Jenkins Docker Pipeline или изменить agent на any как в main.groovy

Теперь в Jenkins ручками создаем три Job
— Main
— First
— Second

Указываем ссылку на репозиторий и указываем имя скрипта



Пробуем запустить job Main и смотрим в Console Output

Должно быть нечто подобное
[Pipeline] { (First child Job)
[Pipeline] script
[Pipeline] {
[Pipeline] build (Building First)
Scheduling project: First
Starting building: First #10
[Pipeline] echo
First job return data: 583375725
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Second child job)
[Pipeline] script
[Pipeline] {
[Pipeline] build (Building Second)
Scheduling project: Second
Starting building: Second #4
[Pipeline] echo
Second job return data: Some data from second job, http://localhost:8080/job/Second/4/
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
Вот так вот несложно можно запускать дочерние джобы и получать из них данные в управляющую трубу ;-)

Полезная ссылка в которой описано какие данные можно вытащить из Job

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

  1. Евгений Владимирович Овчинников 12 мая 2022, 16:39 # 0
    Не работает если один из шагов второй джобы падает и фейлит саму джобу
    1. cloudsv 12 мая 2022, 18:48 # 0
      Вообще это нормальное поведение, но я думаю можно сделать, что бы упавшая дочерняя джоба считалась валидной

    Авторизация

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

    MTProto прokси для Telegram

    Прямой эфир

    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 10 сентября 2020, 13:17
    MySQL Workbench падает при подключении 2
    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