我一直坚持如何按照詹金斯语法中的建议正确使用嵌套条件。
https://jenkins.io/doc/book/pipeline/syntax/#when
这是我目前的阶段:
stage('Build'){
when{
anyOf{
allOf{
expression{env.BRANCH_NAME != 'master'}
expression{env.AUTO_BUILD == true && env.BUILD_OPT == snapshot && env.BRANCH_NAME !=~ /feature.+/}
}
expression{env.AUTO_BUILD == false}
}
}
steps{
echo env.AUTO_BUILD
echo env.BUILD_OPT
echo env.BRANCH_NAME
}
根据我的理解,如果我设置了env.AUTO_BUILD = false
,则应该执行此阶段,因为它包含在anyOf
中,否则,如果我的分支是例如,它将执行。 develop
和AUTO_BUILD = true, BUILD_OPT = snapshot
。
但是,当我设置AUTO_BUILD = false
时情况并非如此。该阶段未执行。我想念什么吗?
答案 0 :(得分:2)
声明性条件中有两个问题。首先,请看:
allOf {
expression{env.BRANCH_NAME != 'master'}
expression{env.AUTO_BUILD == true && env.BUILD_OPT == snapshot && env.BRANCH_NAME !=~ /feature.+/}
}
这里的问题是!=~
不是Groovy中“不匹配正则表达式”的有效运算符。您可以像这样用!(env.BRANCH_NAME =~ /feature/)
替换它:
allOf {
expression{env.BRANCH_NAME != 'master'}
expression{env.AUTO_BUILD == true && env.BUILD_OPT == snapshot && !(env.BRANCH_NAME =~ /feature/)}
}
实现您想要的行为。
第二,在条件中:
expression{env.AUTO_BUILD == false}
该表达式正在检查env.AUTO_BUILD
中的布尔类型。如果为该值分配了字符串'false'
,则类型检查将失败,并且条件语句将无法按预期运行。将环境env.AUTO_BUILD
输入为布尔值env.AUTO_BUILD = false
而不是字符串env.AUTO_BUILD = 'false'
可以解决这个问题。