只有当标记存在时才在main上执行的CI作业规则



我有以下作业规则:

rules:
- if: '$CI_COMMIT_REF_NAME == "main" && $CI_COMMIT_TAG =~ /^v[0-9](?:.[0-9]){2,3}/'
when: on_success

我想要的是只有当更改为main以推送(直接或通过MR(并且tag与模式匹配时才执行此作业。

但我已经尝试了所有的方法,但这份工作从未执行过。这是我提交的流程

git tag -a v0.0.2 -m "Adding version"
git push origin dev # and merge to main, or directly
git push origin main

我的理解是,上面是通过指定标记的main提交的,应该触发此作业,但它不是。

知道我做错了什么吗?

简而言之:这是不可能的。您不能在推送时匹配这两个条件,因为正如注释中所述,标签与分支没有关系。这是一个植根于git的概念,而不是GitLab可以控制的。

当您推送标记时,没有对任何分支的引用。它指向提交。该提交可能存在于一个分支、多个分支,甚至根本没有分支。当你标记提交并推送标记时,你当前的工作分支是什么并不重要。没有与推送标记相关的分支信息。

这就是为什么分支管道与标记管道分离的部分原因,也是为什么CI_COMMIT_BRANCH变量不存在于标记管道上,而CI_COMMIT_TAG不存在于分支管道上的部分原因。这也是为什么CI_COMMIT_REF_NAME变量是或者分支名称标记。

因此,如果您希望CI_COMMIT_TAG在场,则CI_COMMIT_REF_NAMECI_COMMIT_TAG将始终相同。因此,你的规则永远无法评估为真,因为你的规则依赖于它们的不同,而基于上面讨论的属性,这本质上是不可能发生的。

如表所示:

标记管道标记名
变量 分支管道
CI_COMMIT_REF_NAME 我的分支
CI_COMMIT_BRANCH 我的分支
CI_COMMIT_TAG 标签名称

最新更新