跨构建步骤和构建配置保留版本号

时间:2011-10-19 03:01:42

标签: versioning teamcity

我正在使用TeamCity 6.5.4,我需要为同一部署包提供3种构建配置。我想在所有三个构建配置中保留版本号,并能够使用该编号来版本化程序集,标记vcs,版本nuspec文件等。

以下是配置和所需的版本号:

 Configuration     |  Version  
-------------------|---------
 CI/Nightly Build  |  1.1.*
 Minor Release     |  1.*.0
 Major Release     |  *.0.0

似乎TeamCity为每个配置使用单独的构建增量器。这意味着每次我们有主要版本或次要版本时,我都必须手动更新所有后续配置中的持久值(1)。我是程序员而且我很懒。我想要一个按钮为我做一切。

我已经看到了通过具有相关快照的配置的构建步骤来持久化构建号的示例,但这仅适用于相同的配置。

Autoincrementer插件会在您引用ID的每个时间内增加的数量。这适用于更改数字(*),但不太适合引用持久值(1)。

TeamCity有没有办法,无论是原生还是通过插件,允许我将该版本读写到可以在构建配置中保留的文件或变量?

3 个答案:

答案 0 :(得分:3)

您可以使用dep.btx.build.number引用相关(工件/快照)配置的内部版本号,其中btx是后者的bt id。获得内部版本号后,将内部版本号传递给在配置中运行的脚本,在脚本中解析内部版本号,然后从脚本发送service messages到Teamcity,以便按照您想要的方式设置内部版本号。将此解析和设置编号作为脚本/构建步骤中第一步的第一步。

答案 1 :(得分:1)

感谢您的建议。我选择编写一组自定义目标,用于我的MSBuild脚本,该脚本在远程xml“manifest”文件中维护程序集元数据。创建新的TeamCity项目时,我的构建脚本调用Init目标,该目标从未填充的模板创建新的清单文件。

<Copy SourceFiles="@(ManifestTemplate)" DestinationFiles="@(ManifestTemplate->'$(ManifestFile)')" Condition="!Exists('$(ManifestFile)')" />

我正在使用MSBuild Extentions包来读取清单文件中的版本信息等属性。

<MSBuild.ExtensionPack.Xml.XmlFile TaskAction="ReadElementText" File="$(ManifestFile)" XPath="/Package/Version/Major">
  <Output PropertyName="PackageVersionMajor" TaskParameter="Value"/>
</MSBuild.ExtensionPack.Xml.XmlFile>

我将TeamCity构建配置分为CI,测试,次要版本和主要版本,每个事件触发不同的事件。从我的项目构建脚本中的相应目标,我向DependsOnTargets属性添加一个新目标,以调用自定义目标以更新相应的版本号并将其保存到清单文件。

<Target Name="Test" DependsOnTargets="IntializeBuildProject;Build-UpdateVersion-Build">
<MSBuild Projects="$(SolutionFile)" Targets="Rebuild" Properties="Configuration=$(Configuration)" />
<TeamCitySetBuildNumber BuildNumber="$(PackageVersion)" />

处理版本更新的自定义目标中的代码:

<MSBuild.ExtensionPack.Science.Maths TaskAction="Add" Numbers="$(PackageVersionBuild);1">
  <Output PropertyName="PackageVersionBuild" TaskParameter="Result"/>
</MSBuild.ExtensionPack.Science.Maths>
<MSBuild.ExtensionPack.Xml.XmlFile TaskAction="UpdateElement" File="$(ManifestFile)" XPath="/Package/Version/Build" InnerText="$(PackageVersionBuild)"/>

此文件处理版本和其他元数据的持久性,从而忽略TeamCity内部版本号。由于XML元数据文件是集中式的,我可以使用这些值来填充我的Nuspec,AssemblyInfo和WiX Installer元数据,以及通过服务消息将版本和其他相关信息传递回TeamCity。

我添加了一个简单的MVC Web界面,允许我的团队在包详细信息更改时远程编辑文件内容。现在我们有一个地方可以更新版权信息和给定构建项目的任何其他元数据。我还可以让非开发人员访问MVC站点以更新品牌信息,而不允许他们访问我的TeamCity构建配置。

除了用于将版本转发到TeamCity的服务消息之外,这里与TeamCity的结合很少。我喜欢在TeamCity中删除自定义目标和构建脚本中的功能,因为我们转向另一个构建管理解决方案。出于这个原因,我没有想到花时间构建一个TeamCity插件,但很快就会有一个博客系列。

我很乐意为感兴趣的人提供更多代码和进一步解释。

答案 2 :(得分:0)

是的,您可以创建一个插件来轻松完成此操作。您可以使用我的自动增量内部版本号(跨配置)插件并对其进行修改以满足您的需要。内部版本号将保存在一个文本文件中,该文件可从TeamCity中的管理界面进行配置。

http://github.com/ornatwork/tc_plugins/tree/master/unique

如果需要,你可以打电话给我如何更改它。