Как то столкнулся с такой задачей, что у меня есть некий главный 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
Комментарии ()