Team Foundation Server liefert Tasks, welche MSBuild erweiternwie z.B. der GenCheckinNotesUpdateWorkItems Task.
Der GenCheckinNotesUpdateWorkItems Task assoziiert auf Basis von Version Control Labels, Changesets und Workitems, welche dann im Build Report angezeigt werden. Wird ein Build durchgeführt, wird ein Label gespeichert z.B. Label1. Ein Zweiter Build erstellt wiederum ein Label, Label2.Der GenCheckinNotesUpdateWorkItems sucht dann nach Changesets, deren Checkin zwischen Label1 und Label2durchgeführt wurde, die er dann auch im Reportausgibt.
Die so gefundenen Changesets werden auf assoziierteWorkitems untersucht und diese entsprechend im Reportangezeigt.
Soweit so gut... Schauen wir uns folgendes Szenario an:
Unser TeamProject hat 2 Solutions: TeamProject\BizLogic und TeamProject\Client.Es gibt ein Build, der beide Solutions "buildet".Ein zweiter Build, der nur die Solution BizLogic "buildet".
Nun ist die Anforderung, dass der Build BizLogic nurChangesets assoziiert, die im Scope der Solution BizLogic durchgeführt worden sind. Hört sich eigenlich ganz einfach an, ist es aber nicht,da im Default die Labels immer auf TeamProject Ebene gesetztwerden. Was dazu führt, dass auch ein Checkin in der Solution Client durch den Label Diff im Report angezeigt werden wird.
Wie lösen? Durch die Definition eines Scopesmit einem neuen Label, welches nur auf dem Bereich der Solution BizLogic gesetzt wird.
Hierzu erweitert man das Build .proj File der Solution BizLogic.In einer PropertyGroup definiert man <GetChangesetForFolder>,welches in unserem Fall die BizLogic ist. <LabelQueryScope> wird um diese Information erweitert,da der GenCheckinNotesUpdateWorkItems Task diesefür die Abfrage verwendet.
Dann das Target CoreLabel überschreiben, um das Labelin dem Scope der Solution BizLogic zu setzen.
<PropertyGroup>
<GetChangesetForFolder>BizLogic </GetChangesetForFolder>
<LabelQueryScope>@$/$(TeamProject)/$(GetChangesetForFolder) </LabelQueryScope>
</PropertyGroup>
<Target Name="CoreLabel"
Condition=" '$(IsDesktopBuild)'!='true' "
DependsOnTargets="$(CoreLabelDependsOn)" >
<Label
Condition=" '$(SkipLabel)'!='true' "
Workspace="$(WorkspaceName)"
Name="$(BuildNumber)@$/$(TeamProject)/$(GetChangesetForFolder)"
Version="W$(WorkspaceName)"
Files="$/$(TeamProject)/$(GetChangesetForFolder)"
Recursive="true" />
</Target>
Das wars :-) Ein Build von Bizlogic wird nun im Report nur Changesetsauflisten, die auch in diesem Scope durchgeführt wurden.
Noch ein Hinweis, der GenCheckinNotesUpdateWorkItems Taskist extrem Performance intensiv, mehr Infos hierzu findet Ihr hier.
Chris