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

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拒绝执行该任务。

解决方案

有两种可选方案:

  1. 取消Runner的受保护设置:进入Runner配置页面,关闭“受保护”开关,使其能处理标签触发的流水线。
  2. 强制设置流水线的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:52:14