使用 VSTS/TFS 的 .NET 客户端库检索构建定义的任务列表
Retrieve the list of Tasks for Build Definition using .NET client libraries for VSTS/TFS
我正在使用 VSTS/TFS (https://docs.microsoft.com/en-us/vsts/integrate/concepts/dotnet-client-libraries?view=vsts) 的 .NET 客户端库来检索所有团队项目的所有构建定义的任务列表。我正在使用 NuGet 包 Microsoft.TeamFoundation.ExtendedClient 的 v16.139.0 预览版(我需要这样做,因为我还需要检索发布定义工作流,您需要 Microsoft.VisualStudio.Services.Release.Client,它对扩展客户端)。服务器(本地)是 TFS 2017.2。我无论如何都无法检索 tasks/phases/process。这是我的代码:
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
}
}
- 我已尝试使用 buildClient.GetDefinitionAsync 重新检索构建定义,但没有其他效果
- "Steps" 属性(即将弃用)始终为 null
- "Process"属性为空
- 没有 "phases" 属性 可用(从构建定义中具有多个阶段的选项来看,这似乎合乎逻辑
- 有适用于 BuildDefinitionStep 的合同:https://docs.microsoft.com/en-us/vsts/extend/reference/client/api/tfs/build/contracts/builddefinitionstep?view=vsts
- REST API 文档没有名为 "Step" 的 属性:https://docs.microsoft.com/en-us/rest/api/vsts/build/definitions/get?view=vsts-rest-4.1#builddefinition
有人知道如何解决这个问题吗?
只需使用 .NET 客户端库尝试下面的 C# 示例,在 TFS 2017.3 和 VSTS 上测试,两者都有效。 (我这边没有 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 客户端,请参考此线程:Retrieve VSTS/TFS Build task name list
在@Andy 的帮助下,我解决了这个问题。我使用 Fiddler 调用 REST Api (http://server:8080/tfs/DefaultCollection/MyProject/_apis/build/definitions/1) 并读取 JSON 响应。我发现 "build" 属性 包含任务集合。我修复了@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
}
聚会有点晚了,但如果您想使用 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
}
}
我正在使用 VSTS/TFS (https://docs.microsoft.com/en-us/vsts/integrate/concepts/dotnet-client-libraries?view=vsts) 的 .NET 客户端库来检索所有团队项目的所有构建定义的任务列表。我正在使用 NuGet 包 Microsoft.TeamFoundation.ExtendedClient 的 v16.139.0 预览版(我需要这样做,因为我还需要检索发布定义工作流,您需要 Microsoft.VisualStudio.Services.Release.Client,它对扩展客户端)。服务器(本地)是 TFS 2017.2。我无论如何都无法检索 tasks/phases/process。这是我的代码:
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
}
}
- 我已尝试使用 buildClient.GetDefinitionAsync 重新检索构建定义,但没有其他效果
- "Steps" 属性(即将弃用)始终为 null
- "Process"属性为空
- 没有 "phases" 属性 可用(从构建定义中具有多个阶段的选项来看,这似乎合乎逻辑
- 有适用于 BuildDefinitionStep 的合同:https://docs.microsoft.com/en-us/vsts/extend/reference/client/api/tfs/build/contracts/builddefinitionstep?view=vsts
- REST API 文档没有名为 "Step" 的 属性:https://docs.microsoft.com/en-us/rest/api/vsts/build/definitions/get?view=vsts-rest-4.1#builddefinition
有人知道如何解决这个问题吗?
只需使用 .NET 客户端库尝试下面的 C# 示例,在 TFS 2017.3 和 VSTS 上测试,两者都有效。 (我这边没有 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 客户端,请参考此线程:Retrieve VSTS/TFS Build task name list
在@Andy 的帮助下,我解决了这个问题。我使用 Fiddler 调用 REST Api (http://server:8080/tfs/DefaultCollection/MyProject/_apis/build/definitions/1) 并读取 JSON 响应。我发现 "build" 属性 包含任务集合。我修复了@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
}
聚会有点晚了,但如果您想使用 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
}
}