Поделиться через


Создание подписки на веб-хук программно

Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019

С помощью интерфейсов REST API подписок можно программно создать подписку, которая выполняет действие в внешней/потребительской службе при возникновении определенного события в проекте Azure DevOps. Например, вы можете создать подписку, чтобы уведомить службу о сбое сборки.

Поддерживаемые события:

  • Сборка завершена
  • Отправленный код (для проектов Git)
  • Создать или обновить pull request (для проектов Git)
  • Код, зарегистрированный (в проектах TFVC)
  • Рабочий элемент, созданный, обновленный, удаленный, восстановленный или закомментированный

Фильтры в подписках можно настроить для управления тем, какие события активируют действие. Например, можно отфильтровать завершенное событие сборки на основе состояния сборки. Для получения полного набора поддерживаемых событий и параметров фильтра ознакомьтесь со справочником по событиям .

Для получения полной информации о поддерживаемых службах и действиях для потребителей, см. справочник для потребителей.

Необходимые условия

Категория Требования
доступ к проекту член проекта.
данные — Идентификатор проекта. Чтобы получить идентификатор проекта, используйте REST API проекта.
— Идентификатор события и параметры. См. справочник по событиям .
— Идентификаторы и настройки пользователей и действий. Смотрите справочник потребителей .

Создание запроса

Создайте текст HTTP-запроса POST, чтобы создать подписку на основе идентификатора проекта, события, потребителя и действия.

См. следующий пример запроса на создание подписки, которая приводит к отправке события сборки в https://myservice/event при сбое сборки WebSite.CI.

запрос

{
    "publisherId": "tfs",
    "eventType": "build.complete",
    "resourceVersion": "1.0",
    "consumerId": "webHooks",
    "consumerActionId": "httpRequest",
    "publisherInputs": {
        "buildStatus": "failed",
        "definitionName": "WebSite.CI",
        "projectId": "56479caf-1eeb-4bca-86ab-aaa6f29399d9",
    },
    "consumerInputs": {
        "url": " https://myservice/event"
    },
}

Настоятельно рекомендуется использовать безопасные URL-адреса HTTPS для безопасности частных данных в объекте JSON.

Ответ Смотрите следующий ответ на запрос о создании подписки:

{
    "id": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
    "url": "https://dev.azure.com/fabrikam/DefaultCollection/_apis/hooks/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
    "publisherId": "tfs",
    "eventType": "build.complete",
    "resourceVersion": "1.0",
    "consumerId": "webHooks",
    "consumerActionId": "httpRequest",
    "createdBy": {
        "id": "00ca946b-2fe9-4f2a-ae2f-40d5c48001bc"
    },
    "createdDate": "2014-03-28T16:10:06.523Z",
    "modifiedBy": {
        "id": "1c4978ae-7cc9-4efa-8649-5547304a8438"
    },
    "modifiedDate": "2014-04-25T18:15:26.053Z",
    "publisherInputs": {
        "buildStatus": "failed",
        "definitionName": "WebSite.CI",
        "hostId": "17f27955-99bb-4861-9550-f2c669d64fc9",
        "projectId": "56479caf-1eeb-4bca-86ab-aaa6f29399d9",
        "tfsSubscriptionId": "29cde8b4-f37e-4ef9-a6d4-d57d526d82cc"
    },
    "consumerInputs": {
        "url": "http://myservice/event"
    }
}

Если запрос на подписку завершается сбоем, вы получите код ответа HTTP 400 с сообщением, которое содержит дополнительные сведения.

Что происходит при возникновении события?

При возникновении события оцениваются все включенные подписки в проекте, а действие потребителя выполняется для всех соответствующих подписок.

Версии ресурсов (расширенные)

Управление версиями ресурсов применимо, если API находится в предварительной версии. Для большинства сценариев указание 1.0 в качестве версии ресурса является самым безопасным маршрутом.

Полезные данные события, отправленные определенным потребителям, таким как веб-перехватчики, Azure Service Bus и Azure Storage, включают представление в формате JSON ресурса объекта (например, сборку или рабочий элемент). Представление этого ресурса может иметь разные формы или версии.

Вы можете указать версию ресурса, который вы хотите отправить в службу потребителей, с помощью поля resourceVersion подписки. Версия ресурса совпадает с версией API . Не указание версии ресурса означает "последняя выпущенная". Всегда следует указывать версию ресурса, которая гарантирует согласованность данных о событиях с течением времени.

Часто задаваемые вопросы

Вопрос. Есть ли службы, на которые я могу подписаться вручную?

Ответ. Да. Дополнительные сведения о службах, на которые можно подписаться через страницу администрирования проекта, см. в разделе Обзор.

Вопрос. Существуют ли библиотеки C#, которые можно использовать для создания подписок?

Ответ. Нет, но вот пример, который поможет вам приступить к работе.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Mvc;

namespace Microsoft.Samples.VisualStudioOnline
{
    public class ServiceHookEventController : Controller
    {

        // POST: /ServiceHookEvent/workitemcreated
        [HttpPost]
        public HttpResponseMessage WorkItemCreated(Content workItemEvent)
        {
            //Grabbing the title for the new workitem
            var value = RetrieveFieldValue("System.field", workItemEvent.Resource.Fields);

            //Acknowledge event receipt
            return new HttpResponseMessage(HttpStatusCode.OK);
        }

        /// <summary>
        /// Gets the value for a specified work item field.
        /// </summary>
        /// <param name="key">Key used to retrieve matching value</param>
        /// <param name="fields">List of fields for a work item</param>
        /// <returns></returns>
        public String RetrieveFieldValue(String key, IList<FieldInfo> fields)
        {
            if (String.IsNullOrEmpty(key))
                return String.Empty;

            var result = fields.Single(s => s.Field.RefName == key);

            return result.Value;
        }

	}

    public class Content
    {
        public String SubscriptionId { get; set; }

        public int NotificationId { get; set; }

        public String EventType { get; set; }

        public WorkItemResource Resource { get; set; }

    }

    public class WorkItemResource
    {
        public String UpdatesUrl { get; set; }

        public IList<FieldInfo> Fields { get; set;}

        public int Id { get; set; }

        public int Rev { get; set; }

        public String Url { get; set; }

        public String WebUrl { get; set; }
    }

    public class FieldInfo
    {
        public FieldDetailedInfo Field { get; set; }

        public String Value { get; set; }

    }

    public class FieldDetailedInfo
    {
        public int Id { get; set; }

        public String Name { get; set; }

        public String RefName { get; set; }
    }
}