【问题标题】:Retrieve the list of Tasks for Build Definition using .NET client libraries for VSTS/TFS使用 .NET 客户端库为 VSTS/TFS 检索构建定义的任务列表
【发布时间】:2019-02-11 18:36:44
【问题描述】:

我正在使用 VSTS/TFS (https://docs.microsoft.com/en-us/vsts/integrate/concepts/dotnet-client-libraries?view=vsts) 的 .NET 客户端库来检索所有团队项目的所有构建定义的任务列表。我正在使用 NuGet 包 Microsoft.TeamFoundation.ExtendedClient 的 v16.139.0-preview 版本(我需要这样做,因为我还需要检索发布定义工作流,您需要 Microsoft.VisualStudio.Services.Release.Client ,它有一个ExtendedClient 的依赖项要求)。服务器(本地)是 TFS 2017.2。我无论如何都无法检索任务/阶段/过程。这是我的代码:

VssConnection connection = new VssConnection(new Uri("http://tfsserver:8080/tfs/defaultcollection"), new VssClientCredentials());
ProjectHttpClient projectClient = connection.GetClient<ProjectHttpClient>();
IEnumerable<TeamProjectReference> projects = projectClient.GetProjects().Result;
BuildHttpClient buildClient = connection.GetClient<BuildHttpClient>();
foreach (var project in projects)
{
  IPagedList<BuildDefinition> buildDefinitions = buildClient.GetFullDefinitionsAsync2(project: project.Name, name: null).Result;
  foreach (BuildDefinition buildDefinition in buildDefinitions)
  {
    // get the tasks
  }
}

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: c# tfs azure-devops azure-devops-rest-api


    【解决方案1】:

    聚会有点晚了,但如果您想使用 AzDO .NET 客户端库迭代构建任务,您需要将流程转换为 DesignerProcess/DockerProcess/YamlProcess。

    var buildDefinitions = await _buildClient.GetFullDefinitionsAsync(project.Id);
    foreach (var buildDefinition in buildDefinitions)
    {
        if (buildDefinition.Process != null && buildDefinition.Process is Microsoft.TeamFoundation.Build.WebApi.DesignerProcess designerProcess)
        {
            foreach (var phase in designerProcess.Phases)
                foreach (var step in phase.Steps)
                    Console.WriteLine($"taskname={step.DisplayName}");
            break;//lets exit the loop early
        }
    }
    

    演示库,https://github.com/f2calv/azdo-api-net-client-issue

    【讨论】:

      【解决方案2】:

      只需使用 .NET 客户端库尝试以下 C# 示例,在 TFS 2017.3VSTS 上进行测试,两者都可以。 (我这边没有 TFS 2017.2,如果我没记错的话,TFS 2017.2 的构建过程与 TFS 2015 类似,它没有“Process”和“phases”属性。)

      using System;
      using Microsoft.TeamFoundation.Build.WebApi;
      using Microsoft.VisualStudio.Services.Client;
      using Microsoft.VisualStudio.Services.Common;
      
      namespace RetrieveTaskList
      {
          class Program
          {
              static void Main(string[] args)
              {
                  //For TFS :
                  var tfsUrl = "http://ws-tfs2017:8080/tfs/DefaultCollection";
                  var buildClient = new BuildHttpClient(new Uri(tfsUrl), new VssAadCredential());
      
                  //For VSTS:
                  //var tfsUrl = "https://{account}.visualstudio.com";
                  //var buildClient = new BuildHttpClient(new Uri(tfsUrl), new VssBasicCredential(string.Empty, "PAT here"));
      
                  var definitions = buildClient.GetFullDefinitionsAsync(project: "ScrumProject");
      
                  foreach (var definition in definitions.Result)
                  {
                      Console.WriteLine(string.Format("\n {0} - {1}:", definition.Id, definition.Name));
      
                      // Get BuildDefinitionStep to array, each of which has a task property that contains things like the name of the task and the inputs.
                      var tasks = definition.Steps.ToArray();
      
                      //Get each step/task from the array
                      foreach (var task in tasks)
                      {
                          Console.WriteLine(task.DisplayName);
                      }
                  }
                  Console.ReadLine();
              }
          }
      }
      


      您还可以使用REST API 从构建定义中检索任务列表。

      以PowerShell为例:

      Param(
         [string]$baseurl = "http://server:8080/tfs/DefaultCollection", 
         [string]$projectName = "ProjectName",
         [string]$buildDefinitionID = "26",
         [string]$user = "domain\user",
         [string]$token = "password"
      )
      
      # Base64-encodes the Personal Access Token (PAT) appropriately
      $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))
      
      
      $uri = "$baseurl/$($projectName)/_apis/build/definitions/$buildDefinitionID"
      Write-Host $uri
      $result = (Invoke-RestMethod -Uri $uri -Method Get -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)})
      $tasks = $result.process.phases.steps.displayName
      
      foreach ($task in $tasks)
      {
        write-host $task
      }
      

      你也可以试试 REST Client,请参考这个帖子:Retrieve VSTS/TFS Build task name list

      【讨论】:

      • 感谢您的回答安迪。我知道我可以使用 REST API,但我特别要求使用客户端库的解决方案。根据您的回答,我假设在这种情况下无法使用客户端库?
      • 另外请注意,我按原样运行了您提供的脚本,但 $result.process 仍然是 $null。也许你忽略了我提供的 TFS 版本?
      • @Fokko 如果我没记错的话,TFS 2017.2 的构建过程与 TFS 2015 类似,它没有“Process”和“phases”属性。您可以从 REST API 的响应中检查属性。查看 .NET 客户端库的更新答案......
      • @Fokko 您是否通过更新的答案解决了问题?有更新吗?
      • 您提供的代码不适用于我的环境。使用 .NET 客户端库的第一个示例不起作用,因为“steps”属性始终为“null”。第二个示例不起作用,因为“process”属性始终为“null”。
      【解决方案3】:

      在@Andy 的帮助下,我能够解决问题。我使用 Fiddler 调用 REST Api (http://server:8080/tfs/DefaultCollection/MyProject/_apis/build/definitions/1) 并读取 JSON 响应。我发现“构建”属性包含任务集合。我修复了@Andy 提供的 PowerShell 脚本:

      Param(
         [string]$baseurl = "http://server:8080/tfs/DefaultCollection", 
         [string]$projectName = "MyProject",
         [string]$buildDefinitionID = "530",
         [string]$user = "domain\user",
         [string]$token = "PersonalAccessToken"
      )
      
      # Base64-encodes the Personal Access Token (PAT) appropriately
      $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))
      
      $uri = "$baseurl/$($projectName)/_apis/build/definitions/$buildDefinitionID"
      Write-Host $uri
      $result = (Invoke-RestMethod -Uri $uri -Method Get -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)})
      
      foreach ($task in $result.build)
      {
          Write-Host $task.displayName
      }
      

      【讨论】:

      • 所以这目前只能通过 REST-Api 实现,而不是通过客户端库? “Steps”属性在客户端库的版本 15.112.1 中填充,但在版本 15.131.1 中始终为 null :(
      猜你喜欢
      • 2017-12-26
      • 2017-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 2019-01-10
      • 2018-09-21
      相关资源
      最近更新 更多