组件版本控制与TeamCity
-
11-07-2019 - |
题
我的工作C#/VB。网项目,该项目使用SVN和TeamCity建立服务器。十几个组件的生产是通过建立。我想要控制大会的版本,以便他们切匹配并且也匹配TeamCity建立的标签。
我已经配置TeamCity到使用建立一个标签
主要的。未成年人。{建立}.{修正}
其中主要的和次要的正常量,我手动设置,{修正},是由SVN库的版本,在结算和{建立}是TeamCity自动增加建立计数器。所以一个实例建立的标签会
2.5.437.4423
什么样的技术你会建议确保所有的大会的版本相匹配的TeamCity建立的标签?
解决方案
我们使用CruiseControl.net 和SVN.我们驾驶它的其他方式。我们正在使用的 MSBuildCommunityTasks 版本任务在MSBuild脚本增量的版本号为CI建立和使用该版本的编号,以标签的源码。
编辑: 要求提供更多的详细MSBuild目标...
我们用一个单独的脚本是用于CI建立和不使用对于开发商的基础之上。我们尝试使用不同的目标,请参阅文件的工作室使用作为项目文件,但这必须是一个头疼的和所需的手册的编辑文件是发生。
结构请参阅文件是非常简单的:
进口额外的碎片
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<!-- contains some variables that set project names, paths etc. -->
<Import Project="Properties.msbuild"/>
BeforeBuild:新版本数量和重写程序集信息文件
<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
只是为你的项目从visual studio,配置建立特BuildSteps页(见 http://confluence.jetbrains.net/display/TCD65/Adding+Build+Features),并且只要你保持默认程序集信息.cs文件,它将工作。
这种方法是伟大的工作对我来说。
优点:
- 开发可以生成解决方案在他们的机器。
- 你不需要接触。sln。csproj文件。它只是工作。
- 通过使用TeamCity变量,你可以容易地做出的版本号相匹配的其他一些项目的版本,等等。
缺点:
- 你不能轻易地换到另一个CI服务器从TeamCity因为你没有建立脚本(但交换CI服务器就像是开关欧姆或数据库:这是非常不可能的,并且将需要大量的工作无论如何)。
我要离开麦的答复为接受的答案,但为完整起见我认为这将是值得记录方法,我们最后通过。
我保持2个独立的配置建立在TeamCity,一个是CI建立,另一个是一个建立运行的每周一次,当有任何变化(或手)和我们的官方发布的建立。我去两建立的方法,因为建设需要也许是40分钟终端到终端的和我想的开发人员得到一个快速的反馈意见在任何建设问题的时候,他们提交的改变。CI建立,因此是一个子集的全部释放建设,但它建立的所有代码。该版本控制也不同于两者之间建立:
- CI建立有版本的数字{主要的。未成年人。BuildCounter.SvnRevision}
- BuildCounter开始从0
- 没有标记的svn库
- 每周/发布建立具有类似的版本控制系统,但是
- 将建立反开始在(主要*1000),因此,如果主要是'8',建立计数器开始从8000.
- 创建了一个标签称为'Build_{版}'在svn库
为此原因有些任意的选择是使我们能够清楚和简单地区分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
.我们迫使我们的组件版本是一个静态、固定版本串的'主要的。未成年人。0.0'.我们这样做,以便我们能够一问题的修正版本,而不必担心版本问题。该AssemblyFileVersion可以让我们找出什么建立一个用户安装而这一部分的大会的身份。
尽管这已经是具有公认的答案,我想补充,我们已经使用的想法。
对于大型项目可能有很多程序集信息文件进行更新,并与不断重新分解总是有风险的构建脚本是不知道的新文件需要被更新。
为此,我们已经创建了一个简单的代码文件,该文件定义了一个常数实际的版本,然后将所有项目继承这样的持续,我们在装配信息文件。然后构建脚本只需要更新一个文件。
这里的另一个好处是,这也是加快构建过程有些因为它并不需要经过许多文件和变化。