2008-10-21 10 views
7

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

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

1) मैं कैसे सुनिश्चित करूं कि एक बदलाव किसी विशेष निर्माण से जुड़ा हुआ हो?

2) आखिरी अच्छी बिल्ड के बाद से शाखा में बदली गई फ़ाइलों की सूची कैसे प्राप्त कर सकता हूं? मेरे पास आखिरी सफलतापूर्वक निर्मित निर्माण है, लेकिन मुझे यकीन नहीं है कि परिवर्तनों की जांच किए बिना फ़ाइलों को कैसे प्राप्त किया जाए (जैसा ऊपर बताया गया है, निर्माण के साथ जुड़े नहीं हैं!)

उत्तर

9

धन्यवाद स्कॉट,

थोड़ी देर बाद मुझे इसका प्रबंधन करने का एक अच्छा तरीका मिला।

असल में मैंने एक ऐसा कार्य बनाया जो निर्माण के साथ जुड़े मौजूदा परिवर्तनों को प्राप्त करता है (मेरे प्रश्न का बिंदु 1 कोई मुद्दा नहीं है) और उसके बाद .sql फ़ाइलों की तलाश में उनके माध्यम से लूप। एक बार मेरे पास उनकी सूची हो जाने के बाद मैं एक परिवर्तन स्क्रिप्ट बना सकता हूं या लक्ष्य डेटाबेस के विरुद्ध निष्पादित कर सकता हूं।

कोड इस तरह दिखता है:

TeamFoundationServer tfs = new TeamFoundationServer(TfsServerUrl); 
VersionControlServer vcs = (VersionControlServer)tfs.GetService(typeof(VersionControlServer)); 

var buildServer = (IBuildServer)tfs.GetService(typeof(IBuildServer)); 


IBuildDetail build = buildServer.GetBuild(
    new Uri(BuildUri) 
    , null 
    , QueryOptions.All 
); 

build.RefreshAllDetails(); 

var changesets = InformationNodeConverters.GetAssociatedChangesets(build); 

foreach (var changesetSummary in changesets) 
{ 
    Changeset changeSet = vcs.GetChangeset(changesetSummary.ChangesetId); 

    sqlFilePaths.AddRange(
     ProcessChangeSet(changeSet) 
    ); 

} 

और कोड ProcessChangeSet अंदर

List<string> sqlFilePaths = new List<string>(); 
foreach (Change change in changeSet.Changes) 
{ 

    if ((change.Item.ItemType == ItemType.File) 
     && (change.Item.ServerItem.EndsWith(".sql", StringComparison.OrdinalIgnoreCase)) 
     ) 
    { 
     sqlFilePaths.Add(
      sqlPath 
     ); 

    } 
} 
return sqlFilePathes; 

की तरह दिखता है लेकिन अगर किसी को चाहता है मैं उन्हें पूरा कोड देने के लिए खुश हूँ। यह सुनिश्चित करता है कि संग्रहित प्रक्रियाएं सिस्टम भर में समन्वयित हों। यह केवल मेरे डेटाबेस में मैन्युअल रूप से प्रबंधित करने के लिए स्कीमा परिवर्तन छोड़ देता है जो मुझे खुशी है।

0

इसलिए मैं इस दृष्टिकोण की अंतर्ज्ञानी अपील को समझ सकता हूं, लेकिन मुझे नहीं लगता कि यह जाने का सही तरीका है।

एक बात के लिए यह मुश्किल हो रहा है। लेकिन दूसरी समस्या यह है कि टीएफएस के पास तैनाती डेटा रिकॉर्ड करने का कोई अच्छा तरीका नहीं है।

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

एक विकल्प के रूप में, आप पुनर्विचार कर सकते हैं कि आप SQL परिवर्तनों को प्रबंधित करना चाहते हैं। मैं एक निर्देशिका में मौजूदा लंबित परिवर्तनों को रखने के लिए एक निम्न तकनीक विधि का उपयोग करता हूं, और फिर फ़ाइलों को एक अलग निर्देशिका में स्थानांतरित करने के बाद। डेटाबेस में तैनाती इतिहास तालिका को रखकर इस विधि को बढ़ाया जा सकता है। आप Vsts डीबी अतिरिक्त में भी देखना चाहते हैं, वर्तमान CTP में डेटाबेस परिवर्तनों के प्रबंधन के आसपास कई नई सुविधाएं हैं। मैंने यह भी सुना है कि Red Gate में भी अच्छे डेटाबेस प्रबंधन उपकरण हैं।