2015-07-21 80 views
3

我在通過TFS API從Visual Studio Online項目檢索生成信息時遇到問題。我可以連接到項目,看起來,並找到預期的團隊項目集合和團隊項目,但儘管項目有兩個構建定義和一些構建,但TFS API在查詢構建時總是返回零長度的數組給我定義或構建。該項目是一個Git項目。我的生產代碼類似於我寫嘗試調試問題該測試代碼:通過TFS API從Visual Studio Online獲取生成定義

var tfsUri = new Uri("https://[my project].visualstudio.com"); 
var tcs = new TfsConfigurationServer(tfsUri); 

var teamProjCollections = tcs 
    .CatalogNode 
    .QueryChildren(
     new[] { CatalogResourceTypes.ProjectCollection }, 
     false, 
     CatalogQueryOptions.None) 
    .Select(collectionNode => new Guid(collectionNode.Resource.Properties["InstanceId"])) 
    .Select(collectionId => tcs.GetTeamProjectCollection(collectionId)); 

var tpc = teamProjCollections 
    .Single(x => x.Name == @"[my project].visualstudio.com\DefaultCollection"); 

var newTeamProjects = tpc 
    .CatalogNode 
    .QueryChildren(
     new[] { CatalogResourceTypes.TeamProject }, 
     false, 
     CatalogQueryOptions.None); 

var tp = newTeamProjects 
    .Single(x => x.Resource.DisplayName == "[team project name]"); 

var buildServer = tpc.GetService<IBuildServer>(); 
var buildDefinitions = buildServer.QueryBuildDefinitions(tp.Resource.DisplayName); 

buildDefinitions始終是一個空數組。構建的定義是肯定那裏 - 我可以使用Visual Studio連接到項目,並將它們顯示在團隊資源管理器的「構建」選項卡中。這段代碼在過去對我有用,但它總是連接到TFVC項目,而不是Git項目。有趣的是,如果我使用團隊項目集合VersionControlServer,像這樣:

var vcs = tpc.GetService<VersionControlServer>(); 
var teamProjects = vcs.GetAllTeamProjects(true); 

... teamProjects始終是一個長度爲零的數組。另外,如果我嘗試通過指定非常一般的構建細節規範來獲取團隊項目集合的所有構建,則不會返回構建。

一些額外的信息:我正在使用VS Enterprise 2015 RC。我是VSO項目的管理員,並創建了團隊項目集合,團隊項目和構建定義。我推了一些代碼,並運行一些構建。通過API連接時,我以自己的身份登錄。我的憑據似乎是正確的。

因此,在試圖弄清楚這一點,我有一些問題。我需要一種不同的方法來訪問Git存儲庫嗎?也許只有通過新的TFS 2015 REST API纔有可能?也許我需要讓自己的構建在VSO項目中「可見」?

回答

2

我相信你是對的我剛剛在GIT項目上針對我自己的VSO測試了代碼,我無法檢索任何build.vNext構建,但是我可以檢索舊的XAML構建定義。

然後,我嘗試使用REST API,它也只能返回舊樣式的XAML構建,直到我使用REST API的第2版,然後返回XAML和build.vNext樣式構建。下面是一個例子字符串我在我的瀏覽器嘗試(請確保您登錄到VSO首先測試它)

https://[vsoname].visualstudio.com/defaultcollection/[project]/_apis/build/definitions?api-version=2.0 
+0

感謝。我今天要發佈更新 - 這是我創建的vNext構建定義。當我昨晚創建XAML構建定義時,我可以通過API看到它。感謝您使用新REST API版本2的提示,現在我會檢查一下。假設我需要三條代碼路徑,一個用於VSO/TFS 2015服務器,一個用於TFS 2010-2013服務器,另一個用於TFS 2005-2008服務器。 –

6

可以利用BuildHttpClient作出類似的請求,你會與2.0 REST API。

sample在GitHub上是一個不錯的資源,如果你寧願輪詢一個單一的項目應該看起來更像是這樣的:

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

static void GetBuildStatus() 
{ 
    var tfsUrl = "http://<tfs url>:<port>/tfs/<collectionname>"; 
    var buildClient = new BuildHttpClient(new Uri(tfsUrl), new VssAadCredential()); 
    var definitions = buildClient.GetDefinitionsAsync(project: "<projectmame>"); 
    var builds = buildClient.GetBuildsAsync("<projectname>"; 

    foreach (var build in builds.Result) 
    { 
     Console.WriteLine(String.Format("{0} - {1} - {2} - {3}", build.Definition.Name, build.Id.ToString(), build.Status.ToString(), build.StartTime.ToString())); 
    } 
} 
+1

非常像這樣,我使用「buildClient.GetDefinitionAsync」來獲取特定的構建定義,我想知道爲什麼「Triggers」集合具有正確的項目數量,但有時集合中的對象爲null。經過幾個小時的谷歌搜索失敗。看着WebApi DLL給了我答案。BuildTrigger類只是預計調度或CI構建,如果它是門控(就像我的),那麼你只是得到NULL。希望這可以幫助。 – Richardissimo

相關問題