如何在TeamCity中构建git标签?

58

我希望向TeamCity服务器提供一个git标签以进行构建。 我将标签(例如release_1.1)作为参数传递给作业。因此,在作业内部,标签可用作%tag%,但在版本控制设置下,我看不到任何使用此参数的方法,以便服务器可以检出此标签。 是否有任何方法可以在设置中使用此参数以检出标签?


我遇到了类似的问题 - 将“分支名称”设置为“refs/tags/%TagToBuild%”时出现以下错误:无法收集更改,错误信息:jetbrains/buildServer/buildTriggers/vcs/VcsRootChangesLoader.loadChanges 的 @NotNull 参数的参数2不应为空 - Zhaph - Ben Duguid
4个回答

77
  1. 进入编辑配置设置 -> 版本控制设置
  2. 点击此构建配置的所有VCS根后,点击“编辑”,然后:

    1. 将“+:refs/tags/*”放入分支规范文本框中
    2. 勾选“使用标签作为分支”

然后,当您按下运行旁边的“…”按钮时,您将能够选择一个标签。


在我看来,这绝对是最干净、最本地化的方法。标签可用,通过自定义运行对话框也可以使用分支。不需要任何自定义变量。然后,您可以像正常情况下一样使用分支规范来处理构建配置的所有其他方面。 - user514005
1
我认为这似乎是构建标签最干净的方式。需要注意的是,必须进行自定义构建才能选择标签。 - Rias
1
在按“运行”之前,请等待30秒并刷新您的TeamCity页面。 - Maxim Eliseev
4
不确定我是否理解了这一步骤,TeamCity默认构建主分支,我没有得到任何提示来选择标签:http://i.imgur.com/CnT8XBN.png 我使用的是TeamCity Enterprise 9.1.3。 - zengr
1
好的,所以我必须进入TeamCity的项目页面,然后点击“运行”按钮右侧的小菜单“...”图标。这会弹出一个对话框,其中包含4个选项卡。第二个选项卡是“更改”,在那里您可以在“构建分支”下拉菜单中指定要构建的标签。我正在使用TeamCity版本Enterprise 9.1.5(构建37377)。 - Jeremy
显示剩余2条评论

18

我已经成功实现了以下内容:

在“构建配置”下的 “构建参数” 中:

定义一个配置参数:

  • 名称:TagToBuild
  • 类型:配置参数
  • 值:
  • 规格:
    • 标签:需要构建的标签
    • 描述:这应该是标签的完整路径,即refs/tags/0.5.5
    • 显示:提示
    • 类型:文本

请注意,“value”字段被故意留空。

然后,在VCS根目录中:

  • 分支名称: % TagToBuild%

当我运行构建时,会提示我提供一个分支/标签名称: Configuration Parameters

输入像refs/tags/0.5.0这样的值会导致一个不错的构建,其中分支名称列在结果中: Successful builds

如果您试图以任何方式帮助用户除了描述,似乎都会失败。 因此,你不能做以下任何一种情况:

  1. 在配置参数中将“值”设置为refs/tags/,并让用户添加标签名。
  2. 在VCS根目录中将“分支名称”设置为refs/tags/%TagToBuild%

对于我们略旧的(7.1)Team City实例上的两种情况,我得到了以下错误:

Failed to collect changes, error: Argument 2 for @NotNull parameter of jetbrains/buildServer/buildTriggers/vcs/VcsRootChangesLoader.loadChanges must not be null


4
创建名为 teamcity.build.branch 的参数,即可覆盖分支名称,这样您就可以覆盖分支并将其设置为任何您想要的名称,例如 release。请注意,此处不能更改原意,并需要保留内容的简洁性和易读性。 - js3dev
1
虽然这不完全是我的情况,但你的回答给了我一个提示,帮助我解决了我已经苦苦挣扎了几天的问题!我希望我能给它点赞两次。非常感谢! - Yan Sklyarenko
2
使用较新版本的TeamCity(例如我们正在使用9.1.5),现在可以将VCS根目录的“默认分支”设置为类似于refs/tags/%versionRoot%的内容,这比每次输入完整路径要干净一些。 - gezzahead

5

我没有使用标签来实现这个功能,但是使用了分支。我告诉TeamCity通过指定+:refs/heads/*来构建所有分支。现在,每当我推送一个分支,TeamCity就会对其进行构建。然后,在构建中,我使用git branch命令并查找以*开头的行。我将该分支名称嵌入到一个方便的位置(例如.NET的AssemblyInfo.cs文件,node的package.json文件)。请参见http://confluence.jetbrains.com/display/TCD8/Working+with+Feature+Branches


1
但这仍然是构建所有内容。我认为js3dev正在寻找的(我也知道)是一种用易于识别的标记标记存储库中的某个点并进行构建的方法 - 我的某些工具将为不同的环境创建不同版本的.config文件,但只有当我通过QA时才想要构建“发布”版本,但是由于某些原因,头可能已经移动了。 - Zhaph - Ben Duguid
通常当我有这个需求时,我会创建一个新的分支——例如Releasev2.7——并推送该分支。TeamCity的“构建所有分支”会捕捉到它并运行。 - robrich

4

您需要在refs/tags/${tagName}中指定标签格式。

因此,您的标签应该是refs/tags/release_1.1


2
如果我将refs/tags/${tagName}指定为默认分支,TeamCity会开始抱怨它无法连接到git仓库,难道没有更简洁的解决方案吗?这应该是非常常见的用例。 - js3dev
将我的分支名称设置为refs/tags/${%tag%}会导致错误:"无法找到默认分支'refs/tags/${0.5.0}'的修订版本",但将其设置为refs/tags/%tag%则会出现"收集更改失败,错误:@NotNull参数的第2个参数"。 - Zhaph - Ben Duguid
1
看起来如果你将默认分支设置为%full_tag%而不是refs/tags/%tag%,并将默认的full_tag设置为空,TeamCity就不会抱怨了。但是你需要将完整的引用作为参数传递(即full_tag=refs/tags/development-12)。 - js3dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接