GitLab CI如何仅在特定分支创建新标签时触发作业运行
配置不生效的核心原因
GitLab CI预定义变量有明确的取值规则:标签触发的流水线中,$CI_COMMIT_BRANCH变量值为空,该变量仅会在分支触发的流水线中被赋值。你原配置里的判断条件$CI_COMMIT_TAG && $CI_COMMIT_BRANCH == "CI_merge"永远无法满足,作业自然不会被触发。
正确实现方案
要满足「仅在CI_merge分支上创建新标签时运行作业」的需求,不能直接依赖$CI_COMMIT_BRANCH做判断,需要先匹配标签触发场景,再校验当前标签绑定的提交是否属于CI_merge分支。
可直接使用如下配置:
stages: - shov_server # 原配置stage名含空格,建议修改为无空格格式,避免解析异常 test: stage: shov_server rules: # 仅匹配打新标签触发的流水线 - if: '$CI_COMMIT_TAG' when: on_success tags: - runner before_script: # 拉取目标分支的提交历史,解决浅克隆导致的分支归属判断不准问题 - git fetch origin CI_merge --depth=100 # 校验当前标签对应的提交是否在CI_merge分支上,不满足则直接终止作业 - | if ! git branch --remote --contains $CI_COMMIT_SHA | grep -q "origin/CI_merge"; then echo "标签对应提交不属于CI_merge分支,跳过作业执行" exit 1 fi script: - docker-compose -f docker-compose.yml down - docker-compose -f docker-compose.yml build - docker-compose -f docker-compose.yml up -d
补充说明
- 上述判断逻辑兼容所有打标签场景:不管是本地打标签推送到远端,还是在GitLab界面上给历史提交打标签,只要提交属于CI_merge分支就会正常执行作业
- 如果你的Runner配置了极浅的克隆深度,可适当调大
--depth后面的数值,保证能拉取到对应分支的关联提交 - 不要尝试用
$CI_COMMIT_REF_NAME判断分支,标签触发流水线时,这个变量的取值是标签名,不是分支名
内容的提问来源于stack exchange,提问作者jake
相关产品推荐
相关产品推荐

