【问题标题】:Trouble connecting to the TFS2015 server via web api通过 web api 连接到 TFS2015 服务器时出现问题
【发布时间】:2020-05-25 13:14:15
【问题描述】:

我一直在尝试通过 web api 连接到我们的 TFS2015 服务器。我以前没有这样做过。我的目标是获得最后一次成功的构建,从他那里获取所有变更集,并为每个变更集提供从哪个分支转发到发布分支的信息。我无法连接到它,也不知道下一步是什么。

这是我的代码:

private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            VssConnection connection = new VssConnection(new Uri("http://srv-tfs2015:8080/tfs/"), new VssCredentials(useDefaultCredentials: true));

            Microsoft.TeamFoundation.Build.WebApi.BuildHttpClient buildKlijent = connection.GetClient<Microsoft.TeamFoundation.Build.WebApi.BuildHttpClient>();

            var lastBuild = buildKlijent.GetLatestBuildAsync("Argosy", "Argosy32New");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

lastBuild 包含一个带有消息的 VssResourceNotFountException:

API 资源位置 54481611-01f4-47f3-998f-160da0f0c229 未在 http://srv-tfs2015:8080/tfs/ 上注册。

构建驻留在团队项目 Argosy 中,该项目是服务器上 ArgosyCollection 的一部分,它是 XAML 构建定义。不知道这是否有什么不同。

你能帮我指出正确的方向吗?

【问题讨论】:

  • 至于凭据,我可以使用我的默认凭据(活动目录)轻松访问 tfs 门户网站。

标签: tfs tfs-2015


【解决方案1】:

Get Latest的文档说你必须使用rest api 5.1版本。但 TFS 2015 (API and TFS version mapping) 仅支持 2.4。所以你必须使用Get a list of build 并通过GetBuildsAsync 方法从结果列表中检测最后一个构建。

作为查看构建定义的最后 10 个构建的示例:

private static void ListBuildDefinitions(string TeamProjectName)
{
    List<BuildDefinitionReference> buildDefs = BuildClient.GetDefinitionsAsync(TeamProjectName).Result;

    foreach(BuildDefinitionReference buildDef in buildDefs)
    {
       Console.WriteLine("+================BUILD DEFINITION=======================================================");
       Console.WriteLine(" ID:{0, -9}|NAME:{1, -35}|PATH:{2}", buildDef.Id, buildDef.Name, buildDef.Path);
       Console.WriteLine(" REV:{0, -8}|QUEUE:{1, -34}|QUEUE STATUS:{2}", buildDef.Revision, (buildDef.Queue != null) ? buildDef.Queue.Name : "", buildDef.QueueStatus);

       ListBuilds(TeamProjectName, buildDef);
   }
}

private static void ListBuilds(string TeamProjectName, BuildDefinitionReference buildDef)
{
   List<Build> builds = BuildClient.GetBuildsAsync(TeamProjectName, new List<int> { buildDef.Id }).Result;

   if (builds.Count > 0)
   {
       Console.WriteLine("+====================BUILDS================================================================================");
       Console.WriteLine("+    ID      |        NUMBER        |      STATUS     |     START DATE     |    FINISH DATE     | COMMITS");
       Console.WriteLine("+----------------------------------------------------------------------------------------------------------");

        for (int i = 0; i < builds.Count && i < 10; i++)
        {
            var changes = BuildClient.GetBuildChangesAsync(TeamProjectName, builds[i].Id).Result;
            Console.WriteLine(" {0, -12}|{1, -22}|{2, -17}|{3, -20}|{4, -20}|{5}", builds[i].Id, builds[i].BuildNumber, builds[i].Status,
                (builds[i].StartTime.HasValue) ? builds[i].StartTime.Value.ToString() : "",
                (builds[i].FinishTime.HasValue) ? builds[i].FinishTime.Value.ToString() : "", changes.Count);
        }
    }
    else
        Console.WriteLine("+=======================================================================================");
}

在此处查看 TFS 2015 的可用功能:Pre-Version 4.1 REST API documentation

【讨论】:

  • 谢谢。没有考虑到早期版本中不存在某些服务。有趣的是,BuildClient.GetBuildsAsync 不适用于 XAML 构建,但适用于 vNext 构建。应该没问题,因为这是迁移我们的构建工作的一部分。
【解决方案2】:

尝试通过添加项目集合名称和@字符来修改Uri,例如:

VssConnection connection = new VssConnection(new Uri(@"http://srv-tfs2015:8080/tfs/DefaultCollection"), myCredentials);

【讨论】:

    猜你喜欢
    • 2011-11-16
    • 2020-08-12
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 2010-10-11
    • 2017-05-06
    相关资源
    最近更新 更多