简体   繁体   中英

Jenkins Pipeline - build same job multiple times in parallel

I am trying to create a pipeline in Jenkins which triggers same job multiple times in different node(agents).

I have "Create_Invoice" job Jenkins, configured: (Execute Concurrent builds if necessary) If I click on Build 10 times it will run 10 times in different (available) agents/nodes.

Instead of me clicking 10 times, I want to create a parallel pipeline.

I created something like below - it triggers the job but only once. What Am I missing or is it even possible to trigger same test more than once at the same time from pipeline?

Thank you in advance

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)
    }   
}
}

I had the same problem and solved it by passing different parameters to the same job. You should add parameters to your build steps, although you obviously don't need them. For example, I added a string parameter.

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
  }
}

As long as the same parameters or no parameters are passed to the same job, the job is only tirggered once.

See also this Jenkins issue, it describes the same problem:
https://issues.jenkins.io/browse/JENKINS-55748

I think you have to switch to Declarative pipeline instead of Scripted pipeline.

Declarative pipeline has parallel stages support which is your goal:

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

This example will grab the available agent from the Jenkins and iterate and run the pipeline in all the active agents.

with this approach, you no need to invoke this job from an upstream job many time to build on a different agent. This Job itself will manage everything and run all the stages define in all the online node.


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} "
    }
    
}    

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM