【发布时间】:2017-12-22 11:24:39
【问题描述】:
我想根据控制器管道作业的输入参数触发几个不同的管道作业。
在这项工作中,我构建了其他管道的名称,我想从一个列表中触发,从一个 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) 尝试过,但这只给了我“正常”的 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
【问题讨论】:
-
你可以用
try/catch包围可能的失败块来处理错误情况。作业类型为org.jenkinsci.plugins.workflow.job.WorkflowJob。 -
如果您知道“job_to_build”的名称,您是否尝试过“Hudson.instance.getItemByFullName(job_to_build)”?如果没有这样的项目,那应该返回 null ,从而允许您优雅地跳过该工作......
标签: jenkins groovy jenkins-pipeline