C# 查找所有带有 DEPECRATED 任务的 devops 构建定义
C# find all devops build definitions with DEPECRATED tasks
我们从 TFS Version 2017
更新到 Azure Devops
。我们现在看到我们有一些构建步骤,它们被标记为 DEPRECATED
。现在的想法是我们编写一个 C#
控制台应用程序,它生成一个包含所有 DEPRECATED
构建步骤的列表。最后,我们在 Microsoft.TeamFoundation.Build.WebApi.BuildDefinitionStep
中找不到 属性,我们可以检查此步骤是否标记为 DEPRECATED
。
我们用 C#
中编写的以下代码进行了尝试。变量 step
没有 属性 我们可以检查该步骤是否已弃用。
static void Main(string[] args)
{
//For TFS :
var tfsUrl = "http://[serername]:[port]/[tfs]/[name]";
var buildClient = new BuildHttpClient(new Uri(tfsUrl), new VssAadCredential());
var definitions = buildClient.GetFullDefinitionsAsync(project: "Projects");
foreach (var definition in definitions.Result)
{
Console.WriteLine(string.Format("\n {0} - {1}:", definition.Id, definition.Name));
foreach(var phase in ((Microsoft.TeamFoundation.Build.WebApi.DesignerProcess)definition.Process).Phases)
{
foreach(var step in phase.Steps)
{
Console.WriteLine($"{step.DisplayName} has no property to check is this step marked as deprecated or not.");
}
}
}
Console.ReadLine();
}
您尝试实现的目标在 Microsoft.TeamFoundationServer.Client NuGet 包中不可用。
但是您可以使用 HttpClient 向“_apis/distributedTask/tasks/{id}”端点请求您的 DevOps 服务器。如果您的任务定义已弃用,您将在响应中返回一个 JSON 对象,其中弃用字段可用。最后,您可以将 JSON 序列化为动态对象以检查已弃用的 属性.
static void Main(string[] args)
{
//For TFS :
var tfsUrl = "http://[serername]:[port]/[tfs]/[name]";
var buildClient = new BuildHttpClient(new Uri(tfsUrl), new VssAadCredential());
var definitions = buildClient.GetFullDefinitionsAsync(project: "Projects");
foreach (var definition in definitions.Result)
{
Console.WriteLine($"Check {definition.Id} - {definition.Name}...");
foreach (var phase in ((Microsoft.TeamFoundation.Build.WebApi.DesignerProcess)definition.Process).Phases)
{
foreach (var step in phase.Steps)
{
var handler = new HttpClientHandler();
handler.UseDefaultCredentials = true;
var client = new HttpClient(handler);
client.BaseAddress = new Uri(tfsUrl);
var response = client.GetAsync($"_apis/distributedTask/tasks/{step.TaskDefinition.Id}").Result;
var jsonResponse = response.Content.ReadAsStringAsync().Result;
dynamic d = JObject.Parse(jsonResponse);
if (d.Result != null && d.value[0].deprecated == true)
{
Console.WriteLine($"'{step.DisplayName}' is deprecated");
}
}
}
}
Console.WriteLine("Press any key to continue..");
Console.ReadLine();
}
我们从 TFS Version 2017
更新到 Azure Devops
。我们现在看到我们有一些构建步骤,它们被标记为 DEPRECATED
。现在的想法是我们编写一个 C#
控制台应用程序,它生成一个包含所有 DEPRECATED
构建步骤的列表。最后,我们在 Microsoft.TeamFoundation.Build.WebApi.BuildDefinitionStep
中找不到 属性,我们可以检查此步骤是否标记为 DEPRECATED
。
我们用 C#
中编写的以下代码进行了尝试。变量 step
没有 属性 我们可以检查该步骤是否已弃用。
static void Main(string[] args)
{
//For TFS :
var tfsUrl = "http://[serername]:[port]/[tfs]/[name]";
var buildClient = new BuildHttpClient(new Uri(tfsUrl), new VssAadCredential());
var definitions = buildClient.GetFullDefinitionsAsync(project: "Projects");
foreach (var definition in definitions.Result)
{
Console.WriteLine(string.Format("\n {0} - {1}:", definition.Id, definition.Name));
foreach(var phase in ((Microsoft.TeamFoundation.Build.WebApi.DesignerProcess)definition.Process).Phases)
{
foreach(var step in phase.Steps)
{
Console.WriteLine($"{step.DisplayName} has no property to check is this step marked as deprecated or not.");
}
}
}
Console.ReadLine();
}
您尝试实现的目标在 Microsoft.TeamFoundationServer.Client NuGet 包中不可用。
但是您可以使用 HttpClient 向“_apis/distributedTask/tasks/{id}”端点请求您的 DevOps 服务器。如果您的任务定义已弃用,您将在响应中返回一个 JSON 对象,其中弃用字段可用。最后,您可以将 JSON 序列化为动态对象以检查已弃用的 属性.
static void Main(string[] args)
{
//For TFS :
var tfsUrl = "http://[serername]:[port]/[tfs]/[name]";
var buildClient = new BuildHttpClient(new Uri(tfsUrl), new VssAadCredential());
var definitions = buildClient.GetFullDefinitionsAsync(project: "Projects");
foreach (var definition in definitions.Result)
{
Console.WriteLine($"Check {definition.Id} - {definition.Name}...");
foreach (var phase in ((Microsoft.TeamFoundation.Build.WebApi.DesignerProcess)definition.Process).Phases)
{
foreach (var step in phase.Steps)
{
var handler = new HttpClientHandler();
handler.UseDefaultCredentials = true;
var client = new HttpClient(handler);
client.BaseAddress = new Uri(tfsUrl);
var response = client.GetAsync($"_apis/distributedTask/tasks/{step.TaskDefinition.Id}").Result;
var jsonResponse = response.Content.ReadAsStringAsync().Result;
dynamic d = JObject.Parse(jsonResponse);
if (d.Result != null && d.value[0].deprecated == true)
{
Console.WriteLine($"'{step.DisplayName}' is deprecated");
}
}
}
}
Console.WriteLine("Press any key to continue..");
Console.ReadLine();
}