2015-11-13 78 views
0

我們正在使用TFS 2015.我在使用TFS API從C#控制檯應用程序檢索非XAML構建信息時遇到問題。實際上,對於我們爲XAML構建定義和另一個項目設置的一個項目,它是非XAML項目。我能夠連接TFS項目並能夠獲取XAML定義列表。然而,在試圖獲取非XAML definations或生成,它始終是一個空array.My代碼如下,團隊基礎服務器檢索非XAML構建信息

static void Main(string[] args) 
{ 
    try 
    { 
     var tfsUri = (args.Length < 1) ? new Uri(ConfigurationManager.AppSettings["ServerUri"]) : new Uri(args[0]); 
     var userCreds = new NetworkCredential(
      ConfigurationManager.AppSettings["Tfs.User"], ConfigurationManager.AppSettings["Tfs.Password"], ConfigurationManager.AppSettings["Tfs.Domain"]); 

     // var tfsServer = TfsConfigurationServerFactory.GetConfigurationServer(tfsUri, userCreds); 
     var tfsServer = new TfsConfigurationServer(tfsUri, userCreds); 
     tfsServer.EnsureAuthenticated(); 

     //// Get the catalog of team project collections 
     var collectionNodes = tfsServer.CatalogNode.QueryChildren(new[] { CatalogResourceTypes.ProjectCollection }, false, CatalogQueryOptions.None); 

     //// List the team project collections 
     foreach (var collectionNode in collectionNodes) 
     { 
      //// Use the InstanceId property to get the team project collection 
      var collectionId = new Guid(collectionNode.Resource.Properties["InstanceId"]); 
      var teamProjectCollection = tfsServer.GetTeamProjectCollection(collectionId); 

      //// Get a catalog of team projects for the collection 
      var projectNodes = collectionNode.QueryChildren(new[] { CatalogResourceTypes.TeamProject }, false, CatalogQueryOptions.None); 
      foreach (var projectNode in projectNodes) 
      { 
       /* 
       Console.WriteLine("Collection: " + teamProjectCollection.Name); // Print the name of the team project collection 
       Console.WriteLine(" Team Project: " + projectNode.Resource.DisplayName); // List the team projects in the collection 
       Console.WriteLine(" Team Project Id: " + projectNode.Resource.Identifier); 
       */ 

       //// Get a catalog of team builds for the collection 
       var buildDefinitions = new BuildDefinition(); 

       // var buildDetailList = buildDefinitions.GetBuildDefinitionListFromProject(teamProjectCollection, projectNode.Resource.DisplayName); 
       buildDefinitions.GetBuildDetailsFromProject(teamProjectCollection, projectNode.Resource.DisplayName, projectNode.Resource.Identifier); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     ErrorLogger.LogError(ex); 
    } 
} 

public class BuildDefinition 
{ 
    public void GetBuildDetailsFromProject(TfsTeamProjectCollection tfsProjectCollection, string projectName, Guid projectId) 
    { 
     var buildService = tfsProjectCollection.GetService<IBuildServer>(); // (IBuildServer)tfs.GetService(typeof(IBuildServer)); 

     var buildDefinitionsList = GetAllBuildDefinitionsFromTheTeamProject(buildService, projectName); 
     foreach (var buildDefinition in buildDefinitionsList) 
     { 
      var bdentities = new BuildDefinitionEntities 
      { 
       ProjectId = projectId, 
       ProjectName = buildDefinition.TeamProject, 
       BuildTypeId = Convert.ToInt32(buildDefinition.Id), 
       BuildTypeName = buildDefinition.Name, 
       ProjectDetailPath = string.Format("{0} > {1}", buildDefinition.TeamProject, buildDefinition.Name) 
      }; 

      var buildDetailSpec = buildService.CreateBuildDetailSpec(buildDefinition); 
      buildDetailSpec.InformationTypes = null; // for speed improvement 
      buildDetailSpec.MinFinishTime = DateTime.Now.AddDays(-21); // to get only builds of last 3 weeks 
      buildDetailSpec.MaxBuildsPerDefinition = 1; // get only one build per build definintion 
      buildDetailSpec.QueryDeletedOption = QueryDeletedOption.ExcludeDeleted; // get only active builds 
      buildDetailSpec.QueryOrder = BuildQueryOrder.FinishTimeDescending; // get the latest build only 
      buildDetailSpec.QueryOptions = QueryOptions.All; 

      var buildDetailList = buildService.QueryBuilds(buildDetailSpec).Builds; 

      //// List the team builds for the collection 
      foreach (var buildDetail in buildDetailList) 
      { 
       bdentities.BuildId = buildDetail.RequestIds[0]; 
       bdentities.BuildName = buildDetail.BuildNumber; 
       bdentities.ArtefactsPath = buildDetail.DropLocation ?? "No Artefacts"; 
       bdentities.BuildCompleted = Convert.ToDateTime(buildDetail.FinishTime) > Convert.ToDateTime(buildDetail.StartTime) 
               ? Convert.ToDateTime(buildDetail.FinishTime) 
               : Convert.ToDateTime(buildDetail.StartTime); 
       bdentities.BuildStatus = buildDetail.Status.ToString(); 
       bdentities.SourceGetVersion = buildDetail.SourceGetVersion ?? string.Empty; 

       if (!string.IsNullOrEmpty(buildDetail.Quality)) 
       { 
        bdentities.BuildQuality = buildDetail.Quality; 
        bdentities.BuildQualityChangedDate = Convert.ToDateTime(buildDetail.LastChangedOn); 
       } 

       BuildDefinitionDbOperations.ManageTfsBuildDefinitions(bdentities); 


      } 
     } 
    } 
    private static IBuildDefinition[] GetAllBuildDefinitionsFromTheTeamProject(IBuildServer buildServer, string projectName) 
    { 
     var buildDefinitionSpec = buildServer.CreateBuildDefinitionSpec(projectName); 
     buildDefinitionSpec.TriggerType = DefinitionTriggerType.All; 
     buildDefinitionSpec.Options = QueryOptions.Definitions; 

     return buildServer.QueryBuildDefinitions(buildDefinitionSpec).Definitions; 
    } 
} 

其實,我是新來這個TFS系統。你能指導我哪裏錯了嗎?

回答

2

對於vNext/non-XAML構建系統,您必須使用TFS REST API;你可以找到詳細信息here