Удаление выражения в логическом параметре сборки Jenkins не работает в конвейере - PullRequest
0 голосов
/ 29 октября 2019

Я унаследовал какой-то конвейер Jenkins и пытаюсь его улучшить. Дженкинс и Groovy это довольно свежая тема для меня, так что, скорее всего, я делаю что-то не так. Я использую Jenkins ver. 2.121.3

Основной целью было добавить параметр сборки, чтобы выполнить дополнительную очистку во время сборки. Поэтому я добавил параметр CLEAN_FIRST с логическим типом и значением по умолчанию false в конфигурацию задания и сделал что-то подобное в конвейере:

// CLEAN_FIRST = false
// def prefix = CLEAN_FIRST ? "" : "REM"

pipeline {
    agent none
    stages {
        stage('Some step') {
            steps {
                script {
                    node('master') {
                        cleanWs()
                        try {
                            def prefix = CLEAN_FIRST ? "" : "REM"
                            echo "CLEAN_FIRST=$CLEAN_FIRST prefix=$prefix"
                            bat (label: 'build third party',
                                script: """
                                $prefix call cleanSomthing.bat
                                call doOtherStuff.bat
                                """
                        } finally {
                            echo "some stuff"
                        }
                    } // node
                } // script 
            } // steps
        } // stage
    } // stages
} // pipeline

Теперь это работает не так, как ожидалось. Префикс «REM» не добавляется.

Отпечатки эха:

CLEAN_FIRST=false prefix=

И bat вызывает cleanSomthing.bat, которого я хочу избежать (чтобы сэкономить на времени сборки).

Я пытался сделать prefix глобальным, но с тем же результатом.

Скорее всего, это вызвано каким-то порядком оценки или проблемой с областями видимости, но я не могу указать на это.

Может кто-нибудь подсказать мне, почему это не работает? Как это исправить?


Ответил на собственный вопрос. Исправлена ​​ли эта проблема в какой-то версии Jenkins?

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Хорошо, я нашел источник проблем. Это немного забавно.

При запуске этого конвейера (проверено на компьютере Mac, поскольку у него была пустая очередь заданий):

pipeline {
    agent none
    stages {
        stage('Some step') {
            steps {
                script {
                    node('Mac') {
                        cleanWs()
                        try {
                            def logic = true
                            def prefix = CLEAN_FIRST ? "Ole" : "REM"
                            def typeLogic = logic.getClass()
                            def typeParam = CLEAN_FIRST.getClass()

                            echo "typeLogic=$typeLogic typeParam=$typeParam"
                            echo "CLEAN_FIRST=$CLEAN_FIRST prefix=$prefix"
                            sh (script: """
                            echo prefix=$prefix
                            """)
                        } finally {
                            echo "some stuff"
                        }
                    } // node
                } // script 
            } // steps
        } // stage
    } // stages
} // pipeline

У меня такой результат:

Running in Durability level: MAX_SURVIVABILITY
[Pipeline] stage
[Pipeline] { (Some step)
[Pipeline] script
[Pipeline] {
[Pipeline] node
Running on master in /Users/builder/jenkins/workspace/EIbuild_MacOS
[Pipeline] {
[Pipeline] cleanWs
[WS-CLEANUP] Deleting project workspace...[WS-CLEANUP] done
[Pipeline] echo
typeLogic=class java.lang.Boolean typeParam=class java.lang.String
[Pipeline] echo
CLEAN_FIRST=false prefix=Ole
[Pipeline] sh
[EIbuild_MacOS] Running shell script
+ echo prefix=Ole
prefix=Ole
[Pipeline] echo
some stuff
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] End of Pipeline
Finished: SUCCESS

Так что теперь источник проблемы очевиден. Дженкинс в конфигурации обещает переменную типа Boolean, но фактически предоставляет тип String со значениями "true" или "false", которые всегда оцениваются как true при использовании в качестве условия, так как оба значения не являются пустыми строками :).

0 голосов
/ 29 октября 2019

заменить

def prefix = CLEAN_FIRST ? "" : "REM"

на

def prefix = params.CLEAN_FIRST ? "" : "REM"
...