Fazemos isso com xUnit.net para nossas compilações automatizadas. Nós usamos CruiseControl.net
(e estamos testando o TeamCity). A tarefa MSBuild que executamos para integração contínua altera automaticamente o número de compilação para nós, de forma que o arquivo ZIP de compilação resultante contenha um conjunto de DLLs e EXEs com versão adequada.
Nosso arquivo MSBuild contém uma referência UsingTask para uma DLL que faz substituições de expressões regulares: (você pode usar esta DLL, pois também é coberta pela licença MS-PL)
<UsingTask
AssemblyFile = "3rdParty \ CodePlex.MSBuildTasks.dll"
TaskName = "CodePlex.MSBuildTasks.RegexReplace" />
Em seguida, extraímos o número do build, que é fornecido automaticamente pelo sistema de CI. Você também pode fazer com que seu provedor de controle de fonte forneça o número de revisão da fonte, se quiser, mas descobrimos que o número da versão no sistema de CI era mais útil, porque não só pode ver os resultados da integração pelo número da versão de CI, que também fornece um vincule de volta ao (s) changeset (s) que foram incluídos na construção.
<! - Tentativas em cascata de encontrar um número de compilação ->
<PropertyGroup Condition = "'$ (BuildNumber)' == ''">
<BuildNumber> $ (BUILD_NUMBER) </BuildNumber>
</PropertyGroup>
<PropertyGroup Condition = "'$ (BuildNumber)' == ''">
<BuildNumber> $ (ccnetlabel) </BuildNumber>
</PropertyGroup>
<PropertyGroup Condition = "'$ (BuildNumber)' == ''">
<BuildNumber> 0 </BuildNumber>
</PropertyGroup>
(Tentamos BUILD_NUMBER, que é do TeamCity, depois ccnetlabel, que é do CC.net, e se nenhum estiver presente, o padrão é 0, para que possamos testar o script de construção automatizado manualmente.)
Em seguida, temos uma tarefa que define o número da compilação em um arquivo GlobalAssemblyInfo.cs que vinculamos a todos os nossos projetos:
<Target Name = "SetVersionNumber">
<RegexReplace
Padrão = 'AssemblyVersion \ ("(\ d + \. \ D + \. \ D +) \. \ D +" \)'
Replacement = 'AssemblyVersion ("$ 1. $ (BuildNumber)")'
Files = 'GlobalAssemblyInfo.cs' />
<Exec Command = "attribute -r xunit.installer \ App.manifest" />
</Target>
Isso localiza o atributo AssemblyVersion e substitui o número da versão abcd por abcBuildNumber. Normalmente deixaremos o código-fonte verificado na árvore com as três primeiras partes do número do construtor corrigidas e a quarta no zero (por exemplo, hoje é 1.0.2.0).
Em seu processo de construção, certifique-se de que a tarefa SetVersionNumber preceda sua tarefa de construção. No final, usamos nossa tarefa Zip para compactar os resultados da compilação de forma que tenhamos um histórico dos binários para cada compilação automatizada.