Попытка запустить все задания параллельно с использованием общей библиотеки - PullRequest
1 голос
/ 03 июля 2019

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

Моя общая библиотека runAllJobsInFolder.groovy:

def call(String foldername) {
def jobsList = []
def parallelJobs2Run = [:]

def project = Jenkins.instance.getItemByFullName(foldername)
def childItems = project.items
for (def i = 0; i < childItems.size(); i++) {
def childItem = childItems[i]
if (!childItem instanceof AbstractProject) continue;
if (childItem.fullName == foldername) continue;

jobsList.add(childItem.fullName)
 }
  for (int i = 0; i < jobsList.size(); i++) {
   def job = jobsList[i]
    echo "Going to parallel for job ${job}"
    parallelJobs2Run["${job}"] = { ->
        echo "Calling job ${job}"
        build job: "${job}",        
        propagate: true
    }
}
parallel parallelJobs2Run
}

=======================================

В задании Дженкинса я назвал его с помощью runAllJobsInFolder "testfolder"

Я хочу распространятьрезультат сработавших заданий на основное задание

в журнале заданий

Going to parallel for job testfolder/test1
[Pipeline] echo
Going to parallel for job testfolder/test2
[Pipeline] parallel
[Pipeline] [testfolder/test1] { (Branch: testfolder/test1)
[Pipeline] [testfolder/test2] { (Branch: testfolder/test2)
[Pipeline] [testfolder/test1] echo
[testfolder/test1] Calling job testfolder/test1
[Pipeline] [testfolder/test1] build (Building testFolder » test1)
[testfolder/test1] Scheduling project: testFolder » test1
[Pipeline] [testfolder/test2] echo
[testfolder/test2] Calling job testfolder/test2
[Pipeline] [testfolder/test2] build (Building testFolder » test2)
[testfolder/test2] Scheduling project: testFolder » test2
[Pipeline] [testfolder/test2] }
[testfolder/test2] Failed in branch testfolder/test2
[Pipeline] [testfolder/test1] }
[testfolder/test1] Failed in branch testfolder/test1
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] End of Pipeline

    an exception which occurred:
    in field com.cloudbees.groovy.cps.impl.BlockScopeEnv.locals
    in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@49674bfd
    in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
    in object com.cloudbees.groovy.cps.impl.LoopBlockScopeEnv@15e9217f
    in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
    in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@6d430606
    in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
    in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@19d10361
    in field com.cloudbees.groovy.cps.impl.CpsClosureDef.capture
    in object com.cloudbees.groovy.cps.impl.CpsClosureDef@ce48f2
    in field com.cloudbees.groovy.cps.impl.CpsClosure.def
    in object org.jenkinsci.plugins.workflow.cps.CpsClosure2@ce6143c
    in field org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.closures
    in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@7e809250
    in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@7e809250
Caused: java.io.NotSerializableException: com.cloudbees.hudson.plugins.folder.Folder
    at 
 org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:926)
        at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65)

введите здесь код введите здесь

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Я исправил это, разделив мою общую библиотеку на две части.

1.shared библиотека для генерации списка заданий в папке и возврата списка в jenkins

2.shared библиотека для запуска списка заданий, теперь она будет принимать массив в качестве аргумента.

Это решило мой вариант использования, но не мог понять, как.

0 голосов
/ 05 июля 2019

Хорошей практикой в ​​разделяемой библиотеке было бы использование «тип распространения: ложь, ожидание: истина» при вызове сборки и чтение статуса возврата задания сборки для заполнения в currentBuild.result = build_job? .Result.toString ()

Вы также можете прочитать другой параметр, доступный для дескриптора job_url = build_job? .AbsoluteUrl

Вы можете сослаться на это для получения дополнительных свойств, доступных после выполнения сборки. Как мне получить URL-адрес сборки, запущенной с шагом сборки на Дженкинсе?

...