声明式管道 - 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 中,或者如果我的分支是例如developAUTO_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' 将为您纠正此问题。