Creare una sottoscrizione hook del servizio a livello di codice
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
Usando le API REST delle sottoscrizioni , è possibile creare a livello di codice una sottoscrizione che esegue un'azione su un servizio esterno/consumer quando si verifica un evento specifico in un progetto Azure DevOps. Ad esempio, è possibile creare una sottoscrizione per notificare al servizio quando una compilazione ha esito negativo.
Eventi supportati:
- Compilazione completata
- Codice inviato (nei progetti Git)
- Creazione o aggiornamento della richiesta pull (per i progetti Git)
- Codice inserito (progetti TFVC)
- Elemento di lavoro creato, aggiornato, eliminato, ripristinato o commentato
È possibile configurare filtri per le sottoscrizioni per controllare quali eventi attivano un'azione. Ad esempio, è possibile filtrare l'evento di compilazione completato in base allo stato di compilazione. Per un set completo di eventi supportati e opzioni di filtro, vedere la Guida agli eventi.
Per un set completo di servizi e azioni supportati per il consumatore, vedere il riferimento al consumatore .
Prerequisiti
Categoria | Requisiti |
---|---|
di accesso a Project | membro del progetto. |
Dati | - Progetto ID. Usare l'API REST del progetto per ottenere l'ID del progetto. - ID evento e impostazioni. Consultare il riferimento all'evento. - ID e impostazioni del consumatore e dell'azione. Vedere le informazioni di riferimento consumer. |
Creare la richiesta
Costruire il corpo della richiesta HTTP POST per creare la sottoscrizione in base all'ID progetto, all'evento, al consumer e all'azione.
Consultare il seguente esempio di richiesta per la creazione di una sottoscrizione che provoca l'invio di un evento di compilazione a https://myservice/event
quando la compilazione WebSite.CI
non riesce.
Richiesta
{
"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"
},
}
È consigliabile usare URL HTTPS sicuri per la sicurezza dei dati privati nell'oggetto JSON.
Risposta Vedere la risposta seguente alla richiesta di creazione della sottoscrizione:
{
"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"
}
}
Se la richiesta di sottoscrizione non riesce, viene visualizzato un codice di risposta HTTP pari a 400 con un messaggio con altri dettagli.
Cosa accade quando si verifica l'evento?
Quando si verifica un evento, vengono valutate tutte le sottoscrizioni abilitate nel progetto e l'azione consumer viene eseguita per tutte le sottoscrizioni corrispondenti.
Versioni delle risorse (avanzate)
Il controllo delle versioni delle risorse è applicabile quando un'API è in anteprima. Per la maggior parte degli scenari, specificare 1.0
come versione della risorsa è l'opzione più sicura.
Il payload dell'evento inviato a determinati consumer, ad esempio Webhooks, Azure Service Bus e Azure Storage, include una rappresentazione JSON della risorsa oggetto (ad esempio, una build o un elemento di lavoro). La rappresentazione di questa risorsa può avere forme o versioni diverse.
È possibile specificare la versione della risorsa che si vuole inviare al servizio consumer tramite il campo resourceVersion
nella sottoscrizione.
La versione della risorsa è la stessa della versione dell'API . Se non si specifica una versione della risorsa, significa "ultima versione rilasciata". È consigliabile specificare sempre una versione della risorsa, che garantisce un payload di eventi coerente nel tempo.
Domande frequenti
D: Sono disponibili servizi che è possibile sottoscrivere manualmente?
R: Sì. Per altre informazioni sui servizi a cui è possibile eseguire la sottoscrizione dalla pagina di amministrazione di un progetto, vedere panoramica .
D: Sono disponibili librerie C# che è possibile usare per creare sottoscrizioni?
R: No, ma ecco un esempio per iniziare.
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; }
}
}