2012-05-11 10 views
6

के साथ एक विशिष्ट निर्माण कैसे प्राप्त करें मैं टीएफएस से एक विशेष निर्माण प्राप्त करने की कोशिश कर रहा हूं लेकिन यह निराशाजनक रूप से कठिन है।टीएफएस एपीआई

IBuildServer buildServer = (IBuildServer)Server.GetService(typeof(IBuildServer)); 
IBuildDefinition def = buildServer.GetBuildDefinition(TeamProject, BuildDefinition); 

var queuedBuild = buildServer.QueueBuild(def); 

QueueBuild रिटर्न IQueuedBuild और मैं इस तरह कुछ करने के लिए उम्मीद कर रहा था:

return queuedBuild.Build.BuildNumber 

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

के बाद निर्माण कतारबद्ध है मैं तो इस विधि

public string GetBuildStatus(string TeamProject, string BuildDefinition, string BuildNumber) 
{ 
     string status = string.Empty; 
     IBuildDetailSpec buildDetailSpec = buildServer.CreateBuildDetailSpec(TeamProject, BuildDefinition); 
     buildDetailSpec.MaxBuildsPerDefinition = 1; 
     buildDetailSpec.Status = BuildStatus.InProgress | BuildStatus.None; 
     buildDetailSpec.QueryOrder = BuildQueryOrder.FinishTimeDescending; 

     IBuildQueryResult queryResult = buildServer.QueryBuilds(buildDetailSpec); 

     if (queryResult.Builds.Length > 0) 
     { 
      status = queryResult.Builds[0].Status.ToString(); 
     } 

     return status; 
} 

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

धन्यवाद!

उत्तर

11

इस परिदृश्य की कुंजी कतारबद्ध निर्माण की आईडी का उपयोग करना है। तो क्या मैंने किया था:

public int QueuBuild(string TeamProject, string BuildDefinition) 
    { 
     IBuildServer buildServer = (IBuildServer)Server.GetService(typeof(IBuildServer)); 
     IBuildDefinition def = buildServer.GetBuildDefinition(TeamProject, BuildDefinition); 

     var queuedBuild = buildServer.QueueBuild(def); 
     return queuedBuild.Id; 
    } 
मतदान विधि

public string GetBuildStatus(string TeamProject, string BuildDefinition, int BuildID) 
    { 
     IBuildServer buildServer = (IBuildServer)Server.GetService(typeof(IBuildServer)); 

     string status = string.Empty; 
     IQueuedBuildSpec qbSpec = buildServer.CreateBuildQueueSpec(TeamProject, BuildDefinition); 

     IQueuedBuildQueryResult qbResults = buildServer.QueryQueuedBuilds(qbSpec); 
     if(qbResults.QueuedBuilds.Length > 0) 
     { 
      IQueuedBuild build = qbResults.QueuedBuilds.Where(x => x.Id == BuildID).FirstOrDefault(); 
      status = build.Status.ToString(); 
     } 

     return status; 
    } 

आशा में

फिर इस किसी सड़क पर मदद करता है।

2

निर्माण एक एजेंट के लिए इंतज़ार कर कतार में है, तो आप queueBuild.WaitForStart();

फिर कॉल कर सकते हैं queryResult.Build.Uri; संपत्ति लौट सकते हैं और उपयोग करने वाले के साथ मतदान पर, निर्माण नंबर सीधे निर्दिष्ट नहीं की गई।

फिर आप निर्माण की स्थिति प्राप्त करने के लिए विधि IBuildDetail buildDetail = server.GetBuild(buildUri); विधि का उपयोग कर सकते हैं।

+0

अगर मैं मतदान विधि में प्रवेश करता हूं तो उरी को नहीं पता कि मैं यह कैसे समझूंगा कि मैं किस निर्माण की तलाश कर रहा हूं? – dparsons

+1

अपनी पहली विधि में बिल्ड नंबर लौटने के बजाय 'Build.Uri' – DaveShaw

+0

लौटाएं जो काम नहीं करेगा। कतारबद्ध बिल्ड की बिल्ड संपत्ति शून्य है अगर निर्माण से आगे एक और निर्माण है जिसे मैं लात मार रहा हूं। – dparsons