如何实现GitLab多rules规则的AND逻辑组合?
解决GitLab CI规则AND组合的方案
要实现平台控制规则和分支规则的AND逻辑,同时避免重复编写规则,可以利用GitLab CI的!reference引用特性,将复用条件抽离为模板片段,再在作业规则中组合成AND条件。
步骤1:抽离复用的条件模板
先把平台变量判断和分支类型判断的表达式单独定义为可引用的片段,避免重复书写:
# 平台条件模板:存储各平台的启用判断表达式 .platform-conditions: pcf: '$PLATFORM_PCF == "true"' k8s: '$PLATFORM_K8S == "true"' # 分支条件模板:存储各分支类型的判断表达式 .branch-conditions: default: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' feature: '$CI_COMMIT_BRANCH =~ /^feature\/.*/'
步骤2:在作业中组合AND规则
在具体作业的rules里,通过!reference调用上述模板的条件,并用&&连接实现AND逻辑。以你的场景为例:
仅默认分支+PCF启用时触发的生产部署作业
deploy-prod-pcf: stage: deploy script: - # 你的PCF生产部署脚本 rules: - if: '!reference [.platform-conditions, pcf] && !reference [.branch-conditions, default]' when: manual # 手动触发 allow_failure: false
仅特性分支+K8S启用时触发的开发部署作业
deploy-dev-k8s: stage: deploy script: - # 你的K8S开发部署脚本 rules: - if: '!reference [.platform-conditions, k8s] && !reference [.branch-conditions, feature]' when: manual allow_failure: true
为什么原来的extends会触发意外作业
你之前用extends同时引入平台规则和分支规则时,GitLab会将两组rules数组合并,数组内的每个规则是OR逻辑判断。比如:
- 平台规则是
if: $PLATFORM_PCF == "true" - 分支规则是
if: $CI_COMMIT_BRANCH =~ /^feature\/.*/
合并后的规则只要满足其中一个条件就会触发作业,所以特性分支下即使未启用PCF,也会触发deploy-prod-pcf。
扩展:多组AND条件的OR组合
如果需要实现「(PCF+默认分支)或者(K8S+特性分支)」这类逻辑,只需在rules数组中添加多个独立的AND规则即可,数组内的规则默认是OR逻辑:
deploy-multi: stage: deploy rules: - if: '!reference [.platform-conditions, pcf] && !reference [.branch-conditions, default]' when: manual - if: '!reference [.platform-conditions, k8s] && !reference [.branch-conditions, feature]' when: manual
内容的提问来源于stack exchange,提问作者xbmono
相关产品推荐
相关产品推荐

