【问题标题】:Get all pipeline Jobs in Jenkins Groovy Script在 Jenkins Groovy 脚本中获取所有管道作业
【发布时间】: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


【解决方案1】:

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

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

那你就可以这样用了

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

【讨论】:

  • 是否有内置命令可以仅获取某个文件夹中的管道作业?我知道我可以编写代码来过滤它们。
【解决方案2】:

尝试此语法以获得标准和管道作业:

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

【讨论】:

    【解决方案3】:

    正如@Vitalii Vitrenko 所写,一切正常

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

    【讨论】:

    • 请注意,在您的示例中,job 变量应该是 WorkflowJob 的实例。在 OP 示例中,jobString
    • 我收到org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use method hudson.model.ItemGroup getAllItems java.lang.Class
    • @FlorianStraub 是的,基本上 instance.getAllItems 仅可供 jenkins 管理员访问,否则您的脚本需要在全局配置中的 jenkins 管理员的脚本批准中得到批准
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多