簡體   English   中英

Jenkins 管道 - 多次並行構建相同的作業

[英]Jenkins Pipeline - build same job multiple times in parallel

我正在嘗試在 Jenkins 中創建一個管道,它在不同的節點(代理)中多次觸發相同的作業。

我有“Create_Invoice”作業 Jenkins,已配置:(如有必要,執行並發構建)如果我單擊構建 10 次,它將在不同(可用)代理/節點中運行 10 次。

我不想點擊 10 次,而是想創建一個並行管道。

我創建了類似下面的東西 - 它觸發了工作但只有一次。 我錯過了什么,或者是否有可能同時從管道中多次觸發相同的測試?

先感謝您

node {
    def notifyBuild = { String buildStatus ->
        // build status of null means successful
        buildStatus =  buildStatus ?: 'SUCCESSFUL'
        // Default values
 def tasks = [:]
    try { 
tasks["Test-1"] = {  
    stage ("Test-1") {
        b = build(job: "Create_Invoice",  propagate: false).result       
   }
 }  
tasks["Test-2"] = {    
   stage ("Test-2") {
        b = build(job: "Create_Invoice",  propagate: false).result
        }
}    
 parallel tasks   
       } catch (e) {
        // If there was an exception thrown, the build failed
        currentBuild.result = "FAILED"
        throw e
    }
      finally {
          notifyBuild(currentBuild.result)
    }   
}
}

我有同樣的問題並通過將不同的參數傳遞給同一個作業來解決它。 您應該在構建步驟中添加參數,盡管您顯然不需要它們。 例如,我添加了一個字符串參數。

tasks["Test-1"] = {  
  stage ("Test-1") {
    b = build(job: "Create_Invoice",  parameters: [string(name: "PARAM", value: "1")], propagate: false).result       
  }
}  
tasks["Test-2"] = {    
  stage ("Test-2") {
    b = build(job: "Create_Invoice", parameters: [string(name: "PARAM", value: "2")], propagate: false).result
  }
}

只要相同的參數或沒有參數傳遞給同一個作業,該作業只會被觸發一次。

另請參閱此 Jenkins 問題,它描述了相同的問題:
https://issues.jenkins.io/browse/JENKINS-55748

我認為您必須切換到聲明式管道而不是腳本式管道。

聲明式管道具有並行階段支持,這是您的目標:

https://www.jenkins.io/blog/2017/09/25/declarative-1/

此示例將從 Jenkins 中獲取可用代理,並在所有活動代理中迭代和運行管道。

使用這種方法,您無需多次從上游作業調用此作業來構建不同的代理。 該作業本身將管理所有內容並運行所有在線節點中定義的所有階段。


jenkins.model.Jenkins.instance.computers.each { c ->
    
    if(c.node.toComputer().online) {
        node(c.node.labelString) {
            stage('steps-one') {
                echo "Hello from Steps One"
            }
            stage('stage-two') {
                echo "Hello from Steps Two"
            }
        }
    } else {
        println "SKIP ${c.node.labelString} Because the status is : ${c.node.toComputer().online} "
    }
    
}    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM