2009-07-24 24 views
14

मेरे पास एक परिदृश्य है जहां मैं एक टीएफएस बिल्ड को दूसरे से कॉल करना चाहता हूं, पहला निर्माण करता है और दूसरा स्टेजिंग करता है। यह मुझे एक ही समाधान के लिए कई कस्टम स्टेजिंग करने की अनुमति देगा।टीएफएस कैसे बनाता है?

मुझे पता है, मैं इसे दूसरे निर्माण में निष्पादन कार्य के साथ खींच सकता हूं और पहली बिल्ड परिभाषा से निर्माण को कतारबद्ध करने के लिए tfsbuild.exe पर कॉल कर सकता हूं। लेकिन क्या सोच रहा था कि कोई बेहतर तरीका जानता है?

+1

हम CC.NET में स्विच कतार में एक्सटेंशन बनाएँ। – Sneal

+0

मैंने सीसी.NET के साथ कई बार ऐसा किया है, मुझे लगता है कि टीएफएस के साथ ऐसा करने का एक साफ तरीका है, मुझे लगता है! – user22242

उत्तर

5

यहाँ मैं कैसे पूरा किया है इस (http://sajojacob.com/2009/08/how-to-chain-tfs-builds/)

कैसे चेन TFS के लिए बनाता है? 5 अगस्त 200 9 को साजो द्वारा पोस्ट किया गया - कोई टिप्पणी नहीं ↓

मेरे सहयोगियों में से एक @gdurzi ने हाल ही में मुझसे यह प्रश्न पूछा। टीएफएस के साथ बॉक्स के बाहर समर्थित होने के लिए पर्याप्त सरल लगता है? इसके साथ बहुत सारे quirks। और मैं कभी वफादार MSBuild कार्य का उपयोग कर TFSBuild.exe करने के लिए एक कॉल करने के लिए इस

TFSBuild.exe की तरह कुछ के साथ पहली TFSBuild.proj से एक नए निर्माण क़तार में शुरू/कतार% TFSSVR%% TEAMPROJECT%% BUILDTYPE की सिफारिश की %

TFSBuild.exe का उपयोग करने में कोई समस्या यह है कि आप बिल्ड एजेंट को कमांड लाइन तर्क के रूप में पास नहीं कर सकते जो हमारे लिए एक सौदा ब्रेकर था।

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

चरण 1: चलो टीम फाउंडेशन ऑब्जेक्ट मॉडल का उपयोग करके कस्टम एमएसबिल्ड कार्य बनाएं जो बिल्ड परिभाषा फ़ाइल से जुड़े डिफ़ॉल्ट बिल्ड एजेंट का उपयोग करके निर्माण को कतारबद्ध करता है। INF कतारबद्ध के लिए

नमूना कोड: QueueTFS.cs

using Microsoft.TeamFoundation.Client; 
using Microsoft.TeamFoundation.Build.Client; 

// Get the team foundation server. 
TeamFoundationServer _tfsServer = TeamFoundationServerFactory.GetServer(_tfs); 

// Get the IBuildServer 
IBuildServer buildServer = (IBuildServer)_tfsServer.GetService(typeof(IBuildServer)); 

// Get the build definition for which a build is to be queued. 
IBuildDefinition definition = buildServer.GetBuildDefinition(teamProject, buildDefinition); 

// Create a build request for the build definition. 
IBuildRequest request = definition.CreateBuildRequest(); 
request.CommandLineArguments = "Pass any custom command line args here"; // Ex: Custom Targets file 

// Queue the build. 
buildServer.QueueBuild(request, QueueOptions.None); 

चरण 2: अब जहां मचान परिभाषा बिल्ड फ़ाइल बनाना चाहते TFS में एक नए फ़ोल्डर में QueueTFS.dll कॉपी।

अब एक न्यूनतम TFSBuild.proj फ़ाइल बनाएं जो हमारे नए MSBuild कार्य का उपयोग करता है और EndToEndIteration लक्ष्य को ओवरराइड करता है। यह हमारी स्टेजिंग बिल्ड परिभाषा होगी जो मेनब्यूल्ड बिल्ड को ट्रिगर करेगा। ध्यान दें कि आपको हाथ से यह TFSBuild.proj बनाना होगा और बिल्ड फ़ाइल परिभाषा UI से नए फ़ोल्डर में प्रोजेक्ट फ़ाइल स्थान को इंगित करना होगा।

एक न्यूनतम TFSBuild.proj के लिए

नमूना कोड:

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> 
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TeamBuild\Microsoft.TeamFoundation.Build.targets" /> 
    <UsingTask TaskName="MyNewCustomTFSTask" AssemblyFile="QueueTFS.dll"/> 
    <Target Name="EndToEndIteration"> 
    <Message Text="About to trigger main build" Importance="high"/> 
    < MyNewCustomTFSTask TFS="http://TFSServer.com:8080/" TeamProject="TeamProject" BuildDefinition="Main_Build" TargetsFile="Custom.Target" XYZ="XYZ" /> 
    <!-- When everything is done, change the status of the task to "Succeeded" --> 
    <SetBuildProperties TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)" TestStatus="Succeeded" CompilationStatus="Succeeded"/> 
    </Target> 
</Project> 

चरण 3: पूर्व निर्माण और बाद के निर्माण लक्ष्य कॉल के साथ अपने Main_Build TFSBuild.proj फ़ाइल को संपादित करें।

<Target Name=“BeforeCompile“> 

    <CallTarget Targets=“Custom_PreBuild“/>  

    </Target> 

    <Target Name=“AfterDropBuild“ Condition=“‘$(BuildBreak)’!=’true’“>  

    <CallTarget Targets=“Custom_PostBuild“/> 

    </Target> 

हम चलाने के लिए और साथ ही अपने आप में Main_Build इस समर्थन करने के लिए हम अपने Main_Build TFSBuild.proj में सशर्त आयात जोड़ने एक डिफ़ॉल्ट लक्ष्य खाली Custom_PreBuild और Custom_PostBuild लक्ष्य के साथ फ़ाइल आयात करने की क्षमता, चाहता था। अब आप अपने लक्ष्यों को Custom_PreBuild और Custom_PostBuild लक्ष्य और आप के साथ Custom.Target और EmptyCustom.Target फ़ाइल बनाने: $ (CustomTarget) आप request.CommandLineArguments

<Import Project="$(CustomTarget)" Condition="'$(CustomTarget)'!=''"/> 
<!--Import CustomContoso.Target if no partner is passed in—> 
<Import Project="EmptyCustom.Target" Condition="'$(CustomTarget)'==''"/> 

चरण 4 के लिए चरण 1 में एक कमांड लाइन तर्क के रूप में पास होता क्या है कार्य पूर्ण।

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

7

यह निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं।

1) क्या आप बिल्डिंग + स्टेजिंग को एक ऑपरेशन के रूप में चलाने के लिए चाहते हैं? ताकि आप एक समेकित बिल्ड रिपोर्ट, एक लॉग फ़ाइल, सर्वर की बिल्ड कतार में एक नौकरी के साथ समाप्त हो जाएं, प्रत्येक चरण को उसी चरण एजेंट द्वारा क्रमशः निष्पादित किया गया था जो पिछले चरण को निष्पादित करता था?

यदि ऐसा है, तो आप मूल रूप से सही रास्ते पर हैं। मैं <Exec> tfsbuild.exe पर बाहर नहीं होगा - एक पूरे नए निर्माण को चलाने के लिए बहुत अधिक ओवरहेड है, और मुझे यकीन नहीं है कि संभावित दुष्प्रभाव क्या हैं। इसके बजाय, मैं आपकी स्टेजिंग स्क्रिप्ट में परिभाषित msbuild कार्यों को निष्पादित करने के लिए <Call> कार्य का उपयोग करूंगा।

2) क्या आप वास्तव में एक अलग "स्टेजिंग बिल्ड" कतार में "बिल्ड बिल्ड" चाहते हैं? कतार में अलग रिपोर्ट, लॉग फाइल, & धब्बे? यदि आपके पास एकाधिक बिल्ड एजेंट हैं तो समानांतर में निष्पादित करने का अवसर?

यदि हां, तो:

  • एक नए निर्माण परिभाषा (रों) मंचन
  • अपने मूल निर्माण परिभाषा करने के लिए कुछ कोड जोड़ने के लिए बना है कि कतारों [एक/कई] का उपयोग कर नए निर्माण परिभाषाओं की टीम बिल्ड एपीआई। Sample code
  • हटाने कोर से संबंधित नहीं कुछ भी मूल निर्माण परिभाषा से निर्माण
  • यकीन है कि नए "मचान" परिभाषाएँ किसी भी स्वचालित चलाता (समय अंतराल, चेकइन की घटनाओं, आदि)
+0

अधिमानतः चरण 1, लेकिन कार्य का उपयोग आपके सुझाव के रूप में नहीं किया जा सकता है। स्टेजिंग बिल्ड को इस मामले में निर्माण का चालक होना चाहिए। यह कोर बिल्ड को कॉल करता है और फिर इसकी कस्टम स्टेजिंग करता है। न्यूनतम tfsbuild proj फ़ाइल का उपयोग करने में समस्या यह है कि, यूआई के माध्यम से बनाई गई TFSBuild परिभाषा फ़ाइल को बनाए गए समाधान के आधार पर सभी पथ गुण सेट करता है। (जैसा कि हम मानते हैं, बिल्डिंग परिभाषा को चरणबद्ध करना समाधान को पुनर्निर्माण नहीं करना चाहिए) तो है सही कोर TFSBuild.proj फ़ाइल को हार्डकोड किए बिना फ़ाइल को कॉन्फ़िगर करने के लिए कॉन्फ़िगर किए गए पथ प्राप्त करने के लिए दर्द। – user22242

+0

मुझे समस्या नहीं आती है। अपनी स्क्रिप्ट स्क्रिप्ट्स को अपनी निर्देशिका स्क्रिप्ट के समान निर्देशिका में क्यों न स्टोर करें? दरअसल, यहां तक ​​कि जरूरी नहीं है - बस यह सुनिश्चित करें कि सापेक्ष पथ समान रहें। ///// अगर इससे मदद नहीं मिलती है, तो कृपया जो भी करने की कोशिश कर रहे हैं उस पर अधिक जानकारी दें। "पहले निर्माण" और "दूसरा निर्माण" में आप क्या सटीक चीजें होने की उम्मीद करते हैं? उनके पास आम कार्य क्या हैं, और क्या अनुकूलित करने की आवश्यकता है? –

+0

बीटीडब्लू, जो आप करने की कोशिश कर रहे हैं उसके आधार पर, टीम बिल्ड बिल्कुल सही दृष्टिकोण नहीं हो सकता है। उदाहरण के लिए, मेरे परीक्षण वातावरण "पुश" के बजाय "पुल" मॉडल पर सेट होते हैं। प्रत्येक मशीन टीएफएस अधिसूचना प्रणाली की सदस्यता लेती है। जब BuildCompletion ईवेंट उठाया जाता है, तो मशीन पर एक सेवा उस बॉक्स के लिए कॉन्फ़िगर किए गए विभिन्न मानदंडों के खिलाफ जांच करती है और एक परीक्षण वातावरण को उचित रूप से पुन: नियोजित करती है। –

0

हैं की जरूरत नहीं है बनाने के आप अपने समाधान पर्यावरण को अपने समाधान को तैनात करने की कोशिश कर रहे हैं? तो एक अच्छा तरीका codeplex जो एक ऐसे भिन्न PowerShell निर्माण गुणवत्ता आपके द्वारा चुने गए के आधार पर स्क्रिप्ट चलेंगे से TFSDeployer उपयोग करने के लिए ... है

+1

मैं इसे इस तरह के एक आसान काम के लिए TFSDeployer के लिए सीखने की वक्र से निपटने के बजाय सीसी में कर सकता हूं। टीएफएस में इतना आसान क्यों करना मुश्किल है कि आपको अन्य उपकरणों पर भरोसा करने की आवश्यकता है? मुझे आश्चर्य है कि बहुत से लोग चिंतित टीएफएस के बारे में बात नहीं कर रहे हैं – user22242

+2

चेनड बिल्ड मेरे संस्करण नंबरिंग को खटखटाएगा। मैं सभी "आर्टिफैक्ट्स" बनाने के लिए एक एकल निर्माण का उपयोग करता हूं और फिर मुझे इसे सिस्टम टेस्ट के बाद तैनात करने की आवश्यकता होती है, फिर क्यूए फिर बीटा और फाइनली लाइव। ऐसा इसलिए किया जाता है इसलिए दूषित निर्माण (डेवलपर चेकइन) की पूर्णता नहीं है। यदि कोई समस्या है तो हम वापस DEV पर जाते हैं। यह प्रत्येक फीचर शाखा पर किया जाता है जब तक कि इसे मुख्य रूप से विलय करने से पहले क्यूए/यूएटी पारित नहीं किया जाता है और ब्रांडेड रिलीज के लिए किया जाता है। :) –

1

यहां अन्य उपयोगी लिंक हैं। यह दूसरों की मदद कर सकता है।

एक और बिल्ड परिभाषा बनाएं और अन्य निर्माण परिभाषाओं को ट्रिगर करने के लिए कॉल करें।

http://blogs.objectsharp.com/post/2012/02/04/Create-a-Master-Build-that-calls-other-Builds.aspx

http://blog.stangroome.com/2011/09/06/queue-another-team-build-when-one-team-build-succeeds/

पासिंग तर्क बाल बनाता है।जो आसानी से परिदृश्य के इस प्रकार का समर्थन करता है -

http://blog.stangroome.com/2014/02/19/queue-a-team-build-from-another-and-pass-parameters/

TFS एक और बिल्ड परिभाषा

http://tfsbuildextensions.codeplex.com/