我正在使用SVN和的TeamCity构建服务器,一个C#/ VB.Net项目。 甲十几组件由构建生产。 我想控制组件的版本,使它们都匹配,也符合构建TeamCity的标签。
我已配置的TeamCity使用的版本标签
MAJOR.MINOR。{建立} {}修订
其中主要和次要是我手动设置的常量,{}修订通过在结账SVN库版本的确定和{}建设是TeamCity的自动递增建立逆。 因此,一个例子构建标签会
2.5.437.4423
你有什么建议的技术,以确保所有的组件版本匹配TeamCity的版本标签?
我们使用CruiseControl.net和SVN。 我们驾驶它的其他方式。 我们使用的是MSBuildCommunityTasks版本任务一个MSBuild脚本来增加版本号为CI构建并使用该版本号来标记的源代码。
编辑:要求对MSBuild的目标更详细...
我们使用一个单独的脚本,对于CI构建,而不是用于开发人员构建。 我们尝试使用不同的目标中的MSBuild文件Studio使用的项目文件,但是这必须是一个头痛和要求工作室中生成文件的手动编辑。
该MSBuild的文件的结构非常简单:
导入额外件
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<!-- contains some variables that set project names, paths etc. -->
<Import Project="Properties.msbuild"/>
BeforeBuild:设置新的版本号和改写的AssemblyInfo文件
<Version VersionFile="$(VersionFile)" BuildType="None" RevisionType="Increment">
<Output TaskParameter="Major" PropertyName="Major" />
<Output TaskParameter="Minor" PropertyName="Minor" />
<Output TaskParameter="Build" PropertyName="Build" />
<Output TaskParameter="Revision" PropertyName="Revision" />
</Version>
<!--Modify Assembly Info-->
<AssemblyInfo CodeLanguage="CS"
OutputFile="Properties\AssemblyInfo.cs"
AssemblyTitle="$(TargetAssembly)"
AssemblyDescription="$(AssemblyDescription) svn:@(SanitizedSvnUrl) revision:$(SvnRevision)"
AssemblyCompany="Your company name"
AssemblyProduct="Name of product"
AssemblyCopyright="Copyright © your company 2009"
ComVisible="false" Guid="$(WindowGuid)"
AssemblyVersion="$(Major).$(Minor).$(Build).$(Revision)"
AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)"
Condition="$(Revision) != '0' " />
建设:建立在释放模式实际的项目文件的MSBuild脚本
AfterBuild:我们运行单元测试项目(作为防范创建碎建立在接下来的步骤标记),使用SvnInfo任务和一些REGEXREPLACE任务来设置一些变量了路径和标签名称,并使用SvnCopy任务创建标签。
<SvnCopy UserName="username"
Password="password"
SourcePath="@(SvnTrunkPath)"
DestinationPath="@(SvnTagsPath)/BUILD-$(TargetAssembly)-$(Major).$(Minor).$(Build).$(Revision)" Message="Tagging successful build" />
我建议使用的TeamCity的集信息补丁构建功能:
http://confluence.jetbrains.net/display/TCD65/AssemblyInfo+Patcher
刚刚从VisualStudio中创建你的项目,在BuildSteps页面配置构建功能(见http://confluence.jetbrains.net/display/TCD65/Adding+Build+Features ),只要你保持默认AssemblyInfo.cs文件,它会工作。
这种方法对我来说是伟大的工作。
好处:
- 开发人员可以构建在他们的机器解决方案。
- 你不需要触摸的.sln或.csproj的文件。 这只是工作。
- 通过使用TeamCity的变量,你可以轻松地进行版本号匹配其他一些项目的版本,等等。
缺点:
- 你不能轻松地切换到从其他的TeamCity CI服务器,因为你没有一个构建脚本(但切换CI服务器是相似的转换ORM或数据库:这是不太可能,将需要大量的工作反正)。
我要离开麦高的答案,作为接受的答案,但我完整性认为这将是值得记录我们最终采取的办法。
我保持TeamCity的2种独立的生成配置,一个是CI构建和另一个原因是,当有任何改变(或手动),每周运行,并为我们的官方发布版本构建。 我去了两个构建方法,因为构建需要也许40分钟终端到结束,我想开发商获得,当他们提交更改任何构建问题快速反馈。 因此,CI版本是完整的发布版本的子集,但它建立的所有代码。 的版本也不同的两个版本:
- 该CI打造了版本号{} Major.minor.BuildCounter.SvnRevision
- BuildCounter从0开始
- 没有标记的svn库
- 每周/发布版本中也有类似的版本控制系统,但
- 构建计数器开始于(主要* 1000),因此,如果主要是“8”,构建计数器从8000开始。
- 创建于SVN仓库被称为“Build_ {版本}”标记
这样做的原因有些武断的选择就是让我们明明白白地分辨之间CI构建和发布版本。
我们在溶液中的每一个项目叫做AssemblyVersionInfo一个解决方案范围的文件包含(软链接)。 该文件包含(实质)这一点:
using System.Reflection;
// Revision and Build both set to 9999 indicates a private build on a developer's private workstation.
[assembly: AssemblyFileVersion("6.0.9999.9999")] // Win32 File Version (not used by .NET)
因此,开发人员构建都使用相同的静态和容易识别的版本号,这比通过构建服务器产生这样在版本化冲突,开发商的文件获得什么更高。
在构建服务器,摆在我们的MSBuild社区任务生成覆盖缺省内容的新AssemblyVersionInfo文件。 我们使用TeamCity的构建字符串作为新版本。 通过这种方式,我们可以很容易地在以下3种情况区别:
- 该开发者的工作站上执行私有构建
- 一个CI构建生成服务器上执行,但不应该被释放
- 一个官方认可的发行版本,其中被标记在SVN仓库
在另一转弯,请注意,我设置AssemblyFileVersion
,不是AssemblyVersion
。 我们强迫我们的程序集版本是“Major.Minor.0.0”的静态,固定的版本字符串。 我们这样做,这样我们可以不必担心版本问题发出bug修复版本。 该的AssemblyFileVersion让我们弄清楚什么建立一个用户已经没有它的组件的身份的一部分安装。
尽管这已经是具有公认的答案,我想补充,我们已经使用的想法。
对于大型项目可能有很多程序集信息文件进行更新,并与不断重新分解总是有构建脚本是不知道的,需要被更新的新文件的风险。
为此,我们已经创建了一个简单的代码文件,该文件定义了一个常数实际的版本,然后将所有项目继承这样的持续,我们在装配信息文件。 然后构建脚本只需要更新一个文件。
这里的另一个好处是,这也是加快构建过程有些因为它并不需要经过许多文件和变化。