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.webhook

性能

webhook 字符串。 必需为第一个属性。
Webhook 的名称。 可接受的值:[-_A-Za-z0-9]*。 对于 Azure DevOps Webhook, webhook 必须始终是一个 WebHook

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 Name>?api-version=6.0-preview该管道发出POST请求。 WebHook 名称必须与传入的 WebHook 服务连接的名称匹配。 此终结点公开可用,无需授权。 请求应具有以下正文。

{
    "resource": {
        "message": {
            "title": "Hello, world!",
            "subtitle": "I'm using WebHooks!"
        }
    }
}

从 Webhook 的请求正文访问数据时,请注意这可能会导致 YAML 不正确。 例如,如果在上一个管道中,步骤会 - script: echo ${{ parameters.WebHook.resource.message }}读取,并且通过 Webhook 触发管道,则管道不会运行。 这是因为在替换为包含以下 JSON 的替换${{ parameters.WebHook.resource.message.title }}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 校验和。 然后,它将它与请求标头中传递的校验和进行比较。 这样,调用方就证明了他们知道秘密。

我们来看一个示例。 假设你配置了名为“指定机密secret”的IncomingWH传入 Webhook 服务连接,并在名为X-WH-Checksum“HTTP 标头”的 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。 可以使用 。出于此目的,NET 的 System.Security.Cryptography.HMACSHA1 类。

为了防止由于新行或空格而导致验证失败,建议以最小化形式发送正文。 也就是说,发送

{"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 基于其字符串表示形式(不同)进行计算。

另请参阅