2011-09-26 12 views
5

मर्ज करने से कार्य आइटम प्राप्त करें मुझे टीएफएस 2010 में निर्माण के पूरा होने पर एक ईमेल भेजने की आवश्यकता है जो इस बिल्ड के हिस्से के रूप में संकलित किए गए चेक-इन से जुड़े कार्य आइटम का विवरण देता है। यह बिल्ड वर्कफ़्लो में उपलब्ध associatedChangesets चर के उपयोग के माध्यम से कोई समस्या नहीं है।टीएफएस 2010 एपीआई -

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

क्या कोई जानता है कि टीएफएस 2010 एपीआई का उपयोग करके इसे कैसे पूरा किया जाए? ऐसा लगता है कि एक एपीआई परिप्रेक्ष्य से काफी खराब दस्तावेज किया गया है। मुझे पता है कि आप वीएस -2010 में विलय इतिहास नोड का विस्तार कर सकते हैं लेकिन जाहिर है यह कोई अच्छा नहीं है क्योंकि इस डेटा को प्रोग्रामिक रूप से एकत्रित करने की आवश्यकता है ताकि एक रिपोर्ट ईमेल भेजा जा सके।

+0

क्या यह एक डुप्लिकेट/सबसेट हो सकता है: http://stackoverflow.com/questions/7536323/how-to-determine-the-work-items-fixed-in-a-particular-tfs-build-when उपयोग करना शाखा – pantelif

उत्तर

7

ठीक है ... मुझे लगता है कि मुझे इसका समाधान मिला है, हालांकि यह उलझन में है और सच कहा जाता है कि मुझे बिल्कुल यकीन नहीं है कि यह कैसे काम करता है। लेकिन यहां जाता है - शायद यह किसी को सही दिशा में इंगित करेगा।

var associatedWorkItems = new List<WorkItem>(); 

//Passed in from the build workflow (this variable is available under the 'Run On Agent' sequence as 'associatedChangesets' 
IList<Changeset> associatedChangesets = context.GetValue(BuildAssociatedChangesets); 

if (associatedChangesets.Count > 0) 
{ 
    var projectCollection = 
     new TfsTeamProjectCollection(new Uri("http://localhost:8080/tfs/DefaultCollection")); 
    VersionControlServer versionControlServer = projectCollection.GetService<VersionControlServer>(); 

    foreach (var changeset in associatedChangesets) 
    { 
     //In order to view the individual changes, load the changeset directly from the VCS. 
     Changeset localChangeset = versionControlServer.GetChangeset(changeset.ChangesetId); 

     foreach (Change change in localChangeset.Changes) 
     { 
      //Find out what was merged in. 
      ChangesetMerge[] mergedChangesets = versionControlServer.QueryMerges(
       null, 
       null, 
       change.Item.ServerItem, 
       new ChangesetVersionSpec(localChangeset.ChangesetId), 
       new ChangesetVersionSpec(localChangeset.ChangesetId), 
       null, 
       RecursionType.Full); 

      //Extract work item information from changesets being identified as merged. 
      foreach (var changesetMerge in mergedChangesets) 
      { 
       Changeset actualChange = versionControlServer.GetChangeset(changesetMerge.SourceVersion); 

       foreach (WorkItem item in actualChange.WorkItems) 
       { 
        if (!associatedWorkItems.Exists(w => w.Id == item.Id)) 
        { 
         associatedWorkItems.Add(item); 
        } 
       } 
      } 
     } 
    } 
} 

मुझे मत पूछो वास्तव में कैसे काम करता है QueryMerges लेकिन सभी मैं यहाँ कर रहा हूँ यह मुझे दिखा क्या क्या एक changeset में जाँच के एक भाग के रूप में विलय कर दिया कह। आपको लगता है कि मानकों ChangesetVersionSpec ही कर रहे हैं पर ध्यान देंगे - इसका मतलब है कि हम सिर्फ इस बदलाव से विलय कर रहे हैं।

आप QueryMerges() से ChangesetMerge ऑब्जेक्ट्स की एक सरणी वापस प्राप्त करेंगे। ChangesetMerge क्लास में SourceVersion नामक एक प्रॉपर्टी है - यह मूल परिवर्तन के ChangesetId में विलय हो गया है। एक बार हमें यह पता चला है कि हम व्यक्तिगत सेट लोड करने और वर्कआईटम निकालने के लिए VersionControlServer.GetChangeset() विधि का उपयोग कर सकते हैं। इसके बाद इसे वर्कइटम की एक सूची में जोड़ा जाता है जिसे आप चाहते हैं (मेरे मामले में एक ईमेल) में छेड़छाड़ की जा सकती है। मैंने यह भी सुनिश्चित करने के लिए .xists() जांच का उपयोग किया है कि वही वर्कइटम दो बार रिकॉर्ड नहीं होता है।

ध्यान दें कि भले ही आपके पास बिल्ड वर्कफ़्लो से 'संबद्ध चेंजसेट्स' संग्रह है, कुछ कारणों से (मेरे लिए कम से कम), 'जुड़े चेंजसेट्स' के अंदर परिवर्तन [] संपत्ति कभी पॉप्युलेट नहीं हुई थी (इसलिए प्रत्येक व्यक्तिगत परिवर्तन को लोड करना VersionControlServer.GetChangeset() विधि वास्तव में हमें आवश्यक सभी फ़ील्ड को पॉप्युलेट करने लगती है।

जैसा कि मैंने कहा, 1. यह एक घबराहट समाधान है (लूपिंग के बहुत सारे - जिनमें से कुछ शायद अनावश्यक है), 2. मैं नहीं करता यह पूरी तरह से समझ में नहीं आता है कि यह कैसे काम करता है हालांकि यह आवश्यक परिणाम उत्पन्न करता है - मैं इस निष्कर्ष पर बहुत परीक्षण और डिबगिंग करके आया था) और आखिरकार - माइक्रोसॉफ्ट द्वारा प्रदान किए गए दुखी दस्तावेज के आधार पर यह सबसे अच्छा हो सकता है।

उम्मीद है कि यह किसी की मदद करेगी!

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