Makale Özeti

Bu makalemde sizlerle Team Foundation Server 2010 tarafından yayınlanan olay bildirimlerine oluşturacağımız bir WCF hizmeti ile nasıl abone olabileceğimizi paylaşıyor olacağım.

Makale

   Microsoft Team Foundation Server, tasarım olarak pek çok noktada bizlere sunduğu özellikleri kullanarak yeni özellikler sunmamızı sağlamak amacıyla esnek ve genişletilebilir olarak tasarlanmıştır. Bu esneklikler arasında belki de en önemlilerinden birisi olay bildirimleridir. Yapılandırma yönetimi (configuration management), kaynak kodu kontrolü (source control), iş kalemi takibi (work item tracking), tümleşik entegrasyon (continuous Integration) gibi pek çok birbirinden bağımsız bileşene sahip olan Team Foundation Server, yaşam döngüsü içerisinden bu parçalarda oluşan aktiviteler doğrultusunda çeşitli bildirimler ile bu aktivitelerden haberdar olmak isteyen abonelerini bilgilendirebilir. Hatta bunun bir adım ötesinde, istenirse kendi özel olay bildirimlerimizi oluşturup Team Foundation Server yaşam döngüsü içerisine dahil edebiliriz. Konuyu çok fazla dağıtmamak adına bu makalemde sizlerle Team Foundation Server tarafından yayınlanan bu olay bildirimlerine nasıl abone olabileceğimizi paylaşıyor olacağım. İlerleyen makalelerimde, fırsat buldukça nasıl kendi özel olay bildirimizi oluşturarak Team Foundation Server yaşam döngüsüne dahil edebileceğimizi de sizlerle paylaşıyor olacağım.

   Team Foundation Server’ın harici sistemler ile haberleşmesini de sağlayan olay bildirimleri, örneğin; bir kullanıcıya atanan yeni bir işten harici bir süreç yönetimi yazılımının da haberdar olabilmesini ya da yapılan bir check-in işlemi sonrasında kodun harici bir uygulama tarafından incelenmesinin tetiklenmesi sağlayabilir. Bu kullanımlar dışında Team Foundation Server’ın kendisi dahi bu mekanizmayı kullanmakta, buna en güzel örnek Visual Studio içerisindeki team explorer tabında bulunan “project alerts” diyaloğudur.

Project Alerts diyaloğu

   Project Alerts diyaloğu yardımıyla Team Foundation Server projelerinizde size atanmış iş kalemlerindeki değişikliklerde, yapılan bir check-in’de, build kalitesinin değişmesinde, kendinizin tetiklediği ya da herhangi birisi tarafından tetiklenmiş olan build işlemleri tamamlandığında belirttiğiniz email adresine bir mail gönderimi yapılmakta. Bu diyalog aslında arka planda yer alan Team Foundation Server olay bildirimleri aboneliği için hazırlanmış basit bir ekrandır.

   Project Alerts diyaloğuyla yaptığınız tüm işlemleri ve daha fazlasını komut satırından BisSubscribe.exe uygulaması yardımıyla da gerçekleştirebilirsiniz. Team Foundation Server’ın kurulu olduğu sunucuda bulunan %ProgramFiles%\Microsoft Team Foundation Server 2010\Tools klasörü altında bulabileceğiniz  bu uygulama aynı zamanda kendi geliştirdiğiniz istemcilerin olay aboneliklerini yapmak için de kullanılabilir. Olay türü, adres,  teslim şekli, sunucu ve filtre parametrelerini kabul ederek işlem yapan bu uygulamanın kullanımına bu makalenin hedef konusu olmadığı için ilerleyen makalelerde değinmeyi planlamakla birlikte örnek olması adına yukarıda görülen check-in’lerde mail gönderilmesi için kullanılabilecek olan komut satırını aşağıda paylaşıyorum;

BisSubscribe /eventType CheckinEvent /address fatih@enterprisecoding.com /deliveryType EmailHtml /server http://scm:8080/tfs

 

    Team Foundation Server olay bildirimlerini C# içerisindeki olay (event) ile bağdaştırabiliriz, nasıl ki belirli bir kontrata/arayüze uygun olan fonksiyonlar yardımıyla C# olayları dinlenebiliyorsa, Team Foundation Server olay bildirimlerini de benzer şekilde belirli bir arayüze/şemaya uygun olan web servisleri vasıtasıyla dinleyebiliriz. Olay dinleme süreci istemci tarafında açılan ve biraz önce bahsettiğim arayüzü uygulayan bir web hizmeti (web service) ile başlamaktadır. İstemci, hizmetin çalışır duruma gelmesi sonrasında Team Foundation Server’a hizmet adresini, dinlemek istediği olay bildirimi detayları ile birlikte bildirerek aboneliğini başlatır. Aboneliğin başlaması sonrasında ilgili olay gerçekleştikçe Team Foundation Server olay verisiyle istemcinin belirttiği web hizmetini tetikleyecektir. Bu tetikleme sonrasında istemci kendi iş mantığını çalıştırabilir.

   Şimdi isterseniz adım adım bu süreçleri kodumuza aktaralım. İlk adımımız hizmet arayüzünü oluşturmak olmalı. Aşağıda Team Foundation Server tarafından olay bildirimlerinde kullanılan arayüzü bulabilirsiniz;

[ServiceContract(Namespace = "http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Notification/03")]
internal interface INotificationService {
    [OperationContract(Action = "http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Notification/03/Notify", 
ReplyAction = "*")] [XmlSerializerFormat(Style = OperationFormatStyle.Document)] void Notify(string eventXml, string tfsIdentityXml); }

   INotificationService arayüzü gördüğünüz gibi oldukça basit bir arayüz. Tek fonksiyonu olan Notify ile sunucuda oluşan olay bilgileri rahatlıkla uygulamamıza aktarılabilir. Notify fonksiyonunda dikkatinizi mutlaka çekmiştir, olay verisi string formatında bize aktarılmakta. Bunu nedeni daha öncede bahsettiğim gibi Team Foundation Server olay bildirimlerinin esnek ve gerektiğinde kullanıcıların kendi tanımlamalarını yapmasına izin vermesidir. Böylesi bir mimaride birbirinden çok farklı içeriği sahip olan olay verilerinin standart bir nesne üzerinde toplanması oldukça zordur. Bu sebeple veri xml yapısında; fakat string olarak kabul edilmelidir. İstemci, abone olduğu olay türünü bilmesi nedeniyle, gelecek olan xml yapısını bilebileceğinden ufak bir xml dönüşümü ile verileri nesnelere kolaylıkla bağlayabilir.

   INotificationService arayüzünde dikkat edilecek önemli bir nokta da gelen verinin deserilize edilirken içerik formatı doküman olarak işlenmeli. Yukarıda da görebileceğiniz gibi doküman olarak işlenmesi için fonksiyona XmlSeriliazerFormat özniteliği ile format stili olarak OperationFormatStyle.Document verilmesi yeterli olacaktır.

   ikinci adımda bu arayüzü uygulayan bir hizmet sınıfı oluşturmalı ve bunu bir wcf hizmeti üzerinden yayınlamalıyız. Bu adımımda teknik bir detay olmaması nedeniyle geçiyorum, takılmanız durumunda ilerleyen örneklerde bu konuda bilgi bulabilirsiniz.

   İlk iki adım ardından artık elimizde sunulmaya hazır bir web hizmeti bulunmakta. Team Foundation Server olay bildirim aboneliğimizi başlatmadan önce, hizmetimizi çalışır durumda istemcilere sunuyor olmamız gerekli. WCF ile uğraşanlarınız için aşağıdaki satırlarla hizmeti başlatmak hiç zor olmayacaktır;

hizmet = new ServiceHost(typeof(NotificationService), temelAdres);

hizmet.AddServiceEndpoint(typeof(INotificationService), new WSHttpBinding(SecurityMode.None), "NotificationService");
hizmet.Open();

   WSHttp bağlayıcısı ile sunduğumuz web hizmetimiz için kullanılacak temel adres tamamen sizin tercihinize kalmıştır. Kendi kullanımımda yukarıdaki örnekte yer alan ver Uri türündeki temelAdres değişkeni “http://<hizmetin çalıştığı makine adı>:8081” şeklinde bir değere sahip. Örneğimizde hizmetimiz http://<hizmetin çalıştığı makine adı>:8081/NotificationService adresine gelecek istekleri bekleyecek şekilde yapılandırılmış durumda.

   Bu işlemler ardında artık web hizmetimiz gelecek istekleri kabul etmeye hazır durumda beklemekte. Son adımımızda artık web hizmetimizi Team Foundation Server’a istek detayları ile bildirerek olay aboneliğimizi başlatabiliriz.

    Team Foundation Server’a programsal olarak bir olay aboneliği yapılması için IEventService hizmet kullanılabilir. Çalıştığımız aktif proje koleksiyonu üzerinde sorgulayarak ulaşabileceğimiz bu arayüz üzerindeki SubscribeEvent fonksiyonu sayesinde olay aboneliğimizi kolaylıkla başlatabiliriz. Bu adım programsal olarak işletilmek yerine yazımın başlarında sizinle paylaştığım BisSubscribe uygulaması yardımıyla komut satırından da gerçekleştirilebilir; fakat her zaman için kontrolün bizde olması bence daha iyidir.

var ekipProjeKoleksiyonu = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(tfsServerUri);
ekipProjeKoleksiyonu.EnsureAuthenticated();

olayHizmeti = (IEventService)ekipProjeKoleksiyonu.GetService(typeof(IEventService));

var teslimatSecenekleri = new DeliveryPreference {
    Address = temelAdres.AbsoluteUri + "NotificationService",
    Schedule = DeliverySchedule.Immediate,
    Type = DeliveryType.Soap
};

abonelikId = olayHizmeti.SubscribeEvent("CheckinEvent", string.Empty, teslimatSecenekleri);

   Yukarıda gördüğünüz  DeliveryPreference türünden teslimatSecenekleri değişkeni kullanılarak olay bildirimlerinin ne zaman, hangi şekilde ve hangi adres yapılacağını bildirmiş oluyorum. Örneğimiz için olay bildirimleri biraz önce açtığımız hizmetimize, anında ve soap protokolü üzerinden bildirilecek şekilde bir abonelik kaydı başlatılmakta.

  Örneğimizde Check-in olay bildirimleri için bir abonelik başlatılmakta. Team Foundation Server kurulumu sonrasında aşağıdaki olay türleri ön yüklü olarak gelmekte. Kurumunuzdaki Team Foundation Server yöneticilerinin kendi özel bildirimlerini de kayıt ettirmeleri halinde bu liste daha da uzayacaktır.

Hizmet Olay
Work Item Tracking WorkItemChangedEvent
Version Control CheckInEvent
Team Build BuildCompletionEvent2
Team Build BuildStatusChangeEvent
Team Build BuildCompletionEvent
Common Structure Service ProjectCreatedEvent
Common Structure Service ProjectDeletedEvent
GSS/Authorization/CSS DataChangedEvent

    İşte bu kadar kolay, bu adımların takip edilmesi sonrasında olay aboneliği başlayarak ilgili olaylar gerçekleştiğinde web hizmetinize veri akışı sağlanacaktır.

Check-In Notifier açılış ekranı

   Bu makalemde sizlerle paylaşmış olduğum Team Foundation Server 2010 olay aboneliği konusunda geliştirdiğim örnek bir projeyi http://fth.by/checkinnotifier adresinden sizlerle paylaşıyorum.

Yapılan her bir check-in sonrasında açılan özet bilgi ekranı    Yapılan her check-in ardından system tray’in hemen üzerinde bir diyalog ile check-in ve detayları hakkında hızlı bilgiler verilmekte.

 

 

 

 

 

 

 

Chanset Details ekranı üzerinden yapılan check-in’e ait detaylı bilgilere ulaşabilirsiniz;

Check-in'e ait detaylı bilgilerin verildiği Changeset Details diyaloğu

Effected Versioned Items diyaloğunda yapılan check-in’le eklenen/değiştirilen/silinen girdilere ulaşabilir, bu girdileri bir önceki sürümleri ile karşılaştırabilirsiniz;Check-in ile etkilenen dosyaların listelendiği Effected Versioned Items diyaloğu

Fatih Boy

http://www.enterprisecoding.com
http://twitter.com/fatihboy