通过TFS API从Visual Studio Online获取构建定义

4

我在通过TFS API从Visual Studio Online项目中检索构建信息时遇到了问题。我可以连接到该项目,并找到了预期的团队项目集合和团队项目,但是尽管项目有两个构建定义和多个构建,当查询构建定义或构建时,TFS API总是返回零长度数组。该项目是一个Git项目。我的生产代码类似于我编写的此测试代码,以尝试调试问题:

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个回答

7

您可以使用BuildHttpClient来发起与2.0 REST API类似的请求。

如果您想轮询单个项目,则可以参考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”集合中的项数是正确的,但有时集合中的对象为空。经过几个小时不成功的谷歌搜索后,查看WebApi DLL给了我答案。BuildTrigger类只期望计划或CI构建,如果是Gated(像我的一样),那么你只会得到NULL。希望这可以帮助到你。 - Richardissimo
你好!我正在尝试从这个网站获取构建:https://dev.azure.com/LumiaWoA/Boot%20Shim/_build?definitionId=3 我应该使用什么tfsUrl?谢谢。 - SuperJMN
你是在使用VSTS还是TFS的托管安装? - ncarmona
我无法让 GetDefinitionsAsync() 接受那样的参数。它有很多参数和重载,我不理解,例如 name, repositoryId 等等。 - Prof. Falken

3

我相信你是对的,我刚刚在我的GIT项目上测试了你的代码,无法检索任何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

谢谢。我今天打算发布一个更新 - 我创建了vNext构建定义。昨晚我创建了一个XAML构建定义,我可以通过API看到它。感谢您关于使用新REST API版本2的提示,我现在会去检查一下。我想我需要三个代码路径,一个用于VSO/TFS 2015服务器,一个用于TFS 2010-2013服务器,另一个用于TFS 2005-2008服务器。 - Chris Mantle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接