Fetchez la vache
Fetchez la vache

Reputation: 5230

TeamCity MSBuild refer to build counter

I have a property group which includes a property for the build_number which is being passed in from TeamCity as solely the Build Counter. The build number format being set in TeamCity as simply {0} for the counter.

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

The Major, Minor and Release properties are then updated from values in a file in source control.

So that TeamCity logs the build as the full 4 part build reference (not just the counter), I set it thus:

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

However, now when I reference my $(Build) property, it's now set to the 4 part build reference, and any property I have made which makes reference to $(BUILD_NUMBER) prior to setting using TeamCitySetBuildNumber also gets overwritten with the 4 part reference.

NB I've also changed it with a system message:

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

but the overall effect is the same.

How Can I refer to the build counter (only) AFTER I have set the BuildNumber above?

Upvotes: 1

Views: 1425

Answers (1)

mattyB
mattyB

Reputation: 1104

If you're using a project file, you could try calling the TeamCitySetBuildNumber command in the AfterBuild section of the *.vbproj or *.csproj file:

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

If you're using a solution file, I'd create a *.proj file that calls your solution file and then after that call the TeamCitySetBuildNumber command (not sure if you can call the TeamCitySetBuildNumber command within the target like this though...):

<?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>

Upvotes: 2

Related Questions