@kotyのブログ

.NETとかJavaとかPythonとか勉強会のこととかを、田舎者SEがつづります。記事のライセンスは"CC BY"でお願いします。

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)};
        }
    }
}