声明性管道-使用when条件,如何做嵌套条件anyOf / allOf / not

Tai*_* Ly 5 jenkins-pipeline jenkins-declarative-pipeline

我被困在如何正确使用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
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,如果我设置env.AUTO_BUILD = false,那么应该执行此阶段,因为它包含在anyOfOR中,如果我的分支是eg develop和,它将执行AUTO_BUILD = true, BUILD_OPT = snapshot
但是,当我设置时情况并非如此AUTO_BUILD = false。该阶段未执行。我想念什么吗?

Mat*_*ard 6

声明条件中有两个问题。首先,看一下:

allOf {
  expression{env.BRANCH_NAME != 'master'}
  expression{env.AUTO_BUILD == true && env.BUILD_OPT == snapshot && env.BRANCH_NAME !=~ /feature.+/} 
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是!=~Groovy中不是“不匹配正则表达式”的有效运算符。您可以这样替换它!(env.BRANCH_NAME =~ /feature/)

allOf {
  expression{env.BRANCH_NAME != 'master'}
  expression{env.AUTO_BUILD == true && env.BUILD_OPT == snapshot && !(env.BRANCH_NAME =~ /feature/)} 
}
Run Code Online (Sandbox Code Playgroud)

实现您想要的行为。

其次,在条件:

expression{env.AUTO_BUILD == false}
Run Code Online (Sandbox Code Playgroud)

该表达式正在检查中的布尔类型env.AUTO_BUILD。如果为该值分配了一个string 'false',则类型检查将失败并且条件语句将无法按预期运行。将环境env.AUTO_BUILD分配输入为布尔值env.AUTO_BUILD = false而不是字符串env.AUTO_BUILD = 'false'将为您解决此问题。