Wir machen das mit xUnit.net für unsere automatisierten Builds. Wir verwenden CruiseControl.net
(und probieren TeamCity aus). Die MSBuild-Task, die wir für die kontinuierliche Integration ausführen, ändert automatisch die Build-Nummer für uns, sodass die resultierende Build-ZIP-Datei einen ordnungsgemäß versionierten Satz von DLLs und EXEs enthält.
Unsere MSBuild-Datei enthält eine UsingTask-Referenz für eine DLL, die reguläre Ausdrücke ersetzt: (Sie können diese DLL auch verwenden, da sie auch von der MS-PL-Lizenz abgedeckt wird.)
<UsingTask
AssemblyFile = "3rdParty \ CodePlex.MSBuildTasks.dll"
TaskName = "CodePlex.MSBuildTasks.RegexReplace" />
Als nächstes extrahieren wir die Build-Nummer, die vom CI-System automatisch bereitgestellt wird. Sie können Ihren Quellcodeverwaltungsanbieter auch bitten, die Versionsnummer der Quelle anzugeben, wenn Sie möchten. Wir haben jedoch festgestellt, dass die Build-Nummer im CI-System nützlicher ist, da nicht nur die Integrationsergebnisse anhand der CI-Build-Nummer angezeigt werden können, sondern auch eine Link zurück zu den Änderungssätzen, die im Build enthalten waren.
<! - Kaskadierende Versuche, eine Build-Nummer zu finden ->
<PropertyGroup Condition = "'$ (BuildNumber)' == ''">
<BuildNumber> $ (BUILD_NUMBER) </ BuildNumber>
</ PropertyGroup>
<PropertyGroup Condition = "'$ (BuildNumber)' == ''">
<BuildNumber> $ (ccnetlabel) </ BuildNumber>
</ PropertyGroup>
<PropertyGroup Condition = "'$ (BuildNumber)' == ''">
<BuildNumber> 0 </ BuildNumber>
</ PropertyGroup>
(Wir versuchen BUILD_NUMBER, das von TeamCity stammt, und dann ccnetlabel, das von CC.net stammt. Wenn keines von beiden vorhanden ist, setzen wir standardmäßig auf 0, damit wir das automatisierte Build-Skript manuell testen können.)
Als nächstes haben wir eine Aufgabe, die die Build-Nummer in eine GlobalAssemblyInfo.cs-Datei setzt, die wir in alle unsere Projekte verknüpfen:
<Target Name = "SetVersionNumber">
<RegexReplace
Pattern = 'AssemblyVersion \ ("(\ d + \. \ D + \. \ D +) \. \ D +" \)'
Replacement = 'AssemblyVersion ("$ 1. $ (BuildNumber)")'
Files = 'GlobalAssemblyInfo.cs' />
<Exec Command = "attrib -r xunit.installer \ App.manifest" />
</ Target>
Dadurch wird das AssemblyVersion-Attribut gefunden und die abcd-Versionsnummer durch abcBuildNumber ersetzt. Normalerweise lassen wir die Quelle im Baum eingecheckt, wobei die ersten drei Teile der Builder-Nummer festgelegt sind und der vierte Teil bei Null liegt (z. B. heute 1.0.2.0).
Stellen Sie in Ihrem Erstellungsprozess sicher, dass die Aufgabe SetVersionNumber Ihrer Erstellungsaufgabe vorausgeht. Am Ende verwenden wir unsere Zip-Aufgabe, um die Build-Ergebnisse zu komprimieren, sodass wir für jeden automatisierten Build einen Verlauf der Binärdateien haben.