简体   繁体   中英

Run same Jenkins job on different repositories in parallel using Declarative Pipeline

My goal is to run the same job check-single-repo on multiple repositories in parallel.

Below pipeline doesn't seem to achieve the goal:

pipeline {
    agent any 
    options {
        ansiColor('xterm')                    
    }
    parameters {
        extendedChoice description: '', multiSelectDelimiter: ',', name: 'REPO_NAMES', quoteValue: false, saveJSONParameterToFile: false, type: 'PT_CHECKBOX', value: 'repo1,repo2,repo3', visibleItemCount: 3
    }

    stages {
        stage('Prepare repos to run on') {

            steps { 
                script {  
                    repo_names = params.REPO_NAMES.split(',')
                    def single_repo_jobs = [:]
                    for (repo_name in repo_names) {
                        println repo_name
                        single_repo_jobs[repo_name] = {  
                                stage(repo_name) {    
                                    catchError {
                                        build job: 'check-single-repo',
                                                parameters:
                                                        [                                                    
                                                                string(name:'REPO_NAME', value: repo_name)
                                                        ] }
                                    }
                                }
                    }
                    println single_repo_jobs
                    parallel single_repo_jobs                        
                }                
            }

        }
    }
} 

Its output:

...
repo1
repo2
repo3
{repo1=org.jenkinsci.plugins.workflow.cps.CpsClosure2@3a396959, repo2=org.jenkinsci.plugins.workflow.cps.CpsClosure2@1a4b5000, repo3=org.jenkinsci.plugins.workflow.cps.CpsClosure2@1d034ac}
[Pipeline] parallel
[Pipeline] { (Branch: repo1)
[Pipeline] { (Branch: repo2)
[Pipeline] { (Branch: repo3)
[Pipeline] stage
[Pipeline] { (repo3)
[Pipeline] stage
[Pipeline] { (repo3)
[Pipeline] stage
[Pipeline] { (repo3)
[Pipeline] catchError
[Pipeline] {
[Pipeline] catchError
[Pipeline] {
[Pipeline] catchError
[Pipeline] {
[Pipeline] build (Building check-single-repo)
Scheduling project: check-single-repo
[Pipeline] build (Building check-single-repo)
Scheduling project: check-single-repo
[Pipeline] build (Building check-single-repo)
Scheduling project: check-single-repo

Starting building: check-single-repo #230
Starting building: check-single-repo #230
Starting building: check-single-repo #230

[Pipeline] }
check-single-repo #230 repo3 completed with status UNSTABLE (propagate: false to ignore)
[Pipeline] }
check-single-repo #230 repo3 completed with status UNSTABLE (propagate: false to ignore)
[Pipeline] }
check-single-repo #230 repo3 completed with status UNSTABLE (propagate: false to ignore)
...

As it invokes only one pipeline #230 on repo3

How to run the same Jenkins job on different repositories in parallel using Declarative Pipeline?

The following code worked for me after following the example from docs :

pipeline {
    agent any 
    options {
        ansiColor('xterm')                    
    }
    parameters {
        extendedChoice description: '', multiSelectDelimiter: ',', name: 'REPO_NAMES', quoteValue: false, saveJSONParameterToFile: false, type: 'PT_CHECKBOX', value: 'repo1,repo2,repo3', visibleItemCount: 3
    }

    stages {
        stage('Prepare repos to run on') {

            steps { 
                script {  
                    def repo_names = params.REPO_NAMES.split(',')
                    def single_repo_jobs = repo_names.collectEntries {
                        ["${it}" : 
                            {  
                                catchError {                                            
                                        stage(it) {   
                                            build job: 'check-single-repo',
                                                    parameters:
                                                            [                                                    
                                                                    string(name:'REPO_NAME', value: "${it}")
                                                            ] 
                                        }                                            
                                }
                            }                        
                        ]
                    }                    
                    parallel single_repo_jobs        
                }                
            }

        }
    }
}

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