我使用以下简单的管道(
.gitlab-ci.yml
):
workflow:
rules:
- if: $CI_COMMIT_TAG =~ /^v?(\d+(\.\d+)*)$/
build:
tags:
- my-tag
script:
- echo "Hello"
我希望它在提交获得像
v1.0
这样的标签时立即执行。我的项目可以接触到活跃的团体跑步者。跑步者受到保护。跑步者带有 my-tag
标记。当我用 v1.0
标记受保护分支上的提交时,管道启动,但作业立即卡住并出现以下错误:
由于以下问题之一,该作业陷入困境。在线没有活跃的跑步者,没有受保护分支的跑步者,或者没有与所有作业标签匹配的跑步者:my-tag
转到项目 CI 设置
如果我将管道更改为:
workflow:
rules:
- if: '"1" == "1"'
build:
tags:
- my-tag
script:
- echo "Hello"
它在每次提交时都成功运行。这就是为什么我认为它与错误消息所建议的运行器配置无关。
当我在规则中使用
$CI_COMMIT_TAG
时,有什么问题?
我使用的是 GitLab 16.9.1 和 GitLab Runner 16.9.1。
评估
$CI_COMMIT_TAG
时,管道变为 tag 管道,而不是 branch 管道。标签不知道它“所属”的分支。因此,启动的管道不属于受保护的上下文,并且不能在受保护的运行器上执行。
要解决这个问题,您也可以保护您的标签(来源):
配置受保护标签
先决条件:
- 您必须至少具有该项目的维护者角色。
- 在左侧边栏上,选择搜索或转到并找到您的项目。
- 选择设置 > 存储库。
- 展开受保护的标签。
- 选择添加新。
- 要保护单个标签,请选择标签,然后从下拉列表中选择您的标签。
- 要保护名称与字符串匹配的所有标签:
- 选择标签。
- 输入用于标签匹配的字符串。支持通配符 (*)。
- 选择创建通配符。
- 在允许创建中,选择可以创建受保护标签的角色。
- 选择保护。
受保护的标签(或通配符)显示在受保护的标签列表中。