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_NAMECI_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:.

根本无法满足您的要求

通过使用 gitmain 的分支管道作业上检查 HEAD 以查看是否存在与模式匹配的标签,然后使用 dynamic child pipelines 触发所需的工作流程。

但由于多种原因,这种方法容易出错,更好的方法几乎肯定是重新考虑您的工作流程。