我有以下作业规则:
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_NAME
和CI_COMMIT_TAG
将始终相同。因此,你的规则永远无法评估为真,因为你的规则依赖于它们的不同,而基于上面讨论的属性,这本质上是不可能发生的。
如表所示:
变量 | 分支管道 | 标记管道|
---|---|---|
CI_COMMIT_REF_NAME | 我的分支 | 标记名|
CI_COMMIT_BRANCH | 我的分支 | |
CI_COMMIT_TAG | 标签名称 |