2017-12-22 35 views
4

コントローラパイプラインジョブの入力パラメータに応じて、いくつかの異なるパイプラインジョブをトリガーしたい。Jenkins Groovyスクリプトのすべてのパイプラインジョブを取得する

この仕事の中で、私はパイソンスクリプトから返されたリストからトリガーしたい他のパイプラインの名前をビルドします。

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)で試しましたが、これは私に "普通の" FreeStyleProject-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}" 

    // 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 
+0

可能な失敗ブロックを 'try/catch'で囲んでエラーケースを処理することができます。ジョブの種類は['org.jenkinsci.plugins.workflow.job.WorkflowJob'](https://github.com/jenkinsci/workflow-job-plugin/blob/master/src/main/java/org/jenkinsci/)です。プラグイン/ワークフロー/ジョブ/ WorkflowJob.java)。 – mkobit

+1

'job_to_build'の名前を知っていたら、'Hudson.instance.getItemByFullName(job_to_build) 'を試しましたか?そのような項目がない場合、nullを返す必要があります。したがって、あなたは正常にそのジョブをスキップすることができます... – tom

答えて

2

すべてのパイプラインの仕事はorg.jenkinsci.plugins.workflow.job.WorkflowJobのinstantcesです。ですから、次に

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

は、あなたがそれをこのよう

//... 
def jobs = getPipelineJobNames() 
if (job_to_build in jobs) { 
    //.... 
} 
0

は、標準およびパイプラインの仕事を得るために、この構文を試してみてください。

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

@Vitalii Vitrenkoが書いたように使用することができ、次の機能を使用して、すべてのパイプラインジョブの名前を取得することができ、それが正常に動作している

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

+1

あなたの例では、 'job'変数は' WorkflowJob'のインスタンスである必要があることに注意してください。 OPの例では 'job'は' String'です –