CI 作业规则仅在存在标签时在 main 上执行
CI job rule to only execute over main when the tag is present
我有以下工作规则:
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
变量是 EITHER 分支名称 OR 标签。
因此,如果您希望 CI_COMMIT_TAG
出现,CI_COMMIT_REF_NAME
和 CI_COMMIT_TAG
将 始终 相同。因此,您的规则永远无法评估为真,因为您的规则依赖于它们的不同,而根据上面讨论的属性,这本质上永远不会发生。
图文并茂table:
Variable
Branch pipelines
Tag Pipelines
CI_COMMIT_REF_NAME
my-branch
tag-name
CI_COMMIT_BRANCH
my-branch
CI_COMMIT_TAG
tag-name
使用 rules:
.
根本无法满足您的要求
通过使用 git
在 main
的分支管道作业上检查 HEAD 以查看是否存在与模式匹配的标签,然后使用 dynamic child pipelines 触发所需的工作流程。
但由于多种原因,这种方法容易出错,更好的方法几乎肯定是重新考虑您的工作流程。
我有以下工作规则:
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
变量是 EITHER 分支名称 OR 标签。
因此,如果您希望 CI_COMMIT_TAG
出现,CI_COMMIT_REF_NAME
和 CI_COMMIT_TAG
将 始终 相同。因此,您的规则永远无法评估为真,因为您的规则依赖于它们的不同,而根据上面讨论的属性,这本质上永远不会发生。
图文并茂table:
Variable | Branch pipelines | Tag Pipelines |
---|---|---|
CI_COMMIT_REF_NAME | my-branch | tag-name |
CI_COMMIT_BRANCH | my-branch | |
CI_COMMIT_TAG | tag-name |
使用 rules:
.
通过使用 git
在 main
的分支管道作业上检查 HEAD 以查看是否存在与模式匹配的标签,然后使用 dynamic child pipelines 触发所需的工作流程。
但由于多种原因,这种方法容易出错,更好的方法几乎肯定是重新考虑您的工作流程。