Как мы можем запланировать конвейер на более позднее время, используя REST API в нашем веб-API С#?

Я использую Microsoft.TeamFoundation.Build.WebApi, Microsoft.TeamFoundation.Core.WebApi, Microsoft.VisualStudio.Services.Common, Microsoft.VisualStudio.Services.WebApi.

для запуска конвейеров из моего веб-приложения asp.net.

Я могу запускать конвейеры, получать рабочие элементы, определения, но я изо всех сил пытаюсь установить запланированный триггер для конвейера, используя buildClient.QueueBuildAsync(build)

Я попытался использовать абстрактный класс BuildTrigger в Microsoft.TeamFoundation.Build.WebApi, который содержит перечисление свойства 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);

Вышеприведенный код в соответствии с комментарием Дэниела принимает определение для обновления существующего определения в проекте, но я не могу установить 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 для создания триггера, но, согласно последнему комментарию, мы не можем установить триггеры с помощью того же TFS sdk.

Какова структура REST API для создания и планирования триггеров в репозитории devops?

заранее спасибо

привет, дивьяншу какое обновление?

Ceeno Qi-MSFT 12.01.2023 10:49

Да, на самом деле, после запроса сообщества Microsoft, я обнаружил, что эта функция недоступна, это tfs .net api, так что это конец

Divyanshu Agarwal 05.02.2023 17:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
115
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы устанавливаете расписания в самом определении сборки. Вы не устанавливаете расписание для поставленного в очередь экземпляра сборки. Для этого вы должны использовать метод UpdateDefinitionAsync в библиотеках API.

Или, если вы используете YAML, вы определяете расписание в YAML.

Привет, Даниэль, можем ли мы добавить параметры в yaml с помощью С# после того, как у нас будут ссылки на определения? Является ли определение сборки таким же, как новая Build()?

Divyanshu Agarwal 04.01.2023 20:22

Я получаю определение, используя BuildClient.GetDefinitionAsync(projectName, userSelectedPipelineID).Result; У него есть свойство Triggers, но есть только get; нет сеттера. Создаю ли я определение каким-то другим способом? как мы можем установить расписание триггеров для обновления определения?

Divyanshu Agarwal 04.01.2023 20:35

Привет, я проверил документ на BuildDefinition.Triggers Property, и он показывает, что триггеры могут быть только перечислены и не имеют других свойств.

Стоимость имущества

Список BuildTrigger

И я также проверяю этот SDK в Visual Studio. А триггер можно было только перечислить.

Поэтому я предполагаю, что вы могли бы использовать rest API для настройки свойства триггера вашего конвейера в C#. Я попытался захватить остальные 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 напрямую как для классического, так и для yaml. И конвейер yaml также получил Cron Definition

И есть еще один метод планирования конвейера программно. Вы можете создать консольное приложение с помощью метода 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 недели».

Видя, что триггеры нельзя установить с помощью Tfs sdk, мне нужно использовать REST Api только для создания и планирования триггера? Я создал триггер с помощью TeamFoundation Api, я обновлю код в деталях, но я думаю, что мы должны использовать только REST API. Можете ли вы помочь мне придумать структуру запроса для триггеров?

Divyanshu Agarwal 05.01.2023 09:53

@DivyanshuAgarwal Я обновил свой ответ, и вы можете проверить его для своего сценария. Я обнаружил, что установка триггера с помощью rest API напрямую слишком сложна, поэтому я предлагаю вам другой обходной путь.

Ceeno Qi-MSFT 06.01.2023 03:28

Просто чтобы прояснить ситуацию, имя консольного приложения является триггером? Мне было интересно, можем ли мы добавить расписание внутри тела запроса, будет ли оно работать?

Divyanshu Agarwal 06.01.2023 05:19

Протестируйте на моей стороне, вы можете проверить триггерную часть моего снимка экрана, чтобы настроить тело запроса и использовать метод put с остальными API. Я снова обновил тело запроса в своем посте

Ceeno Qi-MSFT 06.01.2023 06:41
Ответ принят как подходящий

Согласно сообществу Microsoft, эта функция пока невозможна с Tfs .net API.

Другие вопросы по теме