2016-10-20 2 views
4

Я Groovy скрипт как часть работы трубопровода в Дженкинс, как показано ниже:Как заставить работу Pipeline ждать всех запущенных параллельных заданий?

node { 
    stage('Testing') { 
     build job: 'Test', parameters: [string(name: 'Name', value: 'Foo1')], quietPeriod: 2, wait: false 
     build job: 'Test', parameters: [string(name: 'Name', value: 'Bar1')], quietPeriod: 2, wait: false 
     build job: 'Test', parameters: [string(name: 'Name', value: 'Baz1')], quietPeriod: 2, wait: false 
     build job: 'Test', parameters: [string(name: 'Name', value: 'Foo2')], quietPeriod: 2, wait: false 
     build job: 'Test', parameters: [string(name: 'Name', value: 'Bar2')], quietPeriod: 2, wait: false 
     build job: 'Test', parameters: [string(name: 'Name', value: 'Baz2')], quietPeriod: 2, wait: false 
    } 
} 

, который выполняет множество других фристайл заданий параллельно, из-за wait флаг устанавливают в false. Однако я хотел бы, чтобы задание вызывающего абонента заканчивалось, когда все задания были завершены. В настоящее время задание Pipeline запускает все задания и заканчивает его через несколько секунд, чего я не хочу, потому что я не могу отслеживать общее время, и у меня нет возможности отменить все запущенные задания за один раз.

Как исправить выше сценарий для задания трубопровода, чтобы завершить работу, когда все параллельные работы завершены?

Я пытался обернуть работу по строительству в блоке waitUntil {}, но это не сработало.

ответ

10

Вы должны использовать Трубопроводный параллельно выражение, которое будет ждать всех порождены рабочих мест/подзадачи для завершения:

stage('testing') { 
    def branches = [:] 

    for(i = 0; i < params.size(); i += 1) { 
     def param = params[i] 

     branches["Test${i}"] = { 
      build job: 'Test', parameters: [string(name: 'Name', value: param)], quietPeriod: 2 
     } 
    } 
    parallel branches 
} 

Вы можете найти еще несколько примеров в документации трубопроводов на jenkins.io

1

Однако @agg3l's example İŞ не работая с несколькими заданиями.

Map jobResults = [:] 

Boolean failedJobs = false 
def buildJobWithParams(def jobs_list, Map results) { 
    def branches = [:]  
    for(job in jobs_list) 
    { 
    print job 
    branches["Test-${job}"] = { 
     def jobBuild = build job: job, propagate: false 
     def jobResult = jobBuild.getResult() 
     echo "Build of '${job}' returned result: ${jobResult}" 
     results[job] = jobResult 
    } 
    }  
    return branches 
} 

stage('Run integration tests') { 
     steps { 
      def job_branch = buildJobWithParams(item_list, jobResults) 
      print job_branch 
      parallel job_branch 
      } 
} 

item_list имеет более чем 1 работу, однако он будет выполнять только последнее задание несколько раз.

+0

Когда-нибудь найти исправление для этого? Я вижу такое же поведение @kenorb – Levi

Смежные вопросы