如何确保GitLab流水线仅在合并时运行、不在标签触发时执行?
解决GitLab CI任务仅在合并到主分支时运行且排除标签触发的问题
我看了你当前的GitLab CI配置,这里有两个关键问题需要修正,才能实现你想要的效果:
- 你的
rules里的两个条件是逻辑或的关系——只要满足其中一个就会执行任务,这完全不符合你"仅在合并到主分支且无标签时运行"的需求; - 你针对标签的判断写反了,当前的条件会在存在标签时触发任务,和你想要的正好相反。
因为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
相关产品推荐
相关产品推荐

