在Jenkins build boolean参数上执行表达式运算在管道中不起作用

时间:2019-10-29 15:08:25

标签: jenkins jenkins-pipeline jenkins-groovy

我继承了一些Jenkins管道并尝试对其进行改进。 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 :(得分:0)

替换

def prefix = CLEAN_FIRST ? "" : "REM"

使用

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

答案 1 :(得分:0)

好的,我发现了问题的根源。有点可笑。

运行此管道时(由于Mac机器具有空的作业队列,因此在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

所以现在从源头来看问题很明显。 Jenkins在配置中承诺类型为Boolean的变量,但实际上为类型String提供的值为"true""false",当它们用作条件,因为两个值都不是空字符串:)。