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

GitLab CI配置为仅在master运行的job推送新tag时被触发是什么原因

问题原因分析
  • 首先是GitLab CI rules的默认逻辑:你配置的两条rule属于平行的或关系,只要任意一条rule的条件满足,且没有显式设置when: never,job就会被触发。你原本预期的是「同时满足分支为master+文件变更匹配」才触发,但分开写两条rule实际变成了「分支为master,或者文件变更匹配,任意满足一个就触发」。
  • 其次是changes规则的特殊判定逻辑:当流水线是由tag推送触发时,GitLab无法获取到该提交对应的完整分支变更对比上下文,此时changes规则会默认判定为匹配成功。
  • 最后是多流水线触发逻辑:执行git push --atomic origin <分支名> <tag名>命令时,GitLab会同时生成两条独立流水线:一条对应你推送的目标分支的分支流水线,另一条对应你推送的tag的标签流水线。标签流水线中,虽然$CI_COMMIT_REF_NAME == $BUILD_BRANCH的条件不满足,但changes规则默认判定通过,匹配到了第二条rule,因此job会被触发。
修复方案

如果要实现「仅master分支有指定文件变更时才触发job」的预期逻辑,调整rules配置,将两个条件放在同一条rule下即可(同一条rule下的多个条件是与关系):

rules:
  - if: '$CI_COMMIT_REF_NAME == $BUILD_BRANCH'
    changes:
      - /*.{py, html, css, yml, json}

如果需要额外排除所有tag流水线的触发可能,可以额外增加tag判断:

rules:
  - if: '$CI_COMMIT_REF_NAME == $BUILD_BRANCH && $CI_COMMIT_TAG == null'
    changes:
      - /*.{py, html, css, yml, json}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:24:03