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
相关产品推荐
相关产品推荐

