TFSへのチェックインをフックする
メモっとく。チェックインをトリガーにメールを出したい、くらいならalert機能を使えばいいんですけどね。
詳しいことはソースを見てください。変更セットに関連づいた作業項目の取り方が分からないので、もう少し調べてみようと思います。というか、誰か教えてください。。。
これを使えばいろんなことができそう。
using System; using System.Net.Mail; using System.Text; using Microsoft.TeamFoundation.Common; using Microsoft.TeamFoundation.Framework.Server; using Microsoft.TeamFoundation.VersionControl.Server; namespace TfsHookEvent { /// <summary> /// ・Microsoft.TeamFoundation.Framework.Server.dll /// ・Microsoft.TeamFoundation.VersionControl.Server.dll /// はTFSをインストールしたサーバの /// c:\Program Files\Microsoft Team Foundation Server 2010\Application Tier\Web Services\bin /// から持ってきて参照設定する。 /// /// ・Microsoft.TeamFoundation.Common.dll /// を参照の一覧から、参照設定する。 /// /// ビルドしたDLLを、TFSサーバの /// c:\Program Files\Microsoft Team Foundation Server 2010\Application Tier\Web Services\bin\Plugins /// に置く。 /// </summary> public class CheckinHooker:ISubscriber { public string Name { get { return "TFS Hook Event Sample"; } } public SubscriberPriority Priority { //何の優先順位かは不明。。。ProcessEventが呼ばれる順番?? get { return SubscriberPriority.Normal; } } public EventNotificationStatus ProcessEvent(TeamFoundationRequestContext requestContext, NotificationType notificationType, object notificationEventArgs, out int statusCode, out string statusMessage, out ExceptionPropertyCollection properties) { statusCode = 0; properties = null; statusMessage = string.Empty; if (notificationType == NotificationType.Notification) { try { var checkinNotification = notificationEventArgs as CheckinNotification; Debug.WriteLine("変更セットID={0}", checkinNotification.Changeset); Debug.WriteLine("チェックインユーザーID={0}", checkinNotification.ChangesetOwnerName); Debug.WriteLine("チェックインコメント={0}", checkinNotification.Comment); //ほかにもいろんな情報を取れそう。 } catch (Exception exception) { //ここで出したエラーはイベントログに出る TeamFoundationApplication.LogException("ProcessEventでエラー", exception); //エラーは潰しとく。 } } return EventNotificationStatus.ActionPermitted; } public Type[] SubscribedTypes() { //フックするイベントの型を指定 //http://msdn.microsoft.com/en-us/library/dd545177(v=vs.110) //にある、なんちゃらNotificationを指定すれば良いと思われる。いろいろあるな。 return new[] {typeof (CheckinNotification)}; } } }