2017-01-09 3 views
0

Я пытаюсь получить информацию из определений сборки TFS2015. У нас около 100 определений построения в формате XAML и около 50 в новом формате 2015 года. Сервер является внутренним Team Foundation Server. (Microsoft Visual Studio Team Server Foundation Version 15.105.25910.0)API сервера TFS перечисляет только определения сборки XAML

Я не использую остальное апи но Microsoft.TeamFoundationServer.ExtendedClient как рекомендуемое здесь: https://blogs.msdn.microsoft.com/buckh/2015/08/10/nuget-packages-for-tfs-and-visual-studio-online-net-client-object-model/.

Вот мой пример кода:

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Linq; 
using Microsoft.TeamFoundation.Build.Client; 
using Microsoft.TeamFoundation.Client; 
using Microsoft.TeamFoundation.Framework.Client; 
using Microsoft.TeamFoundation.Framework.Common; 
using Serilog; 

namespace TFSExperiment 
{ 
    class Program 
    { 
     // see https://blogs.msdn.microsoft.com/buckh/2015/08/10/nuget-packages-for-tfs-and-visual-studio-online-net-client-object-model/ 
     //Needs nuget package Install-Package Microsoft.TeamFoundationServer.ExtendedClient -Version 14.102.0 
     // to use serilogg: Install-Package Serilog ; Install-Package Serilog.Sinks.RollingFile 
     static void Main(string[] args) 
     { 
      var myLog = new LoggerConfiguration() 
       .WriteTo.RollingFile("..\\..\\Applog\\mylog-{Date}.log").CreateLogger();   
      TfsConfigurationServer configurationServer = 
       TfsConfigurationServerFactory.GetConfigurationServer(new Uri("https://tfs.inhouseserver2015.org/tfs/")); 
      ReadOnlyCollection<CatalogNode> collectionNodes = 
       configurationServer.CatalogNode.QueryChildren(new[] {CatalogResourceTypes.ProjectCollection}, false, 
        CatalogQueryOptions.None); 
      CatalogNode defultTfsCol = collectionNodes.AsQueryable().Single(c=>c.Resource.DisplayName.Equals("DefaultCollection")); 
      Console.WriteLine(defultTfsCol.Resource.DisplayName); 
       TfsTeamProjectCollection tfsProjectCollection = 
       configurationServer.GetTeamProjectCollection(new Guid(defultTfsCol.Resource.Properties["InstanceId"])); 
       tfsProjectCollection.Authenticate(); 
       var buildServer = (IBuildServer)tfsProjectCollection.GetService(typeof(IBuildServer));     
       ReadOnlyCollection<CatalogNode> projectNodes = defultTfsCol.QueryChildren(
        new[] { CatalogResourceTypes.TeamProject }, 
        false, CatalogQueryOptions.None); 
       foreach (var proj in projectNodes) 
       { 
        var buildDefinitionList = new List<IBuildDefinition>(buildServer.QueryBuildDefinitions(proj.Resource.DisplayName)); 
        foreach (var buildDef in buildDefinitionList) 
        {      
         Console.WriteLine(buildDef.Name);     
         myLog.Information($"{buildDef.Id} --{buildDef.Name} --{buildDef.BuildServer.BuildServerVersion} "); 
        } 
       }    
      Console.WriteLine(" Hit any key to exit "); 
      Console.ReadKey(); 
     } 
    } 
} 

ответ

0

API-интерфейсы в Microsoft.TeamFoundationServer.ExtendedClient, в первую очередь там, чтобы поставить обратную совместимость с XAML строит. Насколько мне известно, они не поддерживают Build vNext, поскольку они были написаны до их времени.

Как вы указали ссылку, REST API - это будущий способ следовать.

+0

Хорошо, может быть, я прочитал его быстро я прочитал о Microsoft.TeamFoundationServer.ExtendedClient:»..Because не каждый API доступен в TFS 2015 или VSO в настоящее время как REST API, там будут случаи, когда должен использовать этот пакет ... »Поэтому я думал, что все в этом. (поэтому имя расширено « –

+0

Я попробовал API Rest, но не получил проверку подлинности Windows, я только System.Net.Http.HttpRequestException: Код состояния ответа не указывает на успех: 401 (неавторизованный). –

+0

Вы пробовали настройку UseDefaultCredentials = true, на вашем объекте WebClient? –

1

Вы используете устаревший API для мыла, который может получить только сборки XAML.

Предполагая, что вы установили последнюю .NET Client Libraries, вы можете использовать REST API в библиотеках, чтобы получить как XAML и vNext строит так:

using System; 
using System.Collections.Generic; 
using Microsoft.TeamFoundation.Client; 
using Microsoft.TeamFoundation.Build.WebApi; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Uri tfsurl = new Uri("http://xxxx:8080/tfs/CollectionName"); 
      TfsTeamProjectCollection ttpc = new TfsTeamProjectCollection(tfsurl); 
      BuildHttpClient bhc = ttpc.GetClient<BuildHttpClient>(); 
      List<Build> builds = bhc.GetBuildsAsync("ProjectName").Result; 
      foreach (Build bu in builds) 
      { 
       Console.WriteLine(bu.BuildNumber); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 
+0

Привет, мне нужна информация о сборке defs о переменных, которые я не получил для сборки xaml. Мне пришлось использовать booth api: s. –

1

Как ответил Эдди - MSFT и Торе Østergaard я должен был используйте остальные api. Но похоже, что я должен использовать старый api, чтобы получить всю информацию из builddefinitions. Из restapi я получил название сборки, но не глубокую информацию для сборки xaml.

Я хотел собрать информацию из переменной, указав название проекта Octopus Deploy. Я размещаю код здесь, если у кого-то есть аналогичная проблема.

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Diagnostics; 
using System.Linq; 
using System.Net; 
using System.Text.RegularExpressions; 
using Microsoft.TeamFoundation.Build.Client; 
using Microsoft.TeamFoundation.Client; 
using Microsoft.TeamFoundation.Build.WebApi; 
using Microsoft.TeamFoundation.Common; 
using Microsoft.TeamFoundation.Framework.Client; 
using Microsoft.TeamFoundation.Framework.Common; 
using Newtonsoft.Json; 
using Serilog; 
using Serilog.Core; 


namespace ListOctopusProjectsAndTfsBuilds 
{ 
    class Program 
    { 
     // see https://blogs.msdn.microsoft.com/buckh/2015/08/10/nuget-packages-for-tfs-and-visual-studio-online-net-client-object-model/ 
     //Needs nuget package Install-Package Microsoft.TeamFoundationServer.ExtendedClient -Version 14.102.0 
     // to use serilogg: Install-Package Serilog ; Install-Package Serilog.Sinks.RollingFile 

     static Logger _myLog = new LoggerConfiguration() 
       .WriteTo.RollingFile($"..\\..\\Applog\\myBuildDeflog-{DateTime.Now:yyyyMMddHHHHmmss}.log").CreateLogger(); 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Start looking for BuildDefs"); 
      Dictionary<string, string> octopusDeployDictionary = GetvNextBuildDefVariable(new Uri("https://inhouseserver2015/tfs/DefaultCollection"), "YourTfsProject", "OctoProj"); 
      Dictionary<string, string> octopusDeployXamlDictionary = GetXamlBuildDefVariable(new Uri("https://inhouseserver2015/tfs/DefaultCollection"), "YourTfsProject", "ArgOctopusProjectsToPublish"); 
      Console.WriteLine("Builds vnext defs -- Octopus project"); 
      foreach (var cd in octopusDeployDictionary) 
      { 
       Console.WriteLine($"{cd.Key}; {cd.Value}"); 
      } 
      Console.WriteLine("Builds xaml defs -- Octopus project"); 
      foreach (var cd in octopusDeployXamlDictionary) 
      { 
       Console.WriteLine($"{cd.Key}; {cd.Value}"); 
      } 
      Console.ReadLine(); 
     } 

     private static Dictionary<string, string> GetXamlBuildDefVariable(Uri tfsUri, string tfsProject, string buildDefVar) 
     { 
      var collection = tfsUri.LocalPath.Split('/')[2]; 
      //Define Reg expression ahead so it can faster parse xml and find the Octopus Deploy projectname. 
      Regex findArgOctopusProjectsToPublish = null; 
      try 
      { 
       findArgOctopusProjectsToPublish = new Regex($"x:Key=\"{buildDefVar}\".*<x:String>([^<]*)", 
        RegexOptions.IgnoreCase | RegexOptions.Singleline); 
      } 
      catch (ArgumentException ex) 
      { 
       _myLog.Error(ex, "Error with RegularExpression syntax"); 
      } 
      Dictionary<string, string> tfsVarBuildDefDict = new Dictionary<string, string>(); 
      TfsConfigurationServer configurationServer = 
       TfsConfigurationServerFactory.GetConfigurationServer(tfsUri)); 
      ReadOnlyCollection<CatalogNode> collectionNodes = 
       configurationServer.CatalogNode.QueryChildren(new[] {CatalogResourceTypes.ProjectCollection}, false, 
        CatalogQueryOptions.None); 
      CatalogNode defultTfsCol = 
       collectionNodes.AsQueryable().Single(c => c.Resource.DisplayName.Equals(collection)); 
      TfsTeamProjectCollection tfsProjectCollection = 
       configurationServer.GetTeamProjectCollection(new Guid(defultTfsCol.Resource.Properties["InstanceId"])); 
      tfsProjectCollection.Authenticate(); 
      var buildServer = (IBuildServer) tfsProjectCollection.GetService(typeof(IBuildServer)); 
      ReadOnlyCollection<CatalogNode> projectNodes = defultTfsCol.QueryChildren(
       new[] {CatalogResourceTypes.TeamProject}, 
       false, CatalogQueryOptions.None); 

       var buildDefinitionList = 
        new List<IBuildDefinition>(buildServer.QueryBuildDefinitions(tfsProject)); 
       foreach (var buildDef in buildDefinitionList) 
       { 
       Debug.Assert(findArgOctopusProjectsToPublish != null, "findArgOctopusProjectsToPublish != null"); 
       var octopusProjectsToPublish = 
         findArgOctopusProjectsToPublish?.Match(buildDef.ProcessParameters).Groups[1].Value; 
        if (octopusProjectsToPublish.IsNullOrEmpty()) 
        { 
         octopusProjectsToPublish = "NoOctopus Projekt"; 
        } 
       tfsVarBuildDefDict.Add(buildDef.Name, octopusProjectsToPublish); 
        _myLog.Information($"{buildDef.Id} --{buildDef.Name} --{buildDef.BuildServer.BuildServerVersion} "); 
       } 

      return tfsVarBuildDefDict; 
     } 

     private static Dictionary<string, string> GetvNextBuildDefVariable(Uri tfsUri,string tfsProject,string buildDefVar) 
     { 
      Dictionary<string, string> tfsVarBuildDefDict = new Dictionary<string, string>(); 
      TfsTeamProjectCollection ttpc = 
       new TfsTeamProjectCollection(tfsUri); 
      BuildHttpClient bhc = ttpc.GetClient<BuildHttpClient>(); 
      var definitions = bhc.GetDefinitionsAsync(project: tfsProject); 
      var client = new WebClient {UseDefaultCredentials = true}; 
      foreach (var buildDef in definitions.Result) 
      { 
       if (buildDef.Type == DefinitionType.Build) 
       { 
        var json = client.DownloadString(buildDef.Url); 
        BuildDefinition result = JsonConvert.DeserializeObject<BuildDefinition>(json); 
        if (result.Variables.ContainsKey(buildDefVar)) 
        { 
         tfsVarBuildDefDict.Add(buildDef.Name, result.Variables[buildDefVar].Value.ToString()); 
         _myLog.Information($"{buildDef.Name} Octoproject: {result.Variables[buildDefVar].Value.ToString()}"); 
        } 
       } 
       else 
       { 
        _myLog.Information($"{buildDef.Name} BuildType {buildDef.Type} "); 
       } 
      } 
      return tfsVarBuildDefDict; 
     } 
    } 
} 
Смежные вопросы