Последняя редакция успешной сборки для вышестоящей многоотраслевой работы в декларативном конвейере Jenkins - PullRequest
1 голос
/ 17 апреля 2019

Я хотел бы получить версии сборки последних успешных сборок заданий Upstream. Задания вверх по течению являются многоотраслевыми.

Пока что я генерирую список имен заданий верхнего уровня в качестве триггеров. Но я не могу найти правильный метод для вызова.

import jenkins.model.Jenkins

def upstreamPackages = ['foo', 'bar']
def upstreamJobs = upstreamPackages.collect { "${it}-multibranch/master" }.join(',')

pipeline {
    agent none

    triggers {
        upstream(upstreamProjects: upstreamJobs,
             threshold: hudson.model.Result.SUCCESS)
    }

    stages {
        stage('test'){
            steps{
                script {
                    upstreamJobs.each {
                        println it
                        job = Jenkins.instance.getItem(it)
                        job.getLastSuccessfulBuild()

                        revision = job.getLastSuccessfulBuild().changeset[0].revision
                        println revision
                    }
                }
            }
        }
    }
}

В результате получается нулевой объект для item. Как правильно это сделать?

ОБНОВЛЕНИЕ 1 После обнаружения консоли сценариев Jenkins и этого комментария мне удалось придумать следующее:

import jenkins.model.Jenkins
import hudson.plugins.git.util.BuildData

def upstreamPackages = ['foo', 'bar']
def upstreamJobsList = upstreamPackages.collect { "${it}-multibranch/master" }.join(',')

@NonCPS
def resolveRequirementsIn(packages){
    BASE_URL = 'git@github.com:myorg'
    requirementsIn = ''

    packages.each { pkg ->
        revision = getLastSuccessfulBuildRevision("${pkg}-multibranch")
        requirementsIn <<= "-e git+${BASE_URL}/${pkg}.git@${revision}#egg=${pkg}\n"
    }

    println requirementsIn
    return requirementsIn
}

@NonCPS
def getLastSuccessfulBuildRevision(jobName){
    project = Jenkins.instance.getItem(jobName)
    masterJob = project.getAllItems().find { job -> job.getName() == 'master' }

    build = masterJob.getLastSuccessfulBuild()
    return build.getAction(BuildData.class).getLastBuiltRevision().sha1String
}


pipeline {
    agent { label 'ci_agent' }

    triggers {
        upstream(upstreamProjects: upstreamJobsList,
             threshold: hudson.model.Result.SUCCESS)
    }

    stages {
        stage('Get artifacts'){
            steps{
                script{
                    requirementsIn = resolveRequirementsIn upstreamPackages
                    writeFile file: 'requirements.in', text: requirementsIn
                }

            }
        }
    }
}

Выдает ошибку:

an exception which occurred:
    in field org.jenkinsci.plugins.pipeline.modeldefinition.withscript.WithScriptScript.script
    in object org.jenkinsci.plugins.pipeline.modeldefinition.agent.impl.LabelScript@56d1724
    in field groovy.lang.Closure.delegate
    in object org.jenkinsci.plugins.workflow.cps.CpsClosure2@27378d57
    in field groovy.lang.Closure.delegate
    in object org.jenkinsci.plugins.workflow.cps.CpsClosure2@6e6c3c4e
    in field org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.closures
    in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@5d0ffef3
    in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@5d0ffef3
Caused: java.io.NotSerializableException: 
org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject

1 Ответ

0 голосов
/ 17 апреля 2019

Проблема была в том, что Jenkins 'Pipeline DSL требует, чтобы все назначенные объекты были сериализуемыми.

Jenkins.instance.getItem(jobName) возвращает значение WorkflowMultiBranchProject, которое нельзя сериализировать.Также не является Jenkins.instance.getItem(jobName).getItem('master'), который является WorkflowJob объектом.

Таким образом, я неизменно шел по цепочке вызовов к тому, что мне нужно, заменяя назначения переменных связанными вызовами методов, и придумал следующее решение.

def upstreamPackages = ['foo', 'bar']
def upstreamJobsList = upstreamPackages.collect { "${it}-multibranch/master" }.join(',')

def String requirementsInFrom(packages){
    final BASE_URL = 'git@github.com:myorg'
    requirementsIn = ''

    packages.each{ pkg ->
    revision = Jenkins.instance.getItem("${pkg}-multibranch")
        .getItem('master')
        .getLastSuccessfulBuild()
        .getAction(BuildData.class)
        .getLastBuiltRevision()
        .sha1String

        requirementsIn <<= "-e git+${BASE_URL}/${pkg}.git@${revision}#egg=${pkg}\n"
    }

    return requirementsIn.toString()
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...