definizione resources.webhooks.webhook
Una risorsa webhook consente di integrare la pipeline con un servizio esterno per automatizzare il flusso di lavoro.
webhooks:
- webhook: string # Required as first property. Name of the webhook.
connection: string # Required. Name of the connection. In case of offline webhook this will be the type of Incoming Webhook otherwise it will be the type of the webhook extension.
type: string # Name of the webhook extension. Leave this empty if it is an offline webhook.
filters: [ filter ] # List of trigger filters.
Definizioni che fanno riferimento a questa definizione: resources.webhooks
Proprietà
webhook
Stringa. Obbligatorio come prima proprietà.
Nome del webhook. Valori accettabili: [-_A-Za-z0-9]*.
connection
Stringa. Obbligatorio.
Nome della connessione. Nel caso di webhook offline, questo sarà il tipo di Webhook in ingresso altrimenti sarà il tipo dell'estensione webhook.
type
Stringa.
Nome dell'estensione webhook. Lasciare vuoto se si tratta di un webhook offline.
filters
resources.webhooks.webhook.filters.
Elenco dei filtri trigger.
Esempio
Esempio di base
È possibile definire la pipeline come indicato di seguito.
resources:
webhooks:
- webhook: WebHook
connection: IncomingWH
steps:
- script: echo ${{ parameters.WebHook.resource.message.title }}
Per attivare la pipeline usando il webhook, è necessario effettuare una POST
richiesta a https://dev.azure.com/<org_name>/_apis/public/distributedtask/webhooks/<webhook_connection_name>?api-version=6.0-preview
. Questo endpoint è disponibile pubblicamente e non è necessaria alcuna autorizzazione. La richiesta deve avere il corpo seguente.
{
"resource": {
"message": {
"title": "Hello, world!",
"subtitle": "I'm using WebHooks!"
}
}
}
Quando si accedono ai dati dal corpo della richiesta del webhook, tenere presente che potrebbe causare un YAML non corretto. Se, ad esempio, nella pipeline precedente, il passaggio legge - script: echo ${{ parameters.WebHook.resource.message }}
e si attiva la pipeline tramite un webhook, la pipeline non viene eseguita. Questo perché nel processo di sostituzione ${{ parameters.WebHook.resource.message.title }}
con message
, che contiene il codice JSON seguente, il YAML generato diventa non valido.
{
"title": "Hello, world!",
"subtitle": "I'm using WebHooks!"
}
Poiché l'YAML generato non è valido, nessuna esecuzione della pipeline viene accodata in risposta.
Impedire esecuzioni di pipeline non autorizzate
I webhook consentono a chiunque di attivare la pipeline, purché sappiano i nomi della connessione al servizio webhook e dell'organizzazione.
È possibile impedire l'esecuzione di pipeline non autorizzate definendo un segreto durante la creazione di una connessione al servizio Webhook in ingresso. È necessario specificare anche il nome dell'intestazione HTTP contenente il checksum SHA-1 del corpo del webhook.
Per verificare che sia autorizzata una chiamata API REST webhook in ingresso, Azure Pipelines calcola il checksum SHA-1 del corpo della richiesta usando il segreto come chiave. Viene quindi confrontato con il checksum passato nell'intestazione della richiesta. In questo modo, il chiamante dimostra che sanno il segreto.
Di seguito è descritto un esempio. Si supponga di aver configurato una connessione del servizio Webhook in ingresso denominata IncomingWH
, specificato il segreto e secret
che il checksum venga inviato nell'intestazione HTTP denominata X-WH-Checksum
. Si supponga di avere una pipeline che definisce una risorsa Webhook.
Si supponga di voler attivare la pipeline usando il corpo della richiesta seguente:
{"resource":{"message":{"title":"Hello, world!","subtitle":"I'm using WebHooks!"}}}
A tale scopo, è necessario effettuare una POST
richiesta a https://dev.azure.com/<org_name>/_apis/public/distributedtask/webhooks/IncomingWH?api-version=6.0-preview
e aggiungere l'intestazione con il X-WH-Checksum
valore di 750D33212D3AD4932CC390819050734831A0A94F
. Non è necessario specificare alcun nome utente & password o qualsiasi altro tipo di informazioni di autenticazione.
Azure Pipelines calcola in modo indipendente il checksum SHA-1 del corpo usando secret
la chiave e genererà lo stesso 750D33212D3AD4932CC390819050734831A0A94F
valore. Poiché i valori corrispondono, la chiamata è autorizzata e la coda della pipeline procede.
Si calcola il valore dell'intestazione X-WH-Checksum
, in pseudocode, come SHA1(secret).ComputeHash(requestBody)
. È possibile usare . Classe di System.Security.Cryptography.HMACSHA1
NET per questo scopo.
Per evitare errori di convalida a causa di nuove righe o spazi vuoti, è consigliabile inviare il corpo in un modulo ridotto al minimo. Vale a dire, inviare
{"resource":{"message":{"title":"Hello, world!","subtitle":"I'm using WebHooks!"}}}
invece di
{
"resource": {
"message": {
"title": "Hello, world!",
"subtitle": "I'm using WebHooks!"
}
}
}
Anche se i due oggetti JSON sopra rappresentano lo stesso oggetto, generano checksum SHA-1 diversi. Questo è dovuto al fatto che SHA-1 viene calcolato sulla relativa rappresentazione di stringa, che è diversa.