使用TeamCity进行程序集版本控制

Tim*_*ong 18 version-control build-automation teamcity

我正在开发一个使用SVN和TeamCity构建服务器的C#/ VB.Net项目.构建产生了十几个组件.我想控制程序集版本,以便它们都匹配并匹配TeamCity构建标签.

我已将TeamCity配置为使用的构建标签

MAJOR.MINOR.{建立} {}修订

如果Major和Minor是我手动设置的常量,{Revision}由结帐时的SVN存储库版本决定,{Build}是TeamCity自动递增构建计数器.所以一个示例构建标签将是

2.5.437.4423

您建议使用哪些技术来确保所有程序集版本都与TeamCity构建标签匹配?

Rod*_*ave 31

我建议使用TeamCity的AssemblyInfo修补程序构建功能:

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或数据库:它不太可能,无论如何都需要大量工作).


Tim*_*ong 7

我将Hamish的答案作为公认的答案,但为了完整起见,我认为值得记录我们最终采用的方法.

我在TeamCity中维护了两个独立的构建配置,一个是CI构建,另一个是在有任何更改(或手动)时每周运行的构建,并且是我们的官方发布版本.我采用了双构建方法,因为构建需要大约40分钟的端到端,我希望开发人员在提交更改时能够快速获得有关任何构建问题的反馈.因此,CI构建是完整版本构建的一个子集,但它确实构建了所有代码.版本控制在两个版本之间也有所不同:

  • CI版本的版本号为{Major.minor.BuildCounter.SvnRevision}
    • BuildCounter从0开始
    • 不标记svn存储库
  • Weekly/Release版本具有类似的版本控制系统,但是
    • 构建计数器从(Major*1000)开始,因此如果Major为'8',则构建计数器从8000开始.
    • 在svn存储库中创建一个名为"Build_ {Version}"的标记

这种有些随意选择的原因是允许我们清楚简单地区分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)
Run Code Online (Sandbox Code Playgroud)

因此,开发人员构建所有使用相同的静态和易于识别的版本号,这比版本服务器生成的任何内容都高,因此在版本冲突中,开发人员的文件获胜.

在构建服务器上,我们使用MSBuild社区任务生成一个新的AssemblyVersionInfo文件,该文件将覆盖默认内容.我们使用TeamCity构建字符串作为新版本.通过这种方式,我们可以轻松区分以下3种情况:

  • 在开发人员的工作站上执行的私有构建
  • 在构建服务器上执行的CI构建,但不应该发布
  • 官方认可的发布版本,在Svn存储库中标记

在另一个转折点,请注意我正在设置AssemblyFileVersion,而不是AssemblyVersion.我们强制我们的汇编版本是'Major.Minor.0.0'的静态固定版本字符串.我们这样做是为了能够发布错误修复版本,而不必担心版本问题.AssemblyFileVersion让我们可以弄清楚用户安装的构建版本,而不会成为程序集标识的一部分.


Ham*_*ith 5

我们正在使用CruiseControl.net和SVN.我们以另一种方式驾驶它.我们在MSBuild脚本中使用MSBuildCommunityTasks Version任务来增加CI构建的版本号,并使用该版本号标记源代码.

编辑:询问有关MSBuild目标的更多详细信息...
我们使用单独的脚本用于CI构建,不用于开发人员构建.我们尝试在工作室用作项目文件的MSBuild文件中使用不同的目标,但这很令人头疼,并且需要手动编辑工作室正在生成的文件.
MSBuild文件的结构非常简单:

  1. 导入额外的碎片

    <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
    <!-- contains some variables that set project names, paths etc. -->
    <Import Project="Properties.msbuild"/>

  2. 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' " />

  3. 构建:在发布模式下构建实际项目文件MSBuild脚本

  4. AfterBuild:我们运行我们的单元测试项目(作为防止在后续步骤中为破坏的构建创建标记),使用SvnInfo任务和一些RegexReplace任务来设置一些带有路径和标记名称的变量,并使用SvnCopy任务创建标签.

<SvnCopy UserName="username"
Password="password"
SourcePath="@(SvnTrunkPath)"
DestinationPath="@(SvnTagsPath)/BUILD-$(TargetAssembly)-$(Major).$(Minor).$(Build).$(Revision)" Message="Tagging successful build" />

  • @arconaut:谢谢.我的回答中没有任何内容表示@Tim Long应该使用CC.NET,我只是用我正在使用的工具开头答案,因此很清楚为什么答案不是专门针对TeamCity的. (2认同)