Retrieve the list of Tasks for Build Definition using .NET client libraries for VSTS/TFS

懵懂的女人 提交于 2021-01-28 06:11:08

问题


I'm using the .NET client libraries for VSTS/TFS (https://docs.microsoft.com/en-us/vsts/integrate/concepts/dotnet-client-libraries?view=vsts) to retrieve a list of tasks for all Build Definitions for all Team Projects. I'm using the v16.139.0-preview version of the NuGet package Microsoft.TeamFoundation.ExtendedClient (I need to because I need to retrieve Release Definition workflow as well for which you need Microsoft.VisualStudio.Services.Release.Client which has a dependency requirement for the ExtendedClient). The server (on-prem) is a TFS 2017.2. In no way I'm able to retrieve the tasks/phases/process. This is my code:

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
  }
}
  • I have tried to re-retrieve the Build Definition using buildClient.GetDefinitionAsync without additional effect
  • The "Steps" property (which is going to be deprecated) is always null
  • The "Process" property is empty
  • There is no "phases" property available (which seems logical looking at the options to have multiple phases in a Build Definition
  • There is a contract available for BuildDefinitionStep: https://docs.microsoft.com/en-us/vsts/extend/reference/client/api/tfs/build/contracts/builddefinitionstep?view=vsts
  • The REST API documentation doesn't have a property called "Step": https://docs.microsoft.com/en-us/rest/api/vsts/build/definitions/get?view=vsts-rest-4.1#builddefinition

Does anyone have an idea on how to solve this?


回答1:


Just try below C# sample using .NET client libraries, test on TFS 2017.3 and VSTS, both work. (No TFS 2017.2 on my side, If I remember correctly, TFS 2017.2 has the similar build process with TFS 2015, It has no the "Process" and "phases" attribute. )

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


You can also use the REST API to retrieve the list of tasks from a build definition.

PowerShell for example:

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
}

You can also try the REST Client, please reference this thread : Retrieve VSTS/TFS Build task name list




回答2:


With the help of @Andy I was able to solve the problem. I used Fiddler call the REST Api (http://server:8080/tfs/DefaultCollection/MyProject/_apis/build/definitions/1) and read the JSON response. I discovered that the "build" property contains the collection of tasks. I fixed the PowerShell script provided by @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:


A bit late to the party, but if you're wanting to iterate over the Build tasks using the AzDO .NET Client library you need to cast the Process to a 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
    }
}

Demo repo, https://github.com/f2calv/azdo-api-net-client-issue



来源:https://stackoverflow.com/questions/52205058/retrieve-the-list-of-tasks-for-build-definition-using-net-client-libraries-for

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!