You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 23:12:31