【问题标题】:Fetching build definitions from Visual Studio Online through TFS API通过 TFS API 从 Visual Studio Online 获取构建定义
【发布时间】:2015-10-10 14:08:14
【问题描述】:

我在通过 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 项目中对我自己“可见”?

【问题讨论】:

    标签: c# visual-studio tfs azure-devops


    【解决方案1】:

    我相信你是对的我刚刚在一个 GIT 项目上针对我自己的 VSO 测试了你的代码,我无法检索任何 build.vNext 构建,但是我可以检索旧的 XAML 构建定义。

    然后我尝试使用REST API,它也只能返回旧样式的 XAML 构建,直到我让它使用版本 2 的 REST API,然后 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 服务器。
    【解决方案2】:

    您可以像使用 2.0 REST API 一样使用 BuildHttpClient 发出类似的请求。

    GitHub 上的这个 sample 是一个非常好的资源,如果您想对单个项目进行投票,它应该看起来更像这样:

    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()));
        }
    }
    

    【讨论】:

    • 非常像这样,我使用“buildClient.GetDefinitionAsync”来获取特定的构建定义,我想知道为什么“触发器”集合具有正确数量的项目,但有时对象该集合为空。经过数小时不成功的谷歌搜索。查看 WebApi DLL 给了我答案。 BuildTrigger 类只需要计划或 CI 构建,如果它是门控的(就像我的那样),那么你只会得到 NULL。希望这会有所帮助。
    • 您好!我正在尝试从该站点获取构建:dev.azure.com/LumiaWoA/Boot%20Shim/_build?definitionId=3 我应该使用什么 tfsUrl?谢谢
    • 您使用的是 VSTS 还是 TFS 的托管安装?
    • 我无法让GetDefinitionsAsync() 接受这样的参数。它有一堆我不明白的参数和重载,比如name, repositoryId 等等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2018-07-04
    • 1970-01-01
    相关资源
    最近更新 更多