繁体   English   中英

我们如何在我们的 c# web api 中使用 REST API 安排管道供以后使用?

[英]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 方法创建控制台应用程序,如下所示。

使用 rest api 运行管道

使用 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM