2012-03-07 25 views
11

हम ब्राउन फील्ड कोड का एक बड़ा गुच्छा साफ करने का प्रयास कर रहे हैं, जबकि एक टीम नई कार्यक्षमता जोड़ रही है। हम निश्चित रूप से बदलना चाहते हैं और किसी भी कंपाइलर/कोड विश्लेषण या अन्य चेतावनियों से नया कोड साफ़ किया गया है, लेकिन वर्तमान समाधान को साफ करके उनमें से बहुत से लोग शुरू कर सकते हैं।नई निर्माण चेतावनी दी जाती है जब बिल्डिंग तोड़ती है

हम TFS 2010

तो निम्नलिखित प्रस्तावित किया गया था का उपयोग कर रहे:

  • लिखें/निर्माण गतिविधि है जो कोड की पंक्तियों के साथ बदल के खिलाफ निर्माण में चेतावनी की सूची तुलना चयन वह चेक-इन
  • यदि चेतावनी एक लाइन नंबर प्रदान करती है, और वह पंक्ति संख्या बदल दी गई थी, तो बिल्ड विफल हो गई।

मुझे समझ में आता है कि कोड की अन्य भागों में पेश की गई सभी नई चेतावनियां और चीजें नहीं मिलेंगी, लेकिन कम से कम कुछ है।

एक अन्य विकल्प है कि प्रस्तावित किया गया था:

  • इस बिल्ड की सूची के खिलाफ पिछले ज्ञात अच्छी निर्माण की चेतावनी की सूची की तुलना करें। अगर नई चेतावनियां हैं (फ़ाइल नाम स्तर पर ट्रैक करें), बिल्ड विफल करें।

वहां कोई ज्ञात क्रियाएं जो कार्यक्षमता प्रदान कर सकती हैं?

कोड कवरेज रिपोर्ट पर कार्य करने वाली कोई भी ऐसी कार्रवाइयां?

+1

आप किस टीएफएस का उपयोग कर रहे हैं? –

+0

हम – jessehouwing

+1

से ऊपर अपडेट किए गए टीएफएस 2010 का उपयोग कर रहे हैं, यह समुदाय टीएफएस बिल्ड एक्सटेंशंस कोडप्लेक्स प्रोजेक्ट के लिए एक महान फीचर अनुरोध जैसा दिखता है: http://tfsbuildextensions.codeplex.com/ –

उत्तर

4

यह निम्न गतिविधि केवल एक मूलभूत दृष्टिकोण है, जो false देता है यदि आपके वर्तमान निर्माण में आपके अंतिम निर्माण और true से बढ़ी हुई चेतावनी कम है या नहीं।
एक और गतिविधि कि नई चेतावनी पता लगा सकते हैं और/या कोड में उनके स्थान के साथ मौजूद स्पष्ट रूप से बेहतर हो सकता है, अभी तक मुझे लगा कि यह एक दिलचस्प startpoint हो सकता है:

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

ध्यान दें कि इस गतिविधि प्रदान नहीं करता है अपवाद हैंडलिंग के साथ और आगे परिष्कृत किया जाना चाहिए, यदि आपकी बिल्ड परिभाषाएं एक से अधिक समाधान बनाती हैं।

इसमें तीन इनपुट तर्क (buildDetail, platformConfiguration.Configuration और platformConfiguration.Platform) लेते हैं और Run MSBuild गतिविधि के बाद सीधे रखा जाना चाहिए।

+0

काफी अच्छा प्रारंभ बिंदु की तरह दिखता है :)। धन्यवाद! – jessehouwing

+0

एक बार जब मैं इसके लिए समय पाता हूं तो मैं एक अद्यतन संस्करण के साथ वापस आऊंगा :) – jessehouwing

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^