C# TFS成功生成警报电子邮件(如果最后生成的是失败的TFS插件)

C# TFS成功生成警报电子邮件(如果最后生成的是失败的TFS插件),c#,visual-studio,tfs,tfsbuild,C#,Visual Studio,Tfs,Tfsbuild,我目前有TFS设置失败和成功构建的电子邮件警报。我认为成功构建电子邮件只是一种噪音,我只想在上一次构建失败时收到它们 我的想法是取消任何成功构建的TFS警报电子邮件,但在构建失败后启用它以获得成功 我已经成功地连接了代码,用TFS插件确定上次构建是否失败,当前构建是否成功 public EventNotificationStatus ProcessEvent(TeamFoundationRequestContext requestContext, NotificationType notific

我目前有TFS设置失败和成功构建的电子邮件警报。我认为成功构建电子邮件只是一种噪音,我只想在上一次构建失败时收到它们

我的想法是取消任何成功构建的TFS警报电子邮件,但在构建失败后启用它以获得成功

我已经成功地连接了代码,用TFS插件确定上次构建是否失败,当前构建是否成功

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;

    var objWriter = new System.IO.StreamWriter(@"C:\tfsTests\builds.txt", true);
    objWriter.WriteLine(DateTime.Now + "-----------------------------------------------");
    objWriter.WriteLine(DateTime.Now + notificationType.ToString());
    objWriter.WriteLine(DateTime.Now + notificationEventArgs.ToString());

    if ((notificationType == NotificationType.Notification) && (notificationEventArgs is BuildCompletionNotificationEvent))
    {
        var buildNotificationEventArgs = notificationEventArgs as BuildCompletionNotificationEvent;
        objWriter.WriteLine(DateTime.Now + buildNotificationEventArgs.Build.ToString());
        objWriter.WriteLine(DateTime.Now + buildNotificationEventArgs.Build.Definition.BuildControllerUri.ToString());
        objWriter.WriteLine(DateTime.Now + buildNotificationEventArgs.Build.Definition.LastGoodBuildUri);
        objWriter.WriteLine(DateTime.Now + buildNotificationEventArgs.Build.Definition.LastBuildUri);

        var locationService = requestContext.GetService<TeamFoundationLocationService>();
        var tfs = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(
            new Uri(locationService.GetServerAccessMapping(requestContext).AccessPoint + "/" + requestContext.ServiceHost.Name));
        var buildServer = (IBuildServer)tfs.GetService(typeof(IBuildServer));

        var spec = buildServer.CreateBuildDetailSpec(buildNotificationEventArgs.Build.TeamProject, buildNotificationEventArgs.Build.Definition.Name);
        spec.MaxBuildsPerDefinition = 2;
        spec.QueryOrder = Microsoft.TeamFoundation.Build.Client.BuildQueryOrder.FinishTimeDescending;

        var builds = buildServer.QueryBuilds(spec);

        if (builds.Builds.Count() == 2)
        {
            if (builds.Builds[0].Status == BuildStatus.Succeeded && builds.Builds[1].Status != BuildStatus.Succeeded && builds.Builds[0].FinishTime > builds.Builds[1].FinishTime)
                objWriter.WriteLine(string.Format("{0}", "Send Email"));
        }
    }
    objWriter.Close();
    return EventNotificationStatus.ActionPermitted;
}
公共事件NotificationStatus ProcessEvent(TeamFoundationRequestContext、NotificationType、NotificationType、, 对象notificationEventArgs、out int statusCode、out string statusMessage、out ExceptionProperty集合属性) { statusCode=0; 属性=null; statusMessage=string.Empty; var objWriter=new System.IO.StreamWriter(@“C:\tfsTests\builds.txt”,true); objWriter.WriteLine(DateTime.Now+“-------------------------------------------------------------”; objWriter.WriteLine(DateTime.Now+notificationType.ToString()); objWriter.WriteLine(DateTime.Now+notificationEventArgs.ToString()); if((notificationType==notificationType.Notification)&&(notificationEventArgs是BuildCompletionNotificationEvent)) { var buildNotificationEventArgs=notificationEventArgs作为BuildCompletionNotificationEvent; objWriter.WriteLine(DateTime.Now+buildNotificationEventArgs.Build.ToString()); objWriter.WriteLine(DateTime.Now+buildNotificationEventArgs.Build.Definition.BuildControllerUri.ToString()); objWriter.WriteLine(DateTime.Now+buildNotificationEventArgs.Build.Definition.LastGoodBuildUri); objWriter.WriteLine(DateTime.Now+buildNotificationEventArgs.Build.Definition.LastBuildUri); var locationService=requestContext.GetService(); var tfs=tfstreamprojectcollectionfactory.GetTeamProjectCollection( 新Uri(locationService.GetServerAccessMapping(requestContext.AccessPoint+“/”+requestContext.ServiceHost.Name)); var buildServer=(IBuildServer)tfs.GetService(typeof(IBuildServer)); var spec=buildServer.CreateBuildDetailSpec(buildNotificationEventArgs.Build.TeamProject,buildNotificationEventArgs.Build.Definition.Name); spec.MaxBuildsPerDefinition=2; spec.QueryOrder=Microsoft.TeamFoundation.Build.Client.BuildQueryOrder.FinishTimeDescending; var builds=buildServer.QueryBuilds(spec); if(builds.builds.Count()==2) { 如果(builds.builds[0]。状态==BuildStatus.Successed&&builds.builds[1]。状态!=BuildStatus.Successed&&builds.builds[0]。FinishTime>builds.builds[1]。FinishTime) objWriter.WriteLine(string.Format(“{0}”,“发送电子邮件”); } } objWriter.Close(); 返回EventNotificationStatus.ActionAllowed; } 上面的代码工作正常,我收到了用文本文件写的发送电子邮件。
我只是不知道如何取消/激活TFS构建电子邮件。您知道如何执行此操作吗?

您已订阅生成事件。如果您使用的是TFS 2013或VSO,则可以在web access中打开团队项目,然后单击右上角的cog转到管理端。应该有一个警报选项卡


如果您仍在Visual Studio中的2012年以前的服务器上,则可以在团队资源管理器中右键单击团队项目并编辑警报。

警报资源管理器仅为您提供在生成成功或失败时发送电子邮件的选项。我想要失败的电子邮件,但我想要成功的电子邮件,只有当我在失败后修复一个构建时。这就是我不得不写这个插件的原因。我已经正确地计算出了失败构建后的成功构建。现在,我只需要停止在每个构建中发送的tfs构建电子邮件,并且只在失败后成功时才允许它。我正在使用TFS 2012,真不敢相信这不是一个内置功能!