How can I auto increment the C# assembly version via our CI platform (Hudson)?

Myself and my group are horrendous at incrementing assembly version numbers and we frequently ship assemblies with 1.0.0.0 versions. Obviously, this causes a lot of headaches.

We're getting a lot better with our practices via our CI platform and I'd really like to set it up to auto increment the values within the assemblyinfo.cs file so that the versions of our assemblies are auto updated with the code changes in that assembly.

I had previously setup (before we found Hudson) a way to increment the value through either msbuild or the command line (can't remember), but with Hudson, that will update the SVN repository and trigger ANOTHER build. That would result in a slow infinite loop as Hudson polls SVN every hour.

Is having Hudson increment the version number a bad idea? What would be an alternative way to do it?

Ideally, my criteria for a solution would be one that:

  • Increments the build number in assemblyinfo.cs before a build
  • Only increments the build number in assemblies that have changed. This may not be possible as Hudson wipes out the project folder every time it does a build
  • Commits the changed assemblyinfo.cs into the code repository (currently VisualSVN)
  • Does not cause Hudson to trigger a new build the next time it scans for changes
  • Working this out in my head, I could easily come up with a solution to most of this through batch files / commands, but all of my ideas would cause Hudson to trigger a new build the next time it scans. I'm not looking for someone to do everything for me, just point me in the right direction, maybe a technique to get Hudson to ignore certain SVN commits, etc.

    Everything I've found so far is just an article explaining how to get the version number automatically incremented, nothing takes into account a CI platform that could be spun into an infinite loop.


    A simple alternative is to let the C# environment increment the assembly version for you by setting the version attribute to major.minor.* (as described in the AssemblyInfo file template.)

    You may be looking for a more comprehensive solution, though.

    EDIT (Response to the question in a comment):

    From AssemblyInfo.cs :

    // Version information for an assembly consists of the following four values:
    //
    //      Major Version
    //      Minor Version 
    //      Build Number
    //      Revision
    //
    // You can specify all the values or you can default the Build and Revision Numbers 
    // by using the '*' as shown below:
    // [assembly: AssemblyVersion("1.0.*")]
    

    Here's what I did, for stamping the AssemblyFileVersion attribute.

    Removed the AssemblyFileVersion from AssemblyInfo.cs

    Add a new, empty, file called AssemblyFileInfo.cs to the project.

    Install the MSBuild community tasks toolset on the hudson build machine or as a NuGet dependency in your project.

    Edit the project (csproj) file , it's just an msbuild file, and add the following.

    Somewhere there'll be a <PropertyGroup> stating the version. Change that so it reads eg

     <Major>1</Major>
     <Minor>0</Minor>
     <!--Hudson sets BUILD_NUMBER and SVN_REVISION -->
     <Build>$(BUILD_NUMBER)</Build>
     <Revision>$(SVN_REVISION)</Revision>
    

    Hudson provides those env variables you see there when the project is built on hudson (assuming it's fetched from subversion).

    At the bottom of the project file, add

     <Import Project="$(MSBuildExtensionsPath)MSBuildCommunityTasksMSBuild.Community.Tasks.Targets" Condition="Exists('$(MSBuildExtensionsPath)MSBuildCommunityTasksMSBuild.Community.Tasks.Targets')" />
      <Target Name="BeforeBuild" Condition="Exists('$(MSBuildExtensionsPath)MSBuildCommunityTasksMSBuild.Community.Tasks.Targets')">
        <Message Text="Version: $(Major).$(Minor).$(Build).$(Revision)" />
        <AssemblyInfo CodeLanguage="CS" OutputFile="AssemblyFileInfo.cs" AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" AssemblyConfiguration="$(Configuration)" Condition="$(Revision) != '' " />
      </Target>
    

    This uses the MSBuildCommunityTasks to generate the AssemblyFileVersion.cs to include an AssemblyFileVersion attribute before the project is built. You could do this for any/all of the version attributes if you want.

    The result is, whenever you issue a hudson build, the resulting assembly gets an AssemblyFileVersion of 1.0.HUDSON_BUILD_NR.SVN_REVISION eg 1.0.6.2632 , which means the 6'th build # in hudson, buit from the subversion revision 2632.


    Here is an elegant solution that requires a little work upfront when adding a new project but handles the process very easily.

    The idea is that each project links to a Solution file that only contains the assembly version information. So your build process only has to update a single file and all of the assembly versions pull from the one file upon compilation.

    Steps:

  • Add a class to you solution file *.cs file, I named min SharedAssemblyProperties.cs
  • Remove all of the cs information from that new file
  • Cut the assembly information from an AssemblyInfo file: [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")]
  • Add the statement "using System.Reflection;" to the file and then paste data into your new cs file (ex SharedAssemblyProperties.cs)
  • Add an existing item to you project (wait... read on before adding the file)
  • Select the file and before you click Add, click the dropdown next to the add button and select "Add As Link".
  • Repeat steps 5 and 6 for all existing and new projects in the solution
  • When you add the file as a link, it stores the data in the project file and upon compilation pulls the assembly version information from this one file.

    In you source control, you add a bat file or script file that simply increments the SharedAssemblyProperties.cs file and all of your projects will update their assembly information from that file.

    链接地址: http://www.djcxy.com/p/8944.html

    上一篇: 在哈德逊问题的硒测试

    下一篇: 如何通过我们的CI平台(Hudson)自动增加C#程序集版本?