如何在 TeamCity 中构建 git 标签?

Posted

技术标签:

【中文标题】如何在 TeamCity 中构建 git 标签?【英文标题】:How can I build a git tag in TeamCity? 【发布时间】:2013-12-19 15:53:46 【问题描述】:

我想为 TeamCity 服务器提供一个 git 标签来构建它。 我将标签(即release_1.1)作为参数传递给作业。因此,在作业内部,标签以%tag% 的形式提供,但在Version Control Settings 下,我看不到任何使用此参数的方法,因此服务器可以签出此标签。 有没有什么方法可以在设置中使用这个参数来签出标签?

【问题讨论】:

我遇到了类似的问题 - 将“分支名称”设置为“refs/tags/%TagToBuild%”我得到:Failed to collect changes, error: Argument 2 for @NotNull parameter of jetbrains/buildServer/buildTriggers/vcs/VcsRootChangesLoader.loadChanges must not be null 【参考方案1】:
    进入编辑配置设置 -> 版本控制设置

    对于此构建配置的所有 VCS 根,请单击编辑,然后:

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

然后你就可以在按下运行旁边的“...”按钮时选择一个标签。

【讨论】:

恕我直言,这是迄今为止最干净最原生的方式。通过自定义运行对话框可以使用标签和分支。不需要任何自定义变量。然后,您可以像正常一样将分支规范用于构建配置的所有其他方面。 我同意这似乎是构建标签的最简洁方式。应该提到的是,需要自定义构建才能选择标签。 并等待 30 秒并刷新 TeamCity 页面,然后再按运行 不确定我是否理解这一步,teamcity 默认构建 master 我没有收到任何提示选择标签:i.imgur.com/CnT8XBN.png我在 TeamCity Enterprise 9.1.3 好的,所以我不得不去 teamcity 中的项目页面,然后单击“运行”按钮右侧的小菜单“...”图标。这为您提供了与 4 个选项卡的对话。第二个说“更改”,在那里您可以在“构建分支”下拉列表中指定要构建的标签。我正在使用 TeamCity 版本 Enterprise 9.1.5(内部版本 37377)【参考方案2】:

我已经设法使以下工作:

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

定义一个配置参数

姓名:TagToBuild 类:Configuration parameter 价值: 规格: 标签:Tag to build 描述:This should be the full path to the tag, i.e. refs/tags/0.5.5 显示:Prompt 类型:Text

请注意,“值”字段是故意留空的。

然后,在 VCS 根目录中:

分公司名称:%TagToBuild%

当我运行构建时,系统会提示我提供分支/标签名称:

输入诸如refs/tags/0.5.0 之类的值会生成一个不错的构建,结果中会列出分支名称:

如果您试图以超出描述的任何方式帮助用户,这似乎会失败。所以你不能做以下任何事情:

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

在我们稍微旧 (7.1) 的 Team City 实例中,我都得到了错误:

无法收集更改,错误:jetbrains/buildServer/buildTriggers/vcs/VcsRootChangesLoader.loadChanges 的@NotNull 参数的参数2 不能为空

【讨论】:

您可以通过创建名为teamcity.build.branch 的参数来覆盖分支名称,这样您就可以覆盖分支并将其设置为您想要的任何内容,即release 虽然严格来说不是我的情况,但您的回答给了我一个提示,帮助我解决了我多年来一直在苦苦挣扎的问题!我希望我可以投票两次。非常感谢! 使用更高版本的 TeamCity(例如,我们使用的是 9.1.5),现在确实可以将 VCS 根目录的“默认分支”设置为类似refs/tags/%versionRoot%,比每次都输入完整路径要干净一些【参考方案3】:

我没有用标签做这个,但是我用分支做了这个。我告诉 TeamCity 构建所有分支,方法是指定它应该构建 +:refs/heads/*。现在,每当我推送任何分支时,TeamCity 都会构建它。然后在构建中使用git branch 并查找以* 开头的行。我将该分支名称嵌入到一个方便的位置(AssemblyInfo.cs 用于 .NET,package.json 用于节点。)请参阅http://confluence.jetbrains.com/display/TCD8/Working+with+Feature+Branches

【讨论】:

但这仍在构建一切。我认为 js3dev 正在寻找(我知道我在寻找)是一种在 repo 中使用易于识别的标签标记点并构建它的方法——我的一些工具将为不同的环境创建不同版本的 .config 文件,但是当我通过 QA 时,我只想为“发布”而构建,但由于某种原因,头部可能已经移动。 通常当我有这个需求时,我会创建一个新分支——例如Releasev2.7——然后推送这个分支。 TeamCity 的“构建所有分支”将其拾取并运行。【参考方案4】:

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

所以你的应该是refs/tags/release_1.1

【讨论】:

如果我将refs/tags/$tagName 指定为默认分支,TeamCity 开始抱怨它无法连接到 git repo,难道没有更清洁的解决方案吗?这应该是一个非常常见的用例。 将我的分支名称设置为 refs/tags/$%tag% 会导致错误:“找不到默认分支 'refs/tags/$0.5.0' 的修订版”,但将其设置为 refs/tags/%tag%导致“无法收集更改,错误:@NotNull 参数的参数 2” 看起来如果您将默认分支设置为 %full_tag% 而不是 refs/tags/%tag% 并且默认 full_tag 为空,TeamCity 不会抱怨。但是您需要将完整引用作为参数传递(即 full_tag=refs/tags/development-12)。

以上是关于如何在 TeamCity 中构建 git 标签?的主要内容,如果未能解决你的问题,请参考以下文章

为 TeamCity 构建选择 Git 分支

如何使用 Git 分支支持覆盖 TeamCity 7.1 中的 <default> 分支名称?

SVN触发构建后如何处理来自Teamcity服务器本身的api

如何:Teamcity + GitHub

覆盖模板时 TeamCity 中的 VCS 标签

如何在 Teamcity 中归档构建配置?