GitLab Pipeline中如何在含reference的规则内添加额外条件?
GitLab CI规则引用添加额外条件的正确配置方法
错误原因
你原配置的问题在于把条件表达式和规则引用写在了同一个规则项里,不符合GitLab CI的规则格式要求:规则数组的每个元素必须是包含if/when等键的哈希对象,或是单独的!reference规则数组引用,不能混合写法。
正确实现方式
方式一:将额外条件合并到原规则的每个判断中
如果需要让原规则的每个条件都同时满足$Environment == "sbx",可以逐个引用原规则的条目,然后覆盖if条件,把额外条件和原条件用&&组合:
.rules:default: rules: - if: $CI_PIPELINE_SOURCE == 'merge_request_event' when: never - if: $CI_COMMIT_REF_NAME == "main" && $VERSION_NUMBER != "current" myjob: stage: myjob script: - echo "I am executing myjob" rules: # 引用原规则的第一条,合并环境条件 - !reference [".rules:default", rules, 0] if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $Environment == "sbx" # 引用原规则的第二条,合并环境条件 - !reference [".rules:default", rules, 1] if: $CI_COMMIT_REF_NAME == "main" && $VERSION_NUMBER != "current" && $Environment == "sbx"
方式二:先做全局环境判断,再应用原规则
如果需求是只有当环境为sbx时,才执行原规则的判断逻辑,可以先添加一条环境校验规则,再引用原规则数组,逻辑更简洁:
.rules:default: rules: - if: $CI_PIPELINE_SOURCE == 'merge_request_event' when: never - if: $CI_COMMIT_REF_NAME == "main" && $VERSION_NUMBER != "current" myjob: stage: myjob script: - echo "I am executing myjob" rules: # 先判断环境,不符合直接跳过 - if: $Environment != "sbx" when: never # 环境符合后,应用原规则的所有判断 - !reference [".rules:default", rules]
这种方式的逻辑是:先检查环境是否为sbx,如果不是则直接终止job执行;如果是,则继续执行原规则的判断逻辑,完全符合你需要的"额外条件+原规则"的组合需求。
内容的提问来源于stack exchange,提问作者LP13
相关产品推荐
相关产品推荐

