Value returned from a script does not assigned to a variable declared in jenkins declarative pipeline stage

被刻印的时光 ゝ 提交于 2019-12-13 07:48:19

问题


I am working on adding a jenkins Declarative pipeline for automation testing. In the test run stage i want to extract the failed tests from the log. i am using a groovy function for extracting the test result. this function is not a part of the jenkins pipeline. It is another script file. The function works fine and it build a string containing the failure details. Inside a pipeline stage i am calling this function and assinging the returned string to another variable. But when i echo the variable value it prints empty string.

pipeline {
    agent {
        kubernetes {
            yamlFile 'kubernetesPod.yml'
        }
    }
    environment{
        failure_msg = ""
    }
    stages {
        stage('Run Test') {
            steps {
                container('ansible') {
                    script {
                        def notify = load('src/TestResult.groovy')
                        def result = notify.extractTestResult("${WORKSPACE}/testreport.xml")
                        sh "${result}"
                        if (result != "") {
                            failure_msg = failure_msg + result
                        }
                    }

                }  
            }
        }
    post {
        always {
            script {
                sh 'echo Failure message.............${failure_msg}'
                }
        }
    }
}

here 'sh 'echo ${result}'' print empty string. But 'extractTestResult()' returns a non-empty string.

Also i am not able to use the environment variable 'failure_msg' in post section it return an error 'groovy.lang.MissingPropertyException: No such property: failure_msg for class: groovy.lang.Binding'

can anyone please help me with this ?

EDIT:

Even after i fixed the string interpolation, i was getting the same error. That was because jenkins does not allow using 'sh' inside docker container. there is an open bug ticket in jenkins issue board


回答1:


I would suggest to use a global variable for holding the error message. My guess is that the variable is not existing in your scope.

def FAILURE_MSG // Global Variable

pipeline {
    ...
    stages {
        stage(...
            steps {
                container('ansible') {
                    script {
                        ...
                        if (result != "") {
                            FAILURE_MSG = FAILURE_MSG + result
                        }
                    }    
                }  
            }
        }
    post {
        always {
            script {
                sh "${FAILURE_MSG}" // Hint: Use correct String Interpolation
                }
        }
    }
}

(Similar SO question can be found here)



来源:https://stackoverflow.com/questions/58972250/value-returned-from-a-script-does-not-assigned-to-a-variable-declared-in-jenkins

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!