2010-05-26 11 views
21

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

उत्तर

12

आप एक ऐड-इन यह करने के लिए लिख सकते हैं। यहाँ एक मौजूदा निर्माण परिभाषा कॉपी करने के लिए कोड है:

static IBuildDefinition CloneBuildDefinition(IBuildDefinition buildDefinition) 
{ 
    var buildDefinitionClone = buildDefinition.BuildServer.CreateBuildDefinition(
     buildDefinition.TeamProject); 

    buildDefinitionClone.BuildController = buildDefinition.BuildController; 
    buildDefinitionClone.ContinuousIntegrationType = buildDefinition.ContinuousIntegrationType; 
    buildDefinitionClone.ContinuousIntegrationQuietPeriod = buildDefinition.ContinuousIntegrationQuietPeriod; 
    buildDefinitionClone.DefaultDropLocation = buildDefinition.DefaultDropLocation; 
    buildDefinitionClone.Description = buildDefinition.Description; 
    buildDefinitionClone.Enabled = buildDefinition.Enabled; 
    buildDefinitionClone.Name = String.Format("Copy of {0}", buildDefinition.Name); 
    buildDefinitionClone.Process = buildDefinition.Process; 
    buildDefinitionClone.ProcessParameters = buildDefinition.ProcessParameters; 

    foreach (var schedule in buildDefinition.Schedules) 
    { 
     var newSchedule = buildDefinitionClone.AddSchedule(); 
     newSchedule.DaysToBuild = schedule.DaysToBuild; 
     newSchedule.StartTime = schedule.StartTime; 
     newSchedule.TimeZone = schedule.TimeZone; 
    } 

    foreach (var mapping in buildDefinition.Workspace.Mappings) 
    { 
     buildDefinitionClone.Workspace.AddMapping(
      mapping.ServerItem, mapping.LocalItem, mapping.MappingType, mapping.Depth); 
    } 

    buildDefinitionClone.RetentionPolicyList.Clear(); 

    foreach (var policy in buildDefinition.RetentionPolicyList) 
    { 
     buildDefinitionClone.AddRetentionPolicy(
      policy.BuildReason, policy.BuildStatus, policy.NumberToKeep, policy.DeleteOptions); 
    } 

    return buildDefinitionClone; 
} 
+0

LINQPad, भयानक में यह काम कर रहे मिला =) – Maslow

0

आपके संदेश से यह स्पष्ट नहीं है कि कौन सा टेम्पलेट आपकी बिल्ड परिभाषा है (डिफ़ॉल्ट, अपग्रेड या प्रयोगशाला प्रबंधन)। अगर मैं सही ढंग से समझता हूं तो आप एक बिल्ड परिभाषा को आसानी से स्थापित करना चाहते हैं जो एक ही समाधान बनाता है लेकिन एक अलग शाखा से।

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

धन्यवाद, Ladislau

1

मैं सिर्फ परिभाषाओं का निर्माण कॉपी की जरूरत थी, और पाया जिम की जवाब ऊपर सहायक हो। हालांकि, टीएफएस एपीआई में नया होने के कारण, मुझे सर्वर से कनेक्ट करने और कोड के माध्यम से मौजूदा बिल्ड परिभाषा प्राप्त करने में मदद की आवश्यकता थी।

http://msdn.microsoft.com/en-us/library/bb286958.aspx

http://geekswithblogs.net/jakob/archive/2010/04/26/creating-a-build-definition-using-the-tfs-2010-api.aspx

+0

मैं TFS विद्युत उपकरण Sept 2010 जो क्लोन बिल्ड परिभाषा आदेश होता है का उपयोग कर समाप्त हो गया। – devlife

36

आप नए TFS 2010 power tools डाउनलोड कर सकते हैं: इन दो लिंक ख़ाली जगह को भरने में मदद की। इसमें एक बिल्ड परिभाषा क्लोन करने का विकल्प है।

एक उदाहरण के लिए http://msmvps.com/blogs/molausson/archive/2010/10/21/clone-a-build-definition.aspx देखें

नोट: ध्यान रखें कि क्लोन ही काम करता है आप पॉप आउट नहीं था, जब खिड़की बिल्ड।

1

आप परिभाषा फ़ाइल की प्रतिलिपि बनाने के लिए बिल्ड परिभाषा पर राइट क्लिक कर सकते हैं और 'क्लोन बिल्ड परिभाषा' का चयन कर सकते हैं। फिर आप इसे वहां से संपादित कर सकते हैं।

आपकी आवश्यकता
1

यहाँ soltion है अगर आप एक टीम परियोजना से करने के लिए परिभाषा बिल्ड ले जाना चाहते हैं अन्य टीम परियोजना।

public void MoveBuild(string fromTeamProject, string toTeamProject, string buildName, string newBuildName) 
    { 

     var _server = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new 

     Uri("http://Mytfs:8080/defaultcollection")); 

     IBuildServer _buildServer = _server.GetService<IBuildServer>(); 

     var buildDetails = _buildServer.QueryBuildDefinitions(fromTeamProject); 

     foreach (var fromBuild in buildDetails) 
     { 
      if (fromBuild.Name != buildName) continue; 
      var newBuildDefinition = _buildServer.CreateBuildDefinition(toTeamProject); 
      newBuildDefinition.Name = !string.IsNullOrEmpty(newBuildName) ? newBuildName : fromBuild.Name; 

      newBuildDefinition.BuildController = fromBuild.BuildController; 

      // This finds the template to use 
      foreach (var mapping in fromBuild.Workspace.Mappings) 
      { 
       newBuildDefinition.Workspace.AddMapping(
        mapping.ServerItem, mapping.LocalItem, mapping.MappingType, mapping.Depth); 
      } 
      newBuildDefinition.DefaultDropLocation = fromBuild.DefaultDropLocation; 
      newBuildDefinition.Description = fromBuild.Description; 
      // buildDefinition.Workspace.AddMapping(build.Workspace.); 
      newBuildDefinition.Process = _buildServer.QueryProcessTemplates(fromBuild)[2]; 

      newBuildDefinition.ProcessParameters = fromBuild.ProcessParameters; 
      newBuildDefinition.Enabled = false; 
      newBuildDefinition.Save(); 
     }//end of for each loop 

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