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

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

    Есть вопрос или предложение пиши в 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 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