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

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018-TFS 2017

Abonelikler REST API 'lerini kullanarak, bir projede belirli bir olay oluştuğunda bir dış (tüketici) hizmeti üzerinde eylem gerçekleştiren bir abonelik oluşturabilirsiniz. Örneğin, bir derleme başarısız olduğunda hizmetinize bildirimde bulunan bir abonelik oluşturabilirsiniz.

Desteklenen olaylar:

  • derleme tamamlandı
  • kod gönderildi (git projeleri için)
  • çekme isteği oluşturma veya güncelleme (git projeleri için)
  • kod iade edildi (TFVC projeleri)
  • iş öğesi oluşturuldu, güncelleştirildi, silindi, geri yüklendi veya yorum yapıldı

Hangi olayların bir eylemi tetikleyeceğini denetlemek için aboneliklerinizde filtreler yapılandırabilirsiniz. Örneğin, oluşturma tamamlandı olayını derleme durumuna göre filtreleyebilirsiniz. Desteklenen olayların ve filtre seçeneklerinin tamamına yönelik bir küme için bkz. olay başvurusu.

Desteklenen bir tüketici hizmetleri ve eylemleri kümesi için bkz. Tüketici başvurusu.

Proje için abonelik oluşturma

Bir olaya abonelik oluşturmak için, hangi tüketicinin kullanılacağını ve gerçekleştirmek istediğiniz eylemi seçin. abonelik için gerçekleştirilecek olay, tüketici ve eylem ile Azure DevOps kuruluşun abonelik URL 'sine bir HTTP POST isteği oluşturun.

Başlamadan önce

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

İstek oluştur

Proje KIMLIĞI, olay, tüketici ve eyleme göre abonelik oluşturmak için HTTP POST isteğinin gövdesini oluşturun.

İşte derleme başarısız olduğunda derleme olayının gönderilmesini sağlayan bir abonelik oluşturmaya yönelik bir istek aşağıda verilmiştir https://myservice/eventWebSite.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"
    },
}

Güvenli HTTPS URL 'Leri, JSON nesnesindeki özel verilerin güvenliği için kesinlikle önerilir.

Aboneliğin oluşturulması için isteğin yanıtı aşağıda verilmiştir:

{
    "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 ile 400 HTTP yanıt kodu döndürülür.

Olay gerçekleştiğinde ne olur?

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

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

Kaynak sürümü oluşturma, bir API önizlemede olduğunda geçerlidir. Çoğu senaryoda 1.0 kaynak sürümü olarak belirtme en güvenli yoldur.

belirli tüketicilere gönderilen olay yükü (Web kancaları, azure Service Bus, azure Depolama), konu kaynağının JSON gösterimini içerir (örneğin, bir derleme veya iş öğesi). Bu kaynağın temsili farklı formlara (veya sürümlere) sahip olabilir. Abonelik alanındaki alan aracılığıyla tüketici hizmetine gönderilmesini istediğiniz kaynağın sürümünü belirtebilirsiniz resourceVersion . Kaynak sürümü, API sürümüile aynıdır. Kaynak sürümü belirtilmeden "en son yayınlanan" anlamına gelir. Her zaman bir kaynak sürümü belirtmeniz gerekir. Bu, zaman içinde tutarlı bir olay yükü sağlar.

soru & -cevap

S: el ile abone olabileceği hizmetler var mı?

C: Evet. Projenin yönetim sayfasından abone olabileceğiniz Hizmetler aşağıda verilmiştir.

S: abonelikleri oluşturmak için kullanılabilecek C# kitaplıkları var mı?

Y: Hayır, ancak kullanmaya 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);

            if (result == null)
                return String.Empty;

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