声明式管道 - when 条件的使用,如何做嵌套条件 anyOf/allOf/not
Declarative Pipeline - Use of when condition, how to do nested conditions anyOf/allOf/not
我对如何正确使用 Jenkins 语法中建议的嵌套条件感到困惑。
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
时,情况并非如此。该阶段未执行。我错过了什么吗?
声明性条件句中存在两个问题。首先看:
allOf {
expression{env.BRANCH_NAME != 'master'}
expression{env.AUTO_BUILD == true && env.BUILD_OPT == snapshot && env.BRANCH_NAME !=~ /feature.+/}
}
这里的问题是 !=~
不是 Groovy 中 "does not match regular expression" 的有效运算符。您可以像这样用 !(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'
将为您纠正此问题。
我对如何正确使用 Jenkins 语法中建议的嵌套条件感到困惑。
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
时,情况并非如此。该阶段未执行。我错过了什么吗?
声明性条件句中存在两个问题。首先看:
allOf {
expression{env.BRANCH_NAME != 'master'}
expression{env.AUTO_BUILD == true && env.BUILD_OPT == snapshot && env.BRANCH_NAME !=~ /feature.+/}
}
这里的问题是 !=~
不是 Groovy 中 "does not match regular expression" 的有效运算符。您可以像这样用 !(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'
将为您纠正此问题。