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

GitLab CI/CD规则配置问题:MR中排除指定文件变更时任务异常

问题

需要实现linting_js作业仅在合并请求(MR)中、且未修改my-folder下文件及.gitlab-ci.yml时运行,初始配置如下:

模板作业.test:

.test:
  stage: test
  image: $DOCKER_IMAGE
  rules:
    - if: '$CI_MERGE_REQUEST_APPROVED == "true"'
      when: never
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
    - changes:
      - "my-folder/**/*"
      - ".gitlab-ci.yml"
      when: never
  allow_failure: false

继承模板的linting_js作业:

linting_js:
  extends:
    - .test
  script:
    - yarn install
    - yarn run lint

但实际运行不符合预期:修改my-folder下文件时,作业仍会执行。

调整规则配置后:

.test:
  stage: test
  image: $DOCKER_IMAGE
  rules:
    - if: '$CI_MERGE_REQUEST_APPROVED == "true"'
      when: never
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      changes:
        - ':!.gitlab-ci.yml'
        - ':!my-folder/**/*'
      when: always
  allow_failure: false

新问题出现:修改指定文件时作业不再运行,但修改其他文件或无变更时,流水线卡在“检查流水线”状态无法启动。

解决方案

正确的规则配置

调整.test模板的rules,按优先级顺序匹配条件,确保逻辑符合需求:

.test:
  stage: test
  image: $DOCKER_IMAGE
  rules:
    # MR已批准时,直接跳过作业
    - if: '$CI_MERGE_REQUEST_APPROVED == "true"'
      when: never
    # MR中修改了指定文件时,跳过作业
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      changes:
        - "my-folder/**/*"
        - ".gitlab-ci.yml"
      when: never
    # 其余MR场景(未修改指定文件、无文件变更),运行作业
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      when: always
    # 非MR场景,直接跳过作业
    - when: never

配置说明

  1. 初始配置问题:
    原配置中,changes规则未与CI_PIPELINE_SOURCE == "merge_request_event"绑定,导致规则匹配顺序错乱——只要是MR事件,第二条规则就会先匹配成功,直接运行作业,后续的changes规则不会生效。

  2. 调整后配置问题:
    GitLab CI的changes不支持直接用:!否定模式来表达“未修改指定文件”,尤其是当MR无文件变更时,这种写法会让GitLab无法判断条件是否满足,进而导致流水线卡住。

  3. 正确逻辑的核心:
    按优先级从上到下匹配:先排除已批准的MR,再排除修改了指定文件的MR,最后匹配所有其余MR场景运行作业,非MR场景直接跳过。

内容的提问来源于stack exchange,提问作者french_dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:46:18