GitLab CI如何根据rules匹配的if条件执行对应script脚本
回答
GitLab CI完全支持按if条件匹配执行对应脚本的需求,你当前的配置存在语法错误,无法实现预期效果。
现有配置的错误点
同一个Job的YAML配置中不允许重复定义同名字段,你写的tor任务里重复定义了2次rules、3次script,YAML解析时只会保留最后一次定义的同名字段值,最终任务只会执行最后写的echo "No conditions matched!",前面的规则和脚本全部会被覆盖失效。
可落地的实现方案
方案1:单Job内通过Shell条件分支执行对应逻辑
适合不同场景下脚本差异不大的场景,先用rules控制Job的触发范围,再在脚本段通过Shell判断CI内置变量,走对应逻辑:
tor: stage: build image: docker:doo19 services: - docker:doo19 before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY rules: # 规则按从上到下优先级匹配,命中即停止判断 - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_TAG' changes: - backend/exporter/**/* when: on_success - if: '$CI_MERGE_REQUEST_IID' changes: - backend/exporter/**/* when: on_success # 不需要兜底运行就保留下面这行,需要兜底就删掉 - when: never script: - | if [ "$CI_COMMIT_BRANCH" = "$CI_DEFAULT_BRANCH" ] || [ -n "$CI_COMMIT_TAG" ]; then cd backend/exporter echo "Merged to master" elif [ -n "$CI_MERGE_REQUEST_IID" ]; then echo "It's a merge request" else echo "No conditions matched!" fi
方案2:拆分多个互斥Job
适合不同场景下脚本依赖、执行逻辑差异很大的场景,拆成多个独立Job,通过rules保证同一流水线中只有匹配对应条件的Job会运行:
.tor_base: stage: build image: docker:doo19 services: - docker:doo19 before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY tor:default_branch: extends: .tor_base rules: - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_TAG' changes: - backend/exporter/**/* when: on_success - when: never script: - cd backend/exporter - echo "Merged to master" tor:merge_request: extends: .tor_base rules: - if: '$CI_MERGE_REQUEST_IID' changes: - backend/exporter/**/* when: on_success - when: never script: - echo "It's a merge request" tor:fallback: extends: .tor_base rules: - if: '$CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && -z "$CI_COMMIT_TAG" && -z "$CI_MERGE_REQUEST_IID"' changes: - backend/exporter/**/* when: on_success - when: never script: - echo "No conditions matched!"
这里用了YAML的extends语法复用公共配置,避免重复写相同的image、before_script等内容。
配置注意事项
rules的匹配是严格从上到下执行的,匹配到第一个符合条件的规则就不会再往下判断,要把约束更严格、优先级更高的规则写在前面- 写
if判断条件时建议给整个条件字符串加单引号,避免YAML误解析||、==这类特殊字符 - Shell中判断变量是否非空要用
-n "$VAR",判断字符串相等建议用单等号=,兼容POSIX标准Shell
内容的提问来源于stack exchange,提问作者Praneeth T T
相关产品推荐
相关产品推荐

