代码之家  ›  专栏  ›  技术社区  ›  Fokko

使用VSTS/TFS的.NET客户端库检索生成定义的任务列表

  •  1
  • Fokko  · 技术社区  · 7 年前

    https://docs.microsoft.com/en-us/vsts/integrate/concepts/dotnet-client-libraries?view=vsts )检索所有团队项目的所有生成定义的任务列表。我使用的是NuGet包的v16.139.0预览版Microsoft.TeamFoundation.ExtendedClient(我需要这样做,因为我还需要检索您需要的发布定义工作流Microsoft.VisualStudio.Services.发布.客户端它对ExtendedClient有依赖性要求)。服务器(在prem上)是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
      }
    }
    

    2 回复  |  直到 7 年前
        1
  •  1
  •   Andy Li-MSFT    7 年前

    2017年3月 VST公司 ,两者都起作用。(我这边没有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();
            }
        }
    }
    

    enter image description here


    您也可以使用 REST API 从生成定义检索任务列表。

    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
    }
    

    enter image description here

    您也可以尝试REST客户端,请参考此线程: Retrieve VSTS/TFS Build task name list

        2
  •  1
  •   Fokko    7 年前

    在@Andy的帮助下,我解决了这个问题。我用Fiddler调用restapi( http://server:8080/tfs/DefaultCollection/MyProject/_apis/build/definitions/1 )并读取JSON响应。我发现“build”属性包含任务集合。我修复了@Andy:

    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
    }
    
        3
  •  1
  •   alv    6 年前

    有点晚了,但是如果您想使用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

    推荐文章