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

时间:2018-12-13 14:27:55

标签: jenkins-pipeline jenkins-declarative-pipeline

我一直坚持如何按照詹金斯语法中的建议正确使用嵌套条件。

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时情况并非如此。该阶段未执行。我想念什么吗?

1 个答案:

答案 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'可以解决这个问题。