Я использую 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?
заранее спасибо
Да, на самом деле, после запроса сообщества Microsoft, я обнаружил, что эта функция недоступна, это tfs .net api, так что это конец
Вы устанавливаете расписания в самом определении сборки. Вы не устанавливаете расписание для поставленного в очередь экземпляра сборки. Для этого вы должны использовать метод UpdateDefinitionAsync
в библиотеках API.
Или, если вы используете YAML, вы определяете расписание в YAML.
Привет, Даниэль, можем ли мы добавить параметры в yaml с помощью С# после того, как у нас будут ссылки на определения? Является ли определение сборки таким же, как новая Build()?
Я получаю определение, используя BuildClient.GetDefinitionAsync(projectName, userSelectedPipelineID).Result; У него есть свойство Triggers, но есть только get; нет сеттера. Создаю ли я определение каким-то другим способом? как мы можем установить расписание триггеров для обновления определения?
Привет, я проверил документ на 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
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. Можете ли вы помочь мне придумать структуру запроса для триггеров?
@DivyanshuAgarwal Я обновил свой ответ, и вы можете проверить его для своего сценария. Я обнаружил, что установка триггера с помощью rest API напрямую слишком сложна, поэтому я предлагаю вам другой обходной путь.
Просто чтобы прояснить ситуацию, имя консольного приложения является триггером? Мне было интересно, можем ли мы добавить расписание внутри тела запроса, будет ли оно работать?
Протестируйте на моей стороне, вы можете проверить триггерную часть моего снимка экрана, чтобы настроить тело запроса и использовать метод put
с остальными API. Я снова обновил тело запроса в своем посте
Согласно сообществу Microsoft, эта функция пока невозможна с Tfs .net API.
привет, дивьяншу какое обновление?