2016-10-20 125 views
4

我已經Groovy腳本在詹金斯下面的管道工作的一部分:如何使管道作業等待所有觸發的並行作業?

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的。但是,我希望在所有工作完成後完成呼叫者作業。目前,管道作業會觸發所有作業並在幾秒後自行完成,這不是我想要的,因爲我無法跟蹤總時間,也無法一次性取消所有觸發的作業。

當所有並行作業完成時,如何糾正上述管道作業腳本以完成?

我試圖在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有一個以上的工作,但它只會多次執行最後的工作。

+0

有沒有找到解決這個問題?我看到相同的行爲@kenorb – Levi

相關問題