Program aracılığıyla hizmet kancası aboneliği oluşturma

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Abonelikler REST API'lerini kullanarak, bir Azure DevOps projesinde belirli bir olay gerçekleştiğinde bir dış/tüketici hizmetinde eylem gerçekleştiren bir abonelik program aracılığıyla oluşturabilirsiniz. Örneğin, bir derleme başarısız olduğunda hizmetinizi bilgilendirmek için bir abonelik oluşturabilirsiniz.

Desteklenen olaylar:

  • Derleme tamamlandı
  • Kod gönderildi (Git projeleri için)
  • Çekme isteği oluşturma veya güncelleştirme (Git projeleri için)
  • kod iade edildi (TFVC projeleri)
  • İş öğesi oluşturuldu, güncelleştirildi, silindi, geri yüklendi veya yorumlandı

Bir eylemi tetikleyen olayları denetlemek için aboneliklerinizdeki filtreleri yapılandırabilirsiniz. Örneğin, derleme tamamlandı olayını derleme durumuna göre filtreleyebilirsiniz. Desteklenen olayların ve filtre seçeneklerinin tam kümesi için olay başvurusuna bakın.

Desteklenen tüketici hizmetlerinin ve eylemlerinin tamamı için tüketici başvurusuna bakın.

Önkoşullar

Abonelik oluşturmak için aşağıdaki veriler gereklidir:

İsteği oluşturma

Proje kimliğine, olaya, tüketiciye ve eyleme göre abonelik oluşturmak için HTTP POST isteğinin gövdesini oluşturun.

Derleme başarısız olduğunda WebSite.CI post'a https://myservice/event derleme olayına neden olan bir abonelik oluşturmak için aşağıdaki örnek isteğe bakın.

İste

{
    "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"
    },
}

JSON nesnesindeki özel verilerin güvenliği için güvenli HTTPS URL'leri kullanmanızı kesinlikle öneririz.

Yanıt Aboneliği oluşturma isteğine aşağıdaki yanıta bakın:

{
    "id": "74aeeed0-bf5d-48dc-893f-f862b80987e9",
    "url": "https://dev.azure.com/fabrikam/DefaultCollection/_apis/hooks/subscriptions/74aeeed0-bf5d-48dc-893f-f862b80987e9",
    "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"
    }
}

Abonelik isteği başarısız olursa, daha fazla ayrıntı içeren bir ileti içeren 400 HTTP yanıt kodu alırsınız.

Olay gerçekleştiğinde ne olur?

Bir olay oluştuğunda, projedeki tüm etkin abonelikler değerlendirilir ve tüm eşleşen abonelikler için tüketici eylemi gerçekleştirilir.

Kaynak sürümleri (gelişmiş)

Bir API önizleme aşamasındayken kaynak sürümü oluşturma uygulanabilir. Çoğu senaryoda, kaynak sürümü olarak belirtmek 1.0 en güvenli yoldur.

Web kancaları, Azure Service Bus ve Azure Depolama gibi belirli tüketicilere gönderilen olay yükü, konu kaynağının (örneğin, derleme veya iş öğesi) JSON gösterimini içerir. Bu kaynağın gösterimi farklı formlara veya sürümlere sahip olabilir.

Aboneliğin üzerindeki alanı aracılığıyla tüketici hizmetine göndermek istediğiniz kaynağın resourceVersion sürümünü belirtebilirsiniz. Kaynak sürümü API sürümüyle aynıdır. Kaynak sürümü belirtilmemesi "en son yayınlanan" anlamına gelir. Zaman içinde tutarlı bir olay yükü sağlayan bir kaynak sürümü belirtmeniz gerekir.

SSS

S: El ile abone olabileceğim hizmetler var mı?

Y: Evet. Bir projenin yönetim sayfasından abone olabileceğiniz hizmetler hakkında daha fazla bilgi için bkz . Genel Bakış.

S: Abonelik oluşturmak için kullanabileceğim C# kitaplıkları var mı?

Y: Hayır, ancak başlamanıza yardımcı olacak bir örnek aşağıda verilmiştir.

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; }
    }
}