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

如何确保GitLab流水线仅在合并时运行、不在标签触发时执行?

解决GitLab CI任务仅在合并到主分支时运行且排除标签触发的问题

我看了你当前的GitLab CI配置,这里有两个关键问题需要修正,才能实现你想要的效果:

  1. 你的rules里的两个条件是逻辑或的关系——只要满足其中一个就会执行任务,这完全不符合你"仅在合并到主分支且无标签时运行"的需求;
  2. 你针对标签的判断写反了,当前的条件会在存在标签时触发任务,和你想要的正好相反。

因为GitLab CI里rules和旧的only/except不能混用,所以我们直接用rules来精确控制执行逻辑就好。下面是调整后的配置:

delete-unstable-tags-on-merge:
  stage: cleanup
  script:
    - # 在这里放你的删除标签脚本
  rules:
    # 仅当满足以下所有条件时才运行:
    # 1. 当前流水线在主分支上运行(如果你的主分支是master就改成master)
    # 2. 提交是合并到主分支的合并提交
    # 3. 没有标签触发流水线
    - if: '$CI_COMMIT_BRANCH == "main" && $CI_COMMIT_MESSAGE =~ /Merge branch .+ into main/ && $CI_COMMIT_TAG == null'
      when: always
    # 其他所有情况都不运行这个任务
    - when: never
  tags:
    - linux

配置细节解释:

  • $CI_COMMIT_BRANCH == "main":确保任务只在主分支的流水线中执行;
  • $CI_COMMIT_MESSAGE =~ /Merge branch .+ into main/:匹配合并到主分支的标准合并提交信息(如果你的团队用了自定义合并信息格式,可以调整这个正则);
  • $CI_COMMIT_TAG == null:标签触发的流水线会自动设置CI_COMMIT_TAG变量,这里判断它为null,就能彻底排除标签触发的情况;
  • 最后一条when: never:兜底规则,确保所有不满足前面条件的场景都不会执行这个任务。

如果你的团队是通过Merge Request合并代码,也可以考虑用$CI_PIPELINE_SOURCE == "push"来进一步限定是合并后的推送触发,但上面的配置已经能覆盖绝大多数场景了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:56:15