【问题标题】:Jenkins pipeline trigger job and get results available in post operationJenkins 管道触发作业并在后期操作中获得可用的结果
【发布时间】:2021-02-02 09:28:31
【问题描述】:

我有一个带有触发另一个作业的阶段的管道。我想获得触发作业的结果并在后期操作中使用它。我正在这样做:

stage('Stage 1') {
                steps{
                    script {
                        echo "Trigger another job"
                            jobResult = build job:
                            'urltojob',
                                parameters: [
                                    ],
                                    wait: true,
                                    propagate: true;
                    }
                }
                post {
                    always {
                        script {

                            echo jobResult.getResult()
                            echo jobResult.getAbsoluteUrl()
                            echo jobResult.getDurationString()
                            
                        }
                    }
                }
            }

当触发的作业成功时,一切正常,但是当作业失败时,我得到一个错误: 执行总是后置条件时出错: groovy.lang.MissingPropertyException:没有这样的属性:类的jobResult:groovy.lang.Binding 我该如何解决这个问题?

【问题讨论】:

    标签: jenkins jenkins-pipeline jenkins-plugins jenkins-groovy


    【解决方案1】:

    你可以声明一个全局变量并设置它的值,这样你就可以在任何地方访问它。你的问题是jobResult在你post-stage的范围内不存在。

    def result // this is our global variable
    
    pipeline {
    ...
    stage('Stage 1') {
                steps{
                    script {
                        echo "Trigger another job"
                            result = build job:
                            'urltojob',
                                parameters: [
                                    ],
                                    wait: true,
                                    propagate: true;
                    }
                }
                post {
                    always {
                        script {
                            echo result.getResult()
                            echo result.getAbsoluteUrl()
                            echo result.getDurationString()
                            
                        }
                    }
                }
            }
    

    【讨论】:

    • 只适合像我这样不知道应该在哪里声明全局变量的人,全局变量应该在管道{}标签之前声明,而不是直接在stage()之前
    • 是的,你完全正确。也许我应该补充一下,对此感到抱歉
    【解决方案2】:

    如果您只是想获得结果并知道您正在执行的具体工作,您可以通过 jenkins api 获得该信息。

    示例 GET {baseUrl}:{port}/job/{jobName}/job/{branch}/lastBuild/api/json?pretty=true 将返回一个包含大量信息的 jsonobject,其中之一就是结果。

    您也可以对 lastBuild、lastStableBuild、lastSuccessfulBuild、lastFailedBuild、lastUnstableBuild、lastUnsuccessfulBuild、lastCompletedBuild 执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      相关资源
      最近更新 更多