GitLab流水线使用$CI_COMMIT_TAG规则时任务停滞问题排查
问题描述
我使用如下.gitlab-ci.yml配置,期望在提交被打上v1.0这类标签时触发流水线:
workflow: rules: - if: $CI_COMMIT_TAG =~ /^v?(\d+(\.\d+)*)$/ build: tags: - my-tag script: - echo "Hello"
我的项目有一个活跃的组Runner,该Runner已设为受保护且带有my-tag标签。当我给受保护分支的提交打上v1.0标签后,流水线启动但任务立即停滞,报错:
此任务停滞,原因可能为:无在线活跃Runner、无适配受保护分支的Runner,或无匹配任务所有标签(my-tag)的Runner
前往项目CI设置
但如果把流水线改为以下配置,每次提交都能成功运行:
workflow: rules: - if: '"1" == "1"' build: tags: - my-tag script: - echo "Hello"
显然Runner配置本身没问题,请问用$CI_COMMIT_TAG规则触发时出现这个问题的原因是什么?我使用的是GitLab 16.9.1和GitLab Runner 16.9.1版本。
原因分析
问题核心在于受保护Runner的匹配逻辑:
- 受保护Runner的限制是:仅能处理
CI_COMMIT_REF_PROTECTED变量为true的流水线。 - 分支提交触发流水线时,若分支是受保护的,
CI_COMMIT_REF_PROTECTED会被设为true,因此能匹配到受保护Runner。 - 但标签触发流水线时,GitLab中标签本身没有“受保护”属性——无论标签打在哪个分支的提交上,
CI_COMMIT_REF_PROTECTED都会被设为false,直接导致受保护Runner拒绝执行该任务。
解决方案
有两种可选方案:
- 取消Runner的受保护设置:进入Runner配置页面,关闭“受保护”开关,使其能处理标签触发的流水线。
- 强制设置流水线的
CI_COMMIT_REF_PROTECTED变量:在workflow中添加变量配置,强制将该变量设为true,让受保护Runner识别为合法任务:
workflow: rules: - if: $CI_COMMIT_TAG =~ /^v?(\d+(\.\d+)*)$/ variables: CI_COMMIT_REF_PROTECTED: "true" build: tags: - my-tag script: - echo "Hello"
注意:第二种方案需确保标签均基于受保护分支的合法发布提交,避免安全风险。
内容的提问来源于stack exchange,提问作者stackprotector
相关产品推荐
相关产品推荐

