使用声明性管道在不同的存储库上并行运行相同的Jenkins作业

时间:2020-06-10 20:12:52

标签: jenkins jenkins-pipeline jenkins-job-dsl jenkins-declarative-pipeline

我的目标是在多个存储库上并行运行同一作业check-single-repo

下面的管道似乎没有达到目标:

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

        }
    }
} 

其输出:

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

由于它仅调用#230上的一个管道repo3

如何使用声明性管道在不同的存储库上并行运行同一Jenkins作业?

1 个答案:

答案 0 :(得分:0)

在遵循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        
                }                
            }

        }
    }
}