web-dev-qa-db-fra.com

Obtenez tous les emplois pipeline dans Jenkins Groovy Script

Je souhaite déclencher plusieurs travaux de pipeline différents, en fonction des paramètres d'entrée d'un travail de contrôleur de pipeline. 

Dans ce travail, je construis les noms des autres pipelines, que je souhaite déclencher à partir d'une liste, renvoyée à partir d'un script 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"   
    }
}

Mon problème est, ce pourrait être le cas, que quelques tâches avec les noms que je reçois de la scène Get_Clusters_to_Build n'existent pas. Par conséquent, ils ne peuvent pas être déclenchés et mon travail échoue.

Maintenant à ma question, y at-il un moyen d'obtenir les noms de tous les travaux en pipeline, et comment puis-je les utiliser pour vérifier si je peux déclencher une construction?

J'ai essayé par jobs = Hudson.instance.getAllItems(AbstractProject.class) mais cela ne me donne que les tâches "normales" de FreeStyleProject.

Je veux faire quelque chose comme ça dans la boucle:

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
6
Igle

Tous les travaux de pipeline sont des instances de org.jenkinsci.plugins.workflow.job.WorkflowJob. Vous pouvez ainsi obtenir les noms de tous les travaux de pipeline en utilisant la fonction suivante

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

Ensuite, vous pouvez l'utiliser de cette façon

//...
def jobs = getPipelineJobNames()
if (job_to_build in jobs) {
    //....
}
10
Vitalii Vitrenko

essayez cette syntaxe pour obtenir des travaux standard et en pipeline:

def jobs = Hudson.instance.getAllItems(hudson.model.Job.class)
2
daggett

Comme @Vitalii Vitrenko a écrit, cela fonctionne très bien

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

2
xxxvodnikxxx