【问题标题】:TeamCity MSBuild refer to build counterTeamCity MSBuild 指的是构建计数器
【发布时间】:2012-10-18 09:26:09
【问题描述】:

我有一个属性组,其中包含一个 build_number 属性,该属性是从 TeamCity 传入的,仅作为构建计数器。在 TeamCity 中将内部版本号格式设置为计数器的简单 {0}。

<PropertyGroup>
  <Major>10</Major>
  <Minor>1</Minor>
  <Build>$(BUILD_NUMBER)</Build>
  <Release>0</Release>
   ...
</PropertyGroup>

Major、Minor 和 Release 属性随后会根据源代码管理中文件中的值进行更新。

为了让 TeamCity 将构建记录为完整的 4 部分构建参考(不仅仅是计数器),我将其设置为:

<TeamCitySetBuildNumber BuildNumber="$(Major).$(Minor).$(Build).$(Release)" />

但是,现在当我引用我的 $(Build) 属性时,它现在设置为 4 部分构建引用,并且在使用 TeamCitySetBuildNumber 设置之前我所做的任何引用 $(BUILD_NUMBER) 的属性也会被覆盖4 部分参考。

注意,我还使用系统消息对其进行了更改:

<Message Text="##teamcity[buildNumber '$(Major).$(Minor).$(Build).$(Release)']" />

但整体效果是一样的。

在我设置了上面的 BuildNumber 之后,我如何才能(仅)参考构建计数器?

【问题讨论】:

  • 为什么不直接将 teamcity 中的格式改为 10.1.{0}.0 然后使用 BuildNumber=$(BUILD_NUMBER)?
  • @JamesWoolfenden 这当然可以,但是(无论对错)目前我们的设置是通过源代码控制中的文件修改 [Major].[Minor] 部分。如果我不能得到满意的结论,这当然是后备立场。
  • 您是否尝试过 msbuild 扩展包中的 assemblyinfo 任务。我试试看。

标签: msbuild continuous-integration version teamcity


【解决方案1】:

如果您使用的是项目文件,您可以尝试在 *.vbproj 或 *.csproj 文件的 AfterBuild 部分调用 TeamCitySetBuildNumber 命令:

<Target Name="AfterBuild">
    <TeamCitySetBuildNumber BuildNumber="$(Major).$(Minor).$(Build).$(Release)" />
</Target>

如果您使用的是解决方案文件,我会创建一个 *.proj 文件来调用您的解决方案文件,然后调用 TeamCitySetBuildNumber 命令(不确定您是否可以像这样在目标中调用 TeamCitySetBuildNumber 命令...):

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="SetBuildNumber">

<PropertyGroup>
  <Major>10</Major>
  <Minor>1</Minor>
  <Build>$(BUILD_NUMBER)</Build>
  <Release>0</Release> 
</PropertyGroup>

  <Target Name="Build">
    <Message Text="Build task called... " Importance="high"/>
    <MSBuild Projects="$(teamcity_build_checkoutDir)\your_solution.sln" Properties="Configuration=Release"/>
  </Target>

  <Target Name="SetBuildNumber" DependsOnTargets="Build">
    <Message Text="Setting build number back to TeamCity... " Importance="high"/>
    <TeamCitySetBuildNumber BuildNumber="$(Major).$(Minor).$(Build).$(Release)" />
  </Target>

</Project>

【讨论】:

  • 您好 MattyB,感谢您的回答。我正在使用一个 proj 文件,但是稍后在此过程中设置内部版本号的事情是,如果它在此步骤之前失败,那么日志再次引用构建计数器,而不是 4 部分参考,这就是为什么我'm 在第一个目标中设置内部版本号。
  • 那么,您是否想要一个类似于“finally”块的东西,无论构建是否成功都会被调用?如果是这样试试这个:try…finally equivalent in MsBuild
  • 以前没见过。便利。最终,除非我重组我的项目,但它不会起作用。对或错(!)我的 proj 文件有 8 个目标,每个目标由 8 个 TeamCity 构建步骤依次调用,因此如果第 3 步失败,它不会继续,这就是我想要的(日志还指出“[步骤 3/ 8]”等很方便)。正如我所看到的,我需要对其进行重组,以便有 1 个 TC 构建步骤,然后重新进行工作以添加检查,以确保在做任何事情之前之前的目标工作正常,这并不是我真正想要的。 TC 似乎缺乏我发现的“最佳实践”的定义......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 2014-11-23
  • 2014-04-16
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
相关资源
最近更新 更多