2012-03-07 39 views
11

Chúng tôi đang cố gắng dọn dẹp một nhóm lớn mã trường màu nâu, đồng thời một nhóm đang thêm chức năng mới. Chúng tôi muốn đảm bảo thay đổi và mã mới được làm sạch từ bất kỳ trình biên dịch/phân tích mã hoặc cảnh báo nào khác, nhưng có quá nhiều mã để bắt đầu bằng cách dọn sạch giải pháp hiện tại.Tìm kiếm hoạt động xây dựng phá vỡ công trình xây dựng khi cảnh báo mới được giới thiệu

Chúng tôi đang sử dụng TFS 2010.

Vì vậy, sau đây được đề xuất:

  • Viết/chọn một hoạt động xây dựng mà so sánh danh sách các cảnh báo trong việc xây dựng đối với các dòng mã đó đã thay đổi với mà check-in.
  • Nếu cảnh báo cung cấp số dòng và số dòng đó đã được thay đổi, không thành công.

Tôi hiểu điều này sẽ không tìm thấy tất cả các cảnh báo mới và những thứ được giới thiệu trong các phần khác của mã sẽ không bị gắn cờ, nhưng ít nhất là điều gì đó.

Một tùy chọn khác mà đã được đề xuất:

  • Hãy so sánh danh sách các cảnh báo của biết trước build tốt so với danh sách các build này. Nếu có cảnh báo mới (theo dõi trên cấp tên tệp), không xây dựng được.

Mọi tác vụ đã biết có thể cung cấp chức năng được cho biết?

Bất kỳ hành động tương tự nào có thể hành động trên báo cáo Phạm vi mã?

+1

Bạn đang sử dụng phiên bản TFS nào? –

+0

Chúng tôi đang sử dụng TFS 2010, cập nhật ở trên – jessehouwing

+1

Điều này trông giống như một yêu cầu tính năng tuyệt vời cho dự án Cộng đồng TFS Build Extension CodePlex: http://tfsbuildextensions.codeplex.com/ –

Trả lời

4

Hoạt động sau đây chỉ là phương pháp cơ bản, trả về false nếu bản dựng hiện tại của bạn có cảnh báo ít hơn hoặc bằng nhau so với lần xây dựng cuối cùng và true nếu chúng tăng lên.
Một hoạt động có thể xác định vị trí cảnh báo mới và/hoặc hiện tại với vị trí của họ trong mã sẽ vượt trội hơn hẳn, nhưng tôi nghĩ rằng đây có thể là một startpoint thú vị:

using System; 
using System.Activities; 
using Microsoft.TeamFoundation.Build.Client; 
using Microsoft.TeamFoundation.Build.Workflow.Activities; 

namespace CheckWarnings 
{ 
    [BuildActivity(HostEnvironmentOption.Agent)] 
    public sealed class CheckWarnings : CodeActivity<bool> 
    { 
     [RequiredArgument] 
     public InArgument<IBuildDetail> CurrentBuild { get; set; } //buildDetail 
     public InArgument<string> Configuration { get; set; }  //platformConfiguration.Configuration 
     public InArgument<string> Platform { get; set; }   //platformConfiguration.Platform 


     protected override bool Execute(CodeActivityContext context) 
     { 
      IBuildDetail currentBuildDetail = context.GetValue(CurrentBuild); 
      string currentConfiguration = context.GetValue(Configuration); 
      string currentPlatform = context.GetValue(Platform); 

      Uri lastKnownGoodBuildUri = currentBuildDetail.BuildDefinition.LastGoodBuildUri; 
      IBuildDetail lastKnownGoodBuild = currentBuildDetail.BuildServer.GetBuild(lastKnownGoodBuildUri); 

      int numOfCurrentWarnings = GetNumberOfWarnings(currentBuildDetail, currentConfiguration, currentPlatform); 
      context.TrackBuildMessage("Current compile presents " + numOfCurrentWarnings + " warnings.", BuildMessageImportance.Normal); 

      int numOfLastGoodBuildWarnings = GetNumberOfWarnings(lastKnownGoodBuild, currentConfiguration, 
                   currentPlatform); 
      context.TrackBuildMessage("Equivalent last good build compile presents " + numOfLastGoodBuildWarnings + " warnings.", BuildMessageImportance.Normal); 

      if (numOfLastGoodBuildWarnings < numOfCurrentWarnings) 
      { 
       return true; 
      } 
      return false; 
     } 

     private static int GetNumberOfWarnings(IBuildDetail buildDetail, string configuration, string platform) 
     { 
      var buildInformationNodes = 
       buildDetail.Information.GetNodesByType("ConfigurationSummary"); 

      foreach (var buildInformationNode in buildInformationNodes) 
      { 
       string localPlatform, numOfWarnings; 
       string localConfiguration = localPlatform = numOfWarnings = ""; 
       foreach (var field in buildInformationNode.Fields) 
       { 

        if (field.Key == "Flavor") 
        { 
         localConfiguration = field.Value; 
        } 
        if (field.Key == "Platform") 
        { 
         localPlatform = field.Value; 
        } 
        if (field.Key == "TotalCompilationWarnings") 
        { 
         numOfWarnings = field.Value; 
        } 
       } 
       if(localConfiguration == configuration && localPlatform == platform) 
       { 
        return Convert.ToInt32((numOfWarnings)); 
       } 
      } 
      return 0; 
     } 
    } 
} 

Lưu ý rằng hoạt động này không cung cấp với xử lý ngoại lệ và cần được tinh chỉnh thêm, trong trường hợp các định nghĩa xây dựng của bạn xây dựng nhiều giải pháp.

Phải mất ba đầu vào args (buildDetail, platformConfiguration.ConfigurationplatformConfiguration.Platform) và phải được đặt trực tiếp sau hoạt động Run MSBuild.

+0

Trông giống như một điểm khởi đầu khá tốt :). Cảm ơn! – jessehouwing

+0

Tôi sẽ quay lại với phiên bản cập nhật khi tôi tìm thấy thời gian cho nó :) – jessehouwing

Các vấn đề liên quan