繁体   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