2016-04-13 8 views
1

Hintergrund:

Ich habe einen vor Ort TFS 2015 Update 1 Server. Im neuen TFS-Build-Stil werden Builds erstellt, die über eine Netzwerkfreigabe are not deleted when the build is deleted aus ablaufenden Aufbewahrungsrichtlinien erfolgen. Unser Setup kann keine serverbasierten Drops verwenden und wir müssen Netzwerkfreigaben verwenden.Wie werde ich von einem BuildDestroyedEvent benachrichtigt

Als eine Umgehung versuche ich einen Dienst zu schreiben, der benachrichtigt wird, wenn ein Build abläuft und gelöscht wird und es dann die zugehörige Netzwerkfreigabe für mich löschen kann.

Ausgabe:

Ich entdeckte die .NET TFS client libraries, in der Microsoft.TeamFoundationServer.Client NuGet Paket eine Microsoft.TeamFoundation.Build.WebApi.Events.BuildDestroyedEvent Klasse ist, die genau aussieht, was ich brauche. Ich kann jedoch nicht herausfinden, wie ich mich diesem Event "unterzeichne".

Ich fand a good tutorial mit der Microsoft.TeamFoundationServer.ExtendedClient API, die ein Abonnement für eine WorkItemChangedEvent mit einem Web-Callback zeigt. Wenn ich jedoch eine BuildDestroyedEvent versuchte, erhalte ich einen Fehler.

const string collectionUri = "https://tfs.example.com:8081/tfs/MyCollection"; 
static void Main(string[] args) 
{ 
    using (TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(new Uri(collectionUri))) 
    { 
     tpc.Authenticate(); 
     tpc.EnsureAuthenticated(); 

     var eventService = tpc.GetService<IEventService>(); 

     DeliveryPreference del = new DeliveryPreference(); 
     del.Address = "http://srchamberlain.example.com/TestWebApp/api/destroyEventSink"; 
     del.Schedule = DeliverySchedule.Immediate; 
     del.Type = DeliveryType.Soap; 


     var id = eventService.SubscribeEvent("BuildDestroyedEvent", "", del); 
     Console.WriteLine(id); 
    } 

    Console.ReadLine(); 
} 

Der Fehler, den ich auf der SubscribeEvent Linie bekommen, ist

 
Microsoft.TeamFoundation.Framework.Client.TeamFoundationServiceException was unhandled 
    ErrorCode=0 
    EventId=3000 
    HResult=-2146232832 
    IsRemoteException=true 
    LogException=false 
    Message=Event type BuildDestroyedEvent does not exist. 
    ReportException=false 
    Source=Microsoft.TeamFoundation.Client 
    StackTrace: 
     at Microsoft.TeamFoundation.Client.Channels.TfsHttpClientBase.HandleReply(TfsClientOperation operation, TfsMessage message, Object[]& outputs) 
     at Microsoft.TeamFoundation.Client.Channels.TfsHttpClientBase.Invoke(TfsClientOperation operation, Object[] parameters, TimeSpan timeout, Object[]& outputs) 
     at Microsoft.TeamFoundation.Client.Channels.TfsHttpClientBase.Invoke(TfsClientOperation operation, Object[] parameters, Object[]& outputs) 
     at Microsoft.TeamFoundation.Client.Channels.TfsHttpClientBase.Invoke(TfsClientOperation operation, Object[] parameters) 
     at Microsoft.TeamFoundation.Framework.Client.EventWebService.SubscribeEvent(String userId, String eventType, String filterExpression, DeliveryPreference preferences, String projectName) 
     at Microsoft.TeamFoundation.Framework.Client.TeamFoundationEventService.SubscribeEvent(String eventType, String filterExpression, DeliveryPreference preferences) 
     at SandboxConsole.Program.Main(String[] args) in D:\Code\SandboxConsole\SandboxConsole\Program.cs:line 33 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 
     Actor="" 
     HResult=-2146233087 
     Lang=en 
     Message=Event type BuildDestroyedEvent does not exist. 
     Node="" 
     Role="" 
     InnerException: 

Frage:

Was ist der richtige Weg, um eine Benachrichtigung über die Microsoft.TeamFoundation.Build.WebApi.Events.BuildDestroyedEvent Brennen erhalten?

+1

Möchten Sie Builds in Echtzeit löschen? Wenn nicht, würde ein täglicher Job funktionieren, der nur einen Aufruf ausführt, um Builds zu erhalten, um zu prüfen, ob sie gelöscht sind oder nicht. –

+0

Gute Idee, ich denke, ich werde das als Backup-Plan verwenden –

Antwort

0
  1. collectionUri für VSTS ist immer https://xxx.visualstudio.com/DefaultCollection, anderes Format nicht erkannt werden kann.

  2. Die Tutorials sind alle für TFS On-Premise, nicht VSTS. Da es sich bei Event Subscriptions um ein serverseitiges Plug-in handelt, aber VSTS gehostet wird, kann das Abonnement auf der Serverseite nicht ausgeführt werden. .Net-Ereignisabonnements werden in VSTS nicht unterstützt.

  3. VSTS unterstützt jetzt create a service hooks subscription, aber unterstützte Ereignisse enthalten BuildDestroyedEvent nicht. Veranstaltungen

unterstützt:

  • Build abgeschlossen
  • Code geschoben (für Git Team-Projekte)
  • -Pull-Request erstellen oder aktualisiert (für Git Team-Projekte)
  • Code eingecheckt (TFVC-Teamprojekte)
  • Arbeitselement erstellt, aktualisiert, gelöscht, wiederhergestellt oder kommentiert
  • Nachricht an einen Teamraum gepostet

Sie können also den Ratschlag von Harshil Lodhi als Workaround nehmen.

+0

Für Punkt 1, ich bin TFS on-premise laufen, ich versuche, eine Verbindung zu einem lokal laufenden TFS 2015 Update 1 (Wir planen auf Update 2 dies zu aktualisieren Wochenende). Außerdem möchte ich immer noch wissen, wie man das 'Microsoft.TeamFoundationServer.Client' NuGet-Paket verwendet, was die Art ist, *** *** *** der Ereignisse in den' Microsoft.TeamFoundation.Build.WebApi.Events *** zu "subscribieren" 'Namensraum. –

+0

Ich denke, nur die Ereignisse, die als Teil der Service-Hooks verfügbar sind, können abonniert werden. Sie können zu den Einstellungen auf der Registerkarte "TFS-Webbenutzeroberfläche" und "Service-Hooks" gehen, um die Ereignisse anzuzeigen. –

+0

Was ist mit Dingen, die als Plugins funktionieren und nicht als externe Services, bekommen sie nicht mehr Zugriff? Der "Dienst", den ich schreibe, muss kein externer Dienst sein, ich kann es als ein Plugin für TFS schreiben, ich kann einfach nicht herausfinden, wie ich auf die Informationen zugreifen soll. –

Verwandte Themen