Значение, возвращаемое из скрипта, не присваивается переменной, объявленной на этапе декларативного конвейера jenkins.

Я работаю над добавлением декларативного конвейера jenkins для автоматического тестирования. На этапе тестового запуска я хочу извлечь неудачные тесты из журнала. я использую groovy функцию для извлечения результата теста. эта функция не является частью конвейера jenkins. Это другой файл сценария. Функция работает нормально и создает строку, содержащую сведения об ошибке. Внутри этапа конвейера я вызываю эту функцию и присваиваю возвращаемую строку другой переменной. Но когда я повторяю значение переменной, он печатает пустую строку.

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}'
                }
        }
    }
}

здесь 'sh 'echo ${result}'' напечатайте пустую строку. Но 'extractTestResult()' возвращает непустую строку.

Также я не могу использовать переменную окружения 'failure_msg' в разделе сообщения, она возвращает ошибку 'groovy.lang.MissingPropertyException: нет такого свойства: failure_msg для класса: groovy.lang.Binding'

может ли кто-нибудь помочь мне с этим?

РЕДАКТИРОВАТЬ:

Даже после того, как я исправил интерполяцию строк, я получал ту же ошибку. Это произошло потому, что jenkins не позволяет использовать «sh» внутри контейнера докеров. на доске вопросов jenkins есть открытый тикет об ошибке


person SruthiChedath    schedule 21.11.2019    source источник
comment
Не могли бы вы попробовать, если ваша проблема исчезнет, ​​если вы используете правильную интерполяцию строк (jenkins .io/doc/book/pipeline/jenkinsfile/#string-interpolation) в вашей команде sh. Попробуйте: ш ${failure_msg}   -  person Michael Kemmerzell    schedule 21.11.2019
comment
Другая проблема может заключаться в том, что переменная не существует в области действия после этапа, поскольку она была объявлена ​​в области действия блока шагов.   -  person Michael Kemmerzell    schedule 21.11.2019
comment
Согласен с @mkemmerz. Это неправильная интерполяция строк. Кроме того, failure_msg здесь устанавливается не как переменная среды, а как глобальная переменная Groovy. Разница в том, что переменные среды (env.failure_msg) доступны для вложенных оболочек, вызываемых сценарием конвейера, тогда как глобальные переменные Groovy недоступны. При использовании двойных кавычек с sh именно Groovy интерполирует переменную, а не оболочка.   -  person Dibakar Aditya    schedule 21.11.2019


Ответы (1)


Я бы предложил использовать глобальную переменную для хранения сообщения об ошибке. Я предполагаю, что переменная не существует в вашей области.

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
                }
        }
    }
}

(Аналогичный вопрос SO можно найти здесь)

person Michael Kemmerzell    schedule 21.11.2019