resources.webhooks.webhook 定义
使用 Webhook 资源可将管道与外部服务集成,以自动执行工作流。
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.
引用此定义的定义: resources.webhooks
属性
webhook
字符串。 作为第一个属性是必需的。
Webhook 的名称。 可接受的值:[-_A-Za-z0-9]*。
connection
字符串。 必需。
连接的名称。 如果是脱机 Webhook,这将是传入 Webhook 的类型,否则它将是 Webhook 扩展的类型。
type
字符串。
Webhook 扩展的名称。 如果它是脱机 Webhook,请将其留空。
filters
resources.webhooks.webhook.filters。
触发器筛选器列表。
示例
基本示例
可以按如下所示定义管道。
resources:
webhooks:
- webhook: WebHook
connection: IncomingWH
steps:
- script: echo ${{ parameters.WebHook.resource.message.title }}
若要使用 Webhook 触发管道,需要向 https://dev.azure.com/<org_name>/_apis/public/distributedtask/webhooks/<webhook_connection_name>?api-version=6.0-preview
发出 POST
请求。 此终结点公开可用,无需授权。 请求应具有以下正文。
{
"resource": {
"message": {
"title": "Hello, world!",
"subtitle": "I'm using WebHooks!"
}
}
}
从 Webhook 的请求正文访问数据时,请注意,这可能会导致错误的 YAML。 例如,如果在上一个管道中,步骤为 - script: echo ${{ parameters.WebHook.resource.message }}
,并且通过 Webhook 触发管道,则管道不会运行。 这是因为在将 ${{ parameters.WebHook.resource.message.title }}
替换为包含以下 JSON 的 message
的过程中,生成的 YAML 将变为无效。
{
"title": "Hello, world!",
"subtitle": "I'm using WebHooks!"
}
由于生成的 YAML 变得无效,因此没有管道运行排队响应。
防止未经授权的管道运行
Webhook 允许任何人触发管道,只要他们知道组织和 Webhook 服务连接的名称。
可以通过在创建传入 Webhook 服务连接时定义 机密 来防止未经授权的管道运行。 还需要指定包含 Webhook 正文的 SHA-1 校验和的 HTTP 标头的名称。
为了验证传入 Webhook REST API 调用是否已获得授权,Azure Pipelines 使用机密作为密钥计算请求正文的 SHA-1 校验和。 然后,它会将其与请求标头中传递的校验和进行比较。 这样,调用方就会证明他们知道机密。
接下来举例说明。 假设你配置了名为 IncomingWH
的传入 Webhook 服务连接,将机密指定为 secret
,并且校验和在名为 X-WH-Checksum
的 HTTP 标头中发送。 假设你有一个定义 Webhook 资源的管道。
假设你想要使用以下请求正文触发管道:
{"resource":{"message":{"title":"Hello, world!","subtitle":"I'm using WebHooks!"}}}
为此,需要向 发出 POST
请求 https://dev.azure.com/<org_name>/_apis/public/distributedtask/webhooks/IncomingWH?api-version=6.0-preview
, X-WH-Checksum
并添加值为 的 750D33212D3AD4932CC390819050734831A0A94F
标头。 无需指定任何用户名 & 密码或任何其他类型的身份验证信息。
Azure Pipelines 将使用 作为键独立计算正文 secret
的 SHA-1 校验和,并生成相同的 750D33212D3AD4932CC390819050734831A0A94F
值。 由于值匹配,因此调用已获授权,管道队列继续进行。
以伪代码SHA1(secret).ComputeHash(requestBody)
形式计算标头的值X-WH-Checksum
。 可以使用 。用于此目的的 System.Security.Cryptography.HMACSHA1
NET 类。
为了防止由于新行或空格而导致验证失败,建议以最小化的形式发送正文。 也就是说,发送
{"resource":{"message":{"title":"Hello, world!","subtitle":"I'm using WebHooks!"}}}
而不是
{
"resource": {
"message": {
"title": "Hello, world!",
"subtitle": "I'm using WebHooks!"
}
}
}
即使上述两个 JSON 对象表示同一对象,它们也会生成不同的 SHA-1 校验和。 这是因为 SHA-1 是根据其字符串表示形式计算的,这是不同的。