如何在Azure管道中获取Git标记

Muh*_*eed 6 git git-tag azure-devops azure-pipelines

在Azure Pipelines中,我启用了git标签来触发管道,如下所示:

trigger:
  branches:
    include:
    - '*'
  tags:
    include:
    - '*'
Run Code Online (Sandbox Code Playgroud)

现在,我想知道是否有一种方法可以通过编程确定:

  1. 管道是从git commit还是git标签开始的?
  2. 如果管道是从git标签启动的,标签名称是什么?

Ale*_*ski 17

要检查提交是否来自标签,请使用:

startsWith(variables['Build.SourceBranch'], 'refs/tags/')
Run Code Online (Sandbox Code Playgroud)

詹姆斯·瑟利:

使用以下命令获取标签名称:

$tags = git tag --sort=-creatordate
$tag = $tags[0]
Run Code Online (Sandbox Code Playgroud)

这会为带注释和未注释的标签正确排序标签,因此第一个结果是最近的标签。

我已经删除了原始答案,并用 James Thurley 的正确答案替换了它。我会删除我的答案,但您似乎无法删除已接受的答案。

  • 这依赖于标签的正确排序,并且可能不会为您提供实际触发构建的标签的名称。 (2认同)

Mar*_*ers 8

git describe可以为您提供给定 git 哈希的(最接近的)标签名称,Azure 可以为您提供当前哈希$(Build.SourceVersion)

使用--exact-matchto 限制git describe只使用来自特定提交的标签:

git describe --exact-match $(Build.SourceVersion)
Run Code Online (Sandbox Code Playgroud)

如果有标签,它将在标准输出上返回:

$ git describe --exact-match d9df242
v1.0.0
Run Code Online (Sandbox Code Playgroud)

如果没有标签,git describe --exact-match则以退出代码 128 退出:

$ git describe --exact-match cc1f9d2
fatal: no tag exactly matches 'cc1f9d23854c37dec000485c6c4009634516a148'
$ echo $?
128
Run Code Online (Sandbox Code Playgroud)

因此,您可以在测试中使用它,或者只是让管道中的任务失败,而不仅仅是在标记的修订上触发。


Jam*_*ley 7

接受的答案 usinggit tag -l v*对我不起作用,因为它没有正确订购标签,而是给1.1, 1.11, 1.12, 1.2, 1.3, etc.

我发现这样做更好:

$tags = git tag --sort=-creatordate
$tag = $tags[0]
Run Code Online (Sandbox Code Playgroud)

这会为带注释和未注释的标签正确排序标签,因此第一个结果是最近的标签。


Mar*_*ell 6

此处的其他答案涵盖了问题的第一部分,因此正如 Alex Kaszynski 已经指出的那样,您可以使用 YAML 条件:

startsWith(variables['Build.SourceBranch'], 'refs/tags/')
Run Code Online (Sandbox Code Playgroud)

现在获取标签名称比提出问题时要容易一些:

Build.SourceBranchName
Run Code Online (Sandbox Code Playgroud)

此变量包含最后一个 git ref 路径段,因此例如,如果标签为refs/tags/1.0.2,则此变量将包含1.0.2: 标签名称。

完整的文档现在在这里