代码之家  ›  专栏  ›  技术社区  ›  Igl3

在Jenkins Groovy脚本中获取所有管道作业

  •  10
  • Igl3  · 技术社区  · 6 年前

    我想触发几个不同的管道作业,具体取决于控制器管道作业的输入参数。

    在这个作业中,我构建了其他管道的名称,我想从python脚本返回的列表中触发。

    node {
        stage('Get_Clusters_to_Build') {
            copyArtifacts filter: params.file_name_var_mapping, fingerprintArtifacts: true, projectName: 'UpdateConfig', selector: lastSuccessful()
            script {
                cmd_string = 'determine_ci_builds --jobname ' + env.JOB_NAME
                clusters = bat(script: cmd_string, returnStdout: true)
                output_array = clusters.split('\n')
                cluster_array = output_array[2].split(',')
            }
            echo "${clusters}"
        }
    
        jobs = Hudson.instance.getAllItems(AbstractProject.class)
    
        echo "$jobs"
        def builders = [:]
        for (i=0; i<cluster_array.size(); i++) {
            def cluster = cluster_array[i]
            def job_to_build = "BuildCI_${cluster}".trim()
            echo "### branch${i}"
            echo "### ${job_to_build}"
            builders["${job_to_build}"] =
            {
                stage("${job_to_build}") {
                    build "${job_to_build}"
                }
            }
        }
        parallel builders
    
        stage ("TriggerTests") {
            echo "Done"   
        }
    }
    

    我的问题是,可能是这样的,我从舞台上得到的几个名字 Get_Clusters_to_Build 不存在。因此,它们无法触发,而我的作业失败。

    现在我的问题是,有没有办法获取所有管道作业的名称,以及如何使用它们来检查是否可以触发构建?

    我试过了 jobs = Hudson.instance.getAllItems(AbstractProject.class) 但这只给了我“正常”的自由式项目工作。

    我想在循环中这样做:

    def builders = [:]
    for (i=0; i<cluster_array.size(); i++) {
        def cluster = cluster_array[i]
        def job_to_build = "BuildCI_${cluster}".trim()
        echo "### branch${i}"
        echo "### ${job_to_build}"
    
        // This part I only want to be executed if job_to_build is found in the jobs list, somehow like:
        if job_to_build in jobs: // I know, this is not proper groovy syntax
            builders["${job_to_build}"] =
            {
                stage("${job_to_build}") {
                    build "${job_to_build}"
                }
            }
    }
    parallel builders
    
    3 回复  |  直到 6 年前
        1
  •  16
  •   Vitalii Vitrenko    6 年前

    所有管道作业都是的实例 org.jenkinsci.plugins.workflow.job.WorkflowJob . 因此,您可以使用以下函数获取所有管道作业的名称

    @NonCPS
    def getPipelineJobNames() {
        Hudson.instance.getAllItems(org.jenkinsci.plugins.workflow.job.WorkflowJob)*.fullName 
    }
    

    那么你可以这样使用它

    //...
    def jobs = getPipelineJobNames()
    if (job_to_build in jobs) {
        //....
    }
    
        2
  •  5
  •   daggett    6 年前

    尝试以下语法以获取标准作业和管道作业:

    def jobs = Hudson.instance.getAllItems(hudson.model.Job.class)
    
        3
  •  5
  •   Saikat SHASHANK HONRAO    5 年前

    正如@Vitalii Viternko所写的,这很好

    for (job in Hudson.instance.getAllItems(org.jenkinsci.plugins.workflow.job.WorkflowJob)) {
        println job.fullName
    }