[英]How can we schedule a pipeline for a later time using REST API in our c# web api?
我正在使用 Microsoft.TeamFoundation.Build.WebApi、Microsoft.TeamFoundation.Core.WebApi、Microsoft.VisualStudio.Services.Common、Microsoft.VisualStudio.Services.WebApi
从我的 asp.net web 应用程序触发管道。
我可以触发管道、获取工作项、定义,但我正在努力使用 buildClient.QueueBuildAsync(build) 为管道设置计划触发器
我尝试在 Microsoft.TeamFoundation.Build.WebApi 中使用抽象 class BuildTrigger,它包含属性 DefinitionTriggerType 枚举和 8 号时间表,但我如何在排队之前将它实现到我的管道?
这就是我运行管道的方式:
var credential = new VssBasicCredential(string.Empty, patToken);
var connection = new VssConnection(new Uri("https://dev.azure.com/myteam5468/"), credential);
var buildClient = connection.GetClient<BuildHttpClient>();
var projectClient = connection.GetClient<ProjectHttpClient>();
projectClient.GetProjects();
var project = projectClient.GetProject(projectName).Result;
Console.WriteLine(project.Name);
var definition = buildClient.GetDefinitionAsync(projectName, userSelectedPipelineID).Result;
Console.WriteLine(definition.Name);
var build = new Build()
{
Definition = definition,
Project = project,
};`
//Runs Pipeline
buildClient.QueueBuildAsync(build).Wait();
Console.WriteLine(string.Format("Pipeline {0} started running successfully", definition.Name));
我们如何使用 TFS 库定义计划触发器?
更新 1:
buildClient.UpdateDefinitionAsync(definition.Triggers[0].TriggerType = DefinitionTriggerType.Schedule);
根据 Daniel 的评论,上面的代码采用了更新项目中现有定义的定义,但我无法设置 triggerType,因为它是只读的。
更新 2:
//Create Trigger
ScheduleTrigger trigger = new ScheduleTrigger();
//Create Schedule
Schedule schedule = new Schedule();
schedule.StartHours = 10;
schedule.StartMinutes = 00;
//Add schedule to trigger in a list
trigger.Schedules = new List<Schedule>();
trigger.Schedules.Add(schedule);
上面的代码使用 TeamFoundation.Build.WebApi 创建触发器,但根据最新评论,我们不能使用 Same TFS sdk 设置触发器。
在 devops 存储库中创建和调度触发器的 REST Api 结构是什么?
提前致谢
您好,我检查了BuildDefinition.Triggers Property的文档,它显示触发器只能列出并且没有其他属性。
适当的价值
列出 BuildTrigger
我还在 visual studio 中检查了这个 sdk。 触发器只能列出。
所以我想你可以使用 rest api 来自定义 C# 中的管道触发器属性。我试图在 UI 中捕获 rest api 并在下面找到。
PUT https://dev.azure.com/<org>/<project>/_apis/build/definitions/<pipelineID>?api-version=5.0-preview.6
================================================ =============
更新 1/6
在使用 rest api 设置计划触发器的更多调查中,我发现修改请求正文过于复杂,尤其是设置计划日期。
请求正文中的计划日期不是使用“星期一、星期二...星期日”,而是使用参数daystobuild
,其数字值为“仅星期一为1
”、“仅星期五为16
”、“星期六和星期日均为96
” .
请求正文
"triggers": [
{
"branchFilters": [],
"pathFilters": [],
"settingsSourceType": 2,
"batchChanges": false,
"maxConcurrentBuildsPerBranch": 1,
"triggerType": "continuousIntegration"
},
{
"schedules": [
{
"branchFilters": [
"+refs/heads/main"
],
"timeZoneId": "",
"startHours": 6,
"startMinutes": 0,
"daysToBuild": 31,
"scheduleOnlyWithChanges": true
},
{
"branchFilters": [
"+refs/heads/1"
],
"timeZoneId": "",
"startHours": 3,
"startMinutes": 0,
"daysToBuild": "saturday",
"scheduleOnlyWithChanges": true
}
],
"triggerType": "schedule"
}
],
所以我建议您可以通过 Azure DevOps UI 直接为经典和 yaml 设置计划触发器。yaml 管道也获得了Cron 定义
还有另一种以编程方式安排管道的方法。 您可以使用 rest api 方法创建控制台应用程序,如下所示。
using RestSharp;
using System;
namespace ConsoleApp18
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
var url = "https://dev.azure.com/{organization}/{project}/_apis/pipelines/{pipelineId}/runs?api-version=7.0";
string pat = "{PAT}";
var client = new RestClient(url);
var request = new RestRequest(url, Method.Post);
request.AddHeader("Authorization", "Basic "+pat);
request.AddHeader("Content-Type", "application/json");
var body = @"{
" + "\n" +
@""":"""
" + "\n" +
@"}";
request.AddParameter("application/json", body, ParameterType.RequestBody);
var response = client.Execute(request);
Console.WriteLine(response.Content);
}
}
}
构建应用程序后,您可以为此应用程序设置任务计划。 它还支持一些特殊的时间表,在我的测试中,我设置为“每 3 周的星期一和星期二”
您在构建定义本身上设置时间表。 您没有在构建的排队实例上设置时间表。 您将使用 API 库中的UpdateDefinitionAsync
方法来完成此操作。
或者,如果您使用的是 YAML,则可以在 YAML 中定义时间表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.