2011-10-19 71 views
2

我正在使用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的一种方式,无论是本地或通过插件,让我读取和写入该版本的文件或变量,它可以在构建配置被保留?

回答

1

感谢您的建议。我选择编写一套自定义目标以与我的MSBuild脚本一起使用,该脚本在远程xml“清单”文件中维护程序集元数据。当创建一个新的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安装程序元数据,并通过服务消息将版本和其他相关信息传回给TeamCity。

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

除了用于向TeamCity中继版本的服务消息外,这里与TeamCity结合的非常少。我喜欢将自定义目标中的功能和从TeamCity中删除的构建脚本转移到另一个构建管理解决方案。出于这个原因,我不打算花时间去构建一个TeamCity插件,但可能会有一个博客系列即将推出。

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

3

可以参考使用dep.btx.build.number依赖性的(伪影/快照)构的版本号,其中btx是后者的BT ID。一旦你的版本号,通过内部版本号到脚本的配置下运行,在分析脚本中的版本号,从脚本发送到service messages向TeamCity的设置你想要的方式的版本号。在构建步骤中,将脚本解析和设置编号作为脚本/第一步中的第一步。

+0

感谢您的回复。这可以在具有相关工件的相同构建配置中正常工作。我在这里有三种独立的构建配置,它们有三套不同的步骤。我需要能够跨配置持久保留版本号,而不是构建步骤。 –

+0

为了进一步阐明,CI构建将发生在vcs commit上,并且应该推出版本2.19.123。次要版本构建将手动运行,并应该删除版本2.20.0。主要发布版本也将手动运行,并且应该推出版本3.0.0。为了实现所有这些,必须有一个中心位置,该版本可以存储并在后续构建中引用。 –

+0

@DaveBaxter - 你还没有明白我的答案。我不是在谈论相同的构建配置。我正在通过配置进行交谈。请尝试再次阅读。 – manojlds

0

是的,你可以创建一个插件来做到这一点。您可以使用我的自动增量编号(跨配置)插件并对其进行修改以适应您的需求。内部版本号将被保存在一个文本文件中,该文件可以从TeamCity的管理屏幕进行配置。

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

你可以打我输入如何,如果你需要改变它。

+0

我只是在看写这样的插件来处理这个问题。我**知道**我不可能是唯一需要这种设置的人。让我通读已有的代码,然后查看可能需要为我的环境所做的更改。谢谢! –

相关问题