Hozzon létre szolgáltatáshook-előfizetést programozott módon
Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019
Az Előfizetések REST API-kkal programozott módon hozhat létre egy előfizetést, amely műveletet hajt végre egy külső/fogyasztói szolgáltatáson, amikor egy adott esemény egy Azure DevOps-projektben történik. Létrehozhat például egy előfizetést, amely értesíti a szolgáltatást, ha egy build sikertelen lesz.
A támogatott események:
- Buildelés kész
- Kód leküldve (Git-projektek esetén)
- Lekéréses kérelem létrehozva vagy frissítve (Git-projektek esetén)
- Kód beadva (TFVC-projektek esetén)
- Munkaelem létrehozva, frissítve, törölve vagy visszaállítva, vagy hozzászólást fűztek hozzá
Az előfizetésekre vonatkozó szűrők konfigurálásával szabályozhatja, hogy mely események aktiváljanak műveletet. Szűrheti például a „buildelés kész” eseményt a buildelés állapota alapján. A támogatott eseményekkel és szűrési beállításokkal kapcsolatban tekintse meg az eseményeket ismertető referenciaanyagot.
Az összes támogatott fogyasztói szolgáltatást és műveletet a fogyasztókkal kapcsolatos referenciaanyagban találja.
Előfeltételek
Előfizetés létrehozásához a következő adatokra van szükség:
- Projektazonosító. A projektazonosító lekéréséhez használja a Project REST API-t .
- Eseményazonosító és beállítások. Tekintse meg az eseményhivatkozást.
- Fogyasztói és műveleti azonosítók és beállítások. Lásd a fogyasztói hivatkozást.
A kérés létrehozása
Hozza létre a HTTP POST-kérelem törzsét az előfizetés létrehozásához a projektazonosító, az esemény, a fogyasztó és a művelet alapján.
Tekintse meg az alábbi példakérést egy olyan előfizetés létrehozására vonatkozóan, amely miatt a buildesemény POST állapotú lesz https://myservice/event
, amikor a build WebSite.CI
meghiúsul.
Kérelem
{
"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"
},
}
Erősen javasoljuk, hogy biztonságos HTTPS URL-címeket használjunk a JSON-objektumban lévő személyes adatok biztonságához.
Válasz : Az előfizetés létrehozására vonatkozó kérésre a következő válasz jelenik meg:
{
"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"
}
}
Ha az előfizetési kérelem meghiúsul, egy 400-ból álló HTTP-válaszkódot kap egy további részleteket tartalmazó üzenettel.
Mi történik az esemény bekövetkezésekor?
Esemény bekövetkezésekor a rendszer kiértékeli a projekt összes engedélyezett előfizetését, és végrehajtja a fogyasztói műveletet az összes megfelelő előfizetés esetében.
Erőforrás-verziók (speciális)
Az erőforrás-verziószámozás akkor alkalmazható, ha egy API előzetes verziójú. A legtöbb forgatókönyv esetében 1.0
az erőforrásverzió megadása a legbiztonságosabb útvonal.
Az egyes felhasználóknak, például a Webhookoknak, az Azure Service Busnak és az Azure Storage-nak küldött esemény hasznos adatai tartalmazzák a tárgyerőforrás JSON-ábrázolását (például egy buildet vagy egy munkaelemet). Az erőforrás ábrázolása különböző űrlapokkal vagy verziókkal rendelkezhet.
Megadhatja annak az erőforrásnak a verzióját, amelyet el szeretne küldeni a fogyasztói szolgáltatásnak az resourceVersion
előfizetés mezőjén keresztül.
Az erőforrás verziója megegyezik az API-verzióval. Ha nem adja meg az erőforrásverziót, az azt jelenti, hogy "legújabb kiadású". Mindig meg kell adnia egy erőforrásverziót, amely biztosítja a konzisztens esemény hasznos adatait az idő függvényében.
GYIK
K: Vannak olyan szolgáltatások, amelyekre manuálisan tudok előfizetni?
V: Igen. Azokról a szolgáltatásokról, amelyekre feliratkozhat egy projekt adminisztrációs lapján, tekintse meg az Áttekintést.
K: Vannak C#-kódtárak, amelyekkel előfizetéseket hozhatok létre?
Válasz: Nem, de íme egy minta, amely segít az első lépésekben.
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; }
}
}