Microsoft hat auf Codeplex ein Template zur Verfügung gestellt, dass für Visual Studio Team System 2008 (VSTS) eine hierarchische Abbildung von Work Items ermöglicht. Mit TFS 2010 wird die Hierarchie nun aber von Haus aus unterstützt und somit ist mit Sicherheit eine Reimplementierung dieses Templates notwendig. Zur Zeit steht aber weder dieses Template auf Codeplex zur Verfügung noch, dass es Infos zu diesem Template im Zusammenhang mit TFS 2010 existieren.
Wir haben dieses Template etwas abgewandelt eingesetzt und standen jetzt aber vor dem Schritt, wie wir dieses weiter unter TFS 2010 supporten, bevor die Projekte auslaufen oder auf neue Templates migriert werden. Die gute Nachricht vorweg, wir haben einen Weg für uns gefunden, den zugehörigen Dienst weiterhin funktionstüchtig zu halten. Dazu hier ein kurzer Abriss zu den notwendigen Schritten:
- Es bietet sich an die Solution mit Visual Studio 2010 zu öffnen und die verwendeten Referenzen auf den TFS neu zu setzen (von Version 9.0.0.0 auf 10.0.0.0)
Das gilt für das Projekt “MptCodeLibrary” und “Test.UnitTest” - Ein Recompile des Codes liefert jetzt einige Warnungen von denen man einige sehr schnell abarbeiten kann. Folgende Änderung sollte man auf jeden Fall durchführen:
1: TeamFoundationServer tfs
2: = TeamFoundationServerFactory.GetServer(serverName)
ersetzen durch:
1: TfsTeamProjectCollection tfs
2: = TfsTeamProjectCollectionFactory.
3: GetTeamProjectCollection(new Uri(serverName));
- In der App.config müssen die WCF Einstellungen an 2 Stellen angepasst werden, weitere Infos findet man auch hier und hier:
basicHttpBinding zu wsHttpBinding
und wsHttpBinding muss an der entsprechenden Stelle noch konfiguriert werden:1: <bindings>
2: <webHttpBinding>
3: ...
4: </webHttpBinding>
5: <wsHttpBinding>
6: <binding name="noSecurity">
7: <security mode="None"/>
8: </binding>
9: </wsHttpBinding >
10: </bindings>
- Es muss jetzt die URL der Collection zu den Team Projekten in die App.config eingetragen werden.
1: <teamServerSection>
2: <teamservers>
3: <teamserver servername="http://tfs:8080/tfs/default" />
4: </teamservers>
5: </teamServerSection>
- In der TeamFoundationFacade muss in einer Methode die Sid ermittelt und mit übergeben werden (alter Code wurde auskommentiert):
1: public void SignupForReceivingEvent(string serverName,
2: string receiverPath, string filterExpression)
3: {
4: ...
5: try
6: {
7: //eventEndpoint.SubscribeEvent("Sid is ignored",
8: // "WorkItemChangedEvent", filterExpression, delPreference);
9: // get sid from current user
10: string sid
11: = System.Security.Principal.WindowsIdentity
12: .GetCurrent().User.Value;
13: eventEndpoint.SubscribeEvent(sid, "WorkItemChangedEvent",
14: filterExpression, delPreference);
15: }
16: ...
17: }
- Jetzt sollte man den Stand erreicht haben, dass wieder Events am Service ankommen, doch leider werden sie noch nicht richtig bearbeitet. Dazu muss eine weitere kleine Anpassung in GlobalListBuilder erfolgen (in diesem Fall wurde nur für eine Collection eine Unterstützung eingebaut!!!):
1: private string DeriveTfsServerName(
2: XContainer workItemChangedEvent)
3: {
4: ...
5: Uri artifactMoniker = new Uri(displayUrlElement.First().Value);
6: //IEnumerable<TeamServerConfiguration> teamServers
7: // = from teamServer in mptConfiguration.TeamServers where ...
8: ...
9: //if (teamServers.Count() <= 0)
10: // throw new MptException("Could not determine the TFS...
11: return artifactMoniker.Scheme + "://"
12: + artifactMoniker.Authority
13: +"/tfs/defaultCollection";
14: }
- Jetzt sollte sowohl der Dienst als auch das TFS Event empfangen und bearbeiten funktionieren.
Ziel ist es nach der Migration des TFS 2008 auf TFS 2010 die Projekte mit dem MPT Template weiter zu unterstützen, aber perspektivisch auf ein neues Template zu migrieren. Dazu wollen wir die Tools von der TfsIntegration Plattform verwenden. Vielleicht kann ich ja dazu in den kommenden Wochen auch noch Erfahrungsberichte veröffentlichen.