Jenkins передает значение, вычисленное на этапе, в сценарий оболочки - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь передать объединенную строку сообщений коммита в скрипт оболочки через декларативный конвейер Jenkins.Я могу получить объединенную строку, но не могу понять, как передать ее в мой сценарий оболочки.Переменные окружения доступны для чтения в моем сценарии оболочки, но я не могу установить переменную окружения вне моих этапов, так как на этапе я определяю свое git-соединение, и если я устанавливаю его на этапе, он не обновляет переменную окружения, которую я вызываюв моем разделе поста.Как я могу передать значение changeString моему bash-скрипту (в случае успеха)?

pipeline { 
    agent any 
    environment {
        CHANGE_STRING = 'Initial default value.'
    }
    stages {
        stage('Build') { 
            environment {
                CHANGE_STRING = 'This change is only available in this stage and not in my shell script'
            } 
            steps { 
                echo 'Build stage'
                git branch: 'develop',
                credentialsId: 'blah',
                url: 'blah.git'
                sh """ 
                npm install
                """ 
                script{                   
                    MAX_MSG_LEN = 100
                    def changeString = ""

                    def changeLogSets = currentBuild.changeSets
                    for (int i = 0; i < changeLogSets.size(); i++) {
                        def entries = changeLogSets[i].items
                        for (int j = 0; j < entries.length; j++) {
                            def entry = entries[j]
                            truncated_msg = entry.msg.take(MAX_MSG_LEN)
                            changeString += " - ${truncated_msg} [${entry.author}]\n"
                        }
                    }

                    if (!changeString) {
                        changeString = " - No new changes"
                    }
                    //I would like to set CHANGE_STRING here
                }
            }
        }
    }
    post {
        success {
            echo 'Successfull build'
            sh """ 
            bash /var/lib/jenkins/jobs/my-project/hooks/onsuccess
            """ 
        }
    }
}

1 Ответ

0 голосов
/ 09 июня 2018

Если вы хотите экспортировать переменную среды с шага script и получить доступ к ней вне текущего этапа, вы должны использовать имя переменной, которое не было указано в глобальном или локальном блоке environment {}.Рассмотрим следующий пример:

pipeline { 
    agent any 
    environment {
        IMMUTABLE_VARIABLE = 'my value'
    }
    stages {
        stage('Build') { 
            steps { 
                script{                   
                    def random = new Random()
                    if (random.nextInt(2) == 1) {
                        env.CHANGE_STRING = "Lorem ipsum dolor sit amet"
                    } else {
                        env.CHANGE_STRING = "Foo Bar"
                    }

                    env.IMMUTABLE_VARIABLE = 'a new value'

                    echo "IMMUTABLE_VARIABLE = ${env.IMMUTABLE_VARIABLE}"
                }
            }
        }
    }
    post {
        success {
            echo 'Successfull build'
            sh '''
            echo $CHANGE_STRING
            echo "IMMUTABLE_VARIABLE = $IMMUTABLE_VARIABLE"
            '''
        }
    }
}

Это просто упрощение вашего конвейерного скрипта.Когда я запускаю его, я вижу следующий вывод консоли:

[Pipeline] node
Running on Jenkins in /var/jenkins_home/workspace/test-pipeline
[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Build)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
IMMUTABLE_VARIABLE = my value
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Declarative: Post Actions)
[Pipeline] echo
Successfull build
[Pipeline] sh
[test-pipeline] Running shell script
+ echo Foo Bar
Foo Bar
+ echo IMMUTABLE_VARIABLE = my value
IMMUTABLE_VARIABLE = my value
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

Сценарий оболочки в блоке post success печатает Foo Bar в первой строке и IMMUTABLE_VARIABLE = my value во второй.Также обратите внимание, что хотя я явно пытался переопределить

env.IMMUTABLE_VARIABLE = 'a new value'

, он не дал никакого эффекта, а когда я сделал

echo "IMMUTABLE_VARIABLE = ${env.IMMUTABLE_VARIABLE}"

, он просто повторил начальное значение из environment {}блок:

IMMUTABLE_VARIABLE = my value

Надеюсь, это поможет.

...