Ich möchte abhängig von den Eingabeparametern eines Controller-Pipeline-Jobs mehrere verschiedene Pipeline-Jobs auslösen.
In diesem Job baue ich die Namen der anderen Pipelines auf, die ich aus einer Liste auslösen möchte, die von einem Python-Skript zurückgegeben wird.
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"
}
}
Mein Problem ist, dass einige Jobs mit den Namen, die ich von der Bühne Get_Clusters_to_Build
bekomme, nicht existieren. Daher können sie nicht ausgelöst werden und mein Job schlägt fehl.
Nun zu meiner Frage: Gibt es eine Möglichkeit, die Namen aller Pipeline-Jobs abzurufen, und wie kann ich mit ihnen prüfen, ob ich einen Build auslösen kann?
Ich habe es bei jobs = Hudson.instance.getAllItems(AbstractProject.class)
versucht, aber das gibt mir nur die "normalen" FreeStyleProject-Jobs.
Ich möchte so etwas in der Schleife machen:
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
Alle Pipeline-Jobs sind Instanzen von org.jenkinsci.plugins.workflow.job.WorkflowJob
. So können Sie die Namen aller Pipeline-Jobs mit der folgenden Funktion abrufen
@NonCPS
def getPipelineJobNames() {
Hudson.instance.getAllItems(org.jenkinsci.plugins.workflow.job.WorkflowJob)*.fullName
}
Dann können Sie es so verwenden
//...
def jobs = getPipelineJobNames()
if (job_to_build in jobs) {
//....
}
versuchen Sie diese Syntax, um Standard- und Pipeline-Jobs zu erhalten:
def jobs = Hudson.instance.getAllItems(hudson.model.Job.class)
Wie @Vitalii Vitrenko schrieb, funktioniert das gut
for(job in Hudson.instance.getAllItems(org.jenkinsci.plugins.workflow.job.WorkflowJob)) {
println job.fullName
}