TFS – walidacja komentarzy do commitów gita

Ostatnio natrafiłem na ciekawy problem związany z obsługą gita przez Team Foundation Server. W związku z zapominaniem o  wpisywaniu numeru zadania z TFS chciałem to wymusić. Po zapytaniu Wujka Google okazało się, że o ile git sam w sobie wspiera walidację komentarzy do commitów, to TFS niestety takiej funkcjonalności nie udostępnia.

Nie pozostawało mi nic innego niż napisać własny plugin, który by na to pozwalał. W trakcie poszukiwań informacji na ten temat natrafiłem na post Karstena Kemple (link), który rozwiązywał problem dla TFS 2013. Podczas testów rozwiązania na maszynie wirtualnej wyszło na jaw, że tekst, który przypiszemy do parametru out string statusMessage nie zostaje przekazany do klienta gita, który wysyłał kod na serwer. Powodowało to, że użytkownik niestety nie otrzymywał dokładnej informacji zwrotnej czemu jego commit zostawał odrzucony przez zdalną maszynę.

Postanowiłem, więc zaktualizować TFS do wersji 2015 Update 3 aby sprawdzić zachowanie pluginu. Po podmianie bibliotek podanych przez Karstena na nowsze okazało się, że zmieniła się definicja metody ProcessEvent interfejsu ISubscriber. W związku z tym czekało mnie napisanie pluginu właściwie od nowa. Poniżej przedstawiam ten proces.

1. Utwórz nowy projekt typu Class Library

 

2. Następnie dodaj do niego następujace biblioteki

 

3. Dodaj klasę, która implementuje interfejs ISubscriber

Deklaracja:

public interface ISubscriber
  {
    string Name { get; }
    SubscriberPriority Priority { get; }

    EventNotificationStatus ProcessEvent(IVssRequestContext requestContext, NotificationType notificationType, object notificationEventArgs, out int statusCode, out string statusMessage, out ExceptionPropertyCollection properties);
    Type[] SubscribedTypes();
  }
  • Name – nazwa subskrybenta, powinna być unikatowa
  • Priority – priorytet wykonania
  • SubscribedTypes – typy powiadomień, które subskrybent ma obsługiwać
  • ProcessEvent – metoda wywoływana gdy obsługiwane powiadomienie jest publikowane

4. Zaimplementuj metodę ProcessEvent

5. Gdy commit nie spełni wymagań walidacji zwróć EventNotificationStatus.ActionDenied

Jeśli przypiszesz do pola statusMessage jakiś tekst, zostanie on wyświetlony użytkownikowi, który wrzuca kod na zdalne repozytorium

6. Aby zainstalować plugin skopiuj plik .dll będący wynikiem kompilacji projektu do katalogu (katalog główny serwera TFS)\Application Tier\Web Services\bin\Plugins 

TFS powinien wykryć skopiowaną dllkę i automatycznie ją wczytać, ale dla pewności możesz zrestartować pulę aplikacji do niego przypisaną, ewentualnie cały serwer IIS.