感谢您的建议。我选择编写一套自定义目标以与我的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插件,但可能会有一个博客系列即将推出。
我很乐意为任何感兴趣的人提供更多的代码和进一步的解释。
感谢您的回复。这可以在具有相关工件的相同构建配置中正常工作。我在这里有三种独立的构建配置,它们有三套不同的步骤。我需要能够跨配置持久保留版本号,而不是构建步骤。 –
为了进一步阐明,CI构建将发生在vcs commit上,并且应该推出版本2.19.123。次要版本构建将手动运行,并应该删除版本2.20.0。主要发布版本也将手动运行,并且应该推出版本3.0.0。为了实现所有这些,必须有一个中心位置,该版本可以存储并在后续构建中引用。 –
@DaveBaxter - 你还没有明白我的答案。我不是在谈论相同的构建配置。我正在通过配置进行交谈。请尝试再次阅读。 – manojlds