Декларативный конвейер - использование условия когда, как делать вложенные условия anyOf/allOf/not

Я застрял в том, как правильно использовать вложенные условия, как предложено в синтаксисе Дженкинса.

https://jenkins.io/doc/book/pipeline/syntax/

Это мой текущий этап:

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, Этап не был выполнен. Я что-то пропустил?

1 ответ

Решение

Здесь есть две проблемы в декларативных условных выражениях. Сначала посмотрим на:

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' исправит это для вас.

Другие вопросы по тегам