You need to enable JavaScript to run this app. GitLab CI 推送到master时测试任务重复运行的问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

GitLab CI 推送到master时测试任务重复运行的问题咨询

重复运行的原因

你当前用的旧版only规则是「满足任意一个条件就跑test」:只要是合并请求管道、或者只要是master分支的推送,就触发测试。当两类场景同时命中同一个推送操作时(比如直接推master的同时,刚好触发了源分支为master的MR更新管道),test就会跑两次,白白消耗免费额度。

修改方案

用GitLab官方现在推荐的rules语法替代旧版only/except,可实现两类触发场景完全互斥,免费套餐原生支持,不需要额外付费。
两个规则的触发条件完全互斥,同一个管道不可能同时满足CI_PIPELINE_SOURCE == "merge_request_event"和CI_PIPELINE_SOURCE == "push",因此不会出现重复运行test的情况。
匹配你「仅在目标为master的MR、或master分支推送时跑测试」的需求,修改后的配置如下:

stages:
  - test
  - deploy

test:
  stage: test
  rules:
    # 目标分支为master的合并请求管道,执行测试
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"'
    # 普通推送至master分支的管道,执行测试
    - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "master"'
  script:
    - jest --coverage

deploy:
  stage: deploy
  rules:
    # 仅普通推送至master分支的管道,执行部署
    - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "master"'
  dependencies:
    - test
  script:
    - make deploy
可选省额度优化

如果不需要在MR合并时重复跑MR侧的测试,仅在合并后的master分支跑测试即可,可以调整test的rules,排除已合并的MR场景:

test:
  stage: test
  rules:
    # 仅打开状态、目标为master的MR执行测试
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" && $CI_MERGE_REQUEST_STATE == "opened"'
    # 推送至master的管道执行测试
    - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "master"'
  script:
    - jest --coverage

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 10:15:04