我继承了一些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
设置为全局,但结果相同。
这很可能是由于某些评估顺序或范围界定问题引起的,但我不能对此表示怀疑。
有人可以给我一个线索,为什么它不起作用?如何解决?
答案 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"
,当它们用作条件,因为两个值都不是空字符串:)。