--- date: "2016-12-01T16:00:00+02:00" slug: "webhooks" sidebar_position: 30 aliases: - /zh-cn/webhooks --- # Webhooks Gitea 可以为仓库活动发送出站 Webhook。仓库级 Webhook 由仓库管理员在 `/:username/:reponame/settings/hooks` 中配置。组织、用户和系统管理级别 也有对应的 Webhook 配置页面。 Webhook 配置支持四种作用域: - `仓库 Webhook`:仅对单个仓库中的活动触发。 - `组织 Webhook`:对该组织拥有的仓库中的活动触发。 - `用户 Webhook`:对该用户拥有的仓库中的活动触发。 - `系统 Webhook`:对实例中的所有符合条件的活动触发。 Gitea 还支持由管理员定义的 `默认 Webhook`。它并不是额外的投递作用域, 而是会在新仓库创建时被复制到仓库中,之后按普通仓库 Webhook 的方式工作。 Gitea 支持以下出站 Webhook 集成: - Gitea - Gogs - Slack - Discord - Dingtalk - Telegram - Microsoft Teams - Feishu - Matrix - Wechatwork - Packagist `Gitea` 和 `Gogs` 类型会发送通用 Webhook 负载。上面列出的聊天和服务集成 会将同一个内部事件转换为各自服务所需的请求体格式。 本页分为三个部分: - `配置`:如何配置 Webhook 设置,例如 URL、密钥、分支过滤器和授权头。 - `投递`:Gitea 如何发送 Webhook 请求、会携带哪些请求头,以及如何校验投递。 - `事件`:Gitea 会投递哪些事件,以及每个事件包含哪些顶层 payload 参数。 ## 配置 本节介绍在创建或编辑 Webhook 时可以设置的选项。 ### 配置 Webhook 创建 Webhook 时,主要配置项包括: - `Target URL`:接收投递的目标地址。 - `HTTP Method`:通用 Webhook 通常使用 `POST`。 - `POST Content Type`:通用 Webhook 可使用 `application/json` 或 `application/x-www-form-urlencoded`。 - `Secret`:用于对原始请求体进行 HMAC 签名。 - `Authorization Header`:可选的自定义 `Authorization` 请求头,会随每次请求发送。 - `Branch Filter`:可选的分支或标签过滤规则。 - `Trigger On`:`Push Events`、`All Events` 或自定义事件选择。 - `Active`:是否启用该 Webhook。 :::note 旧示例里可能仍会在 JSON payload 中看到 `secret` 字段。当前版本的 Gitea 不会再把 Webhook 密钥放进 payload 正文中。请始终通过签名请求头来验证请求。 ::: ### 分支过滤器 分支过滤器使用与 [`github.com/gobwas/glob`](https://pkg.go.dev/github.com/gobwas/glob#Compile) 兼容的 glob 语法。 - 空值、`*` 或 `**` 表示匹配全部。 - 像 `main` 这样的普通分支名会匹配该分支。 - 也支持 `refs/tags/v*` 这样的完整 ref。 - 支持 `{main,release/*}` 这样的花括号表达式。 - 过滤器只对带 git ref 的事件生效,例如 `create`、`delete` 和 `push`。 - 不带 ref 的事件,例如 issue 或 release,会忽略分支过滤器。 示例: - `main` - `{main,feature/*}` - `{refs/heads/feature/*,refs/tags/release/*}` ### 授权头 Gitea 可以配置为在每次 Webhook 投递时发送自定义 [Authorization header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization)。 它与 Webhook 密钥是相互独立的: - 使用密钥通过 HMAC 校验请求完整性。 - 当接收端需要应用层认证时,使用 `Authorization` 请求头。 ## 投递 本节说明 Gitea 如何发送 Webhook 投递,以及接收端如何识别和验证这些请求。 ### 投递行为 - Webhook 会通过 HTTP 异步投递。 - 通用 `Gitea` 和 `Gogs` Webhook 支持 `POST` 与 `GET`;通常应使用 `POST`。 - 对于 `POST` 请求,payload 可以直接作为 JSON (`application/json`)发送,也可以放在名为 `payload` 的表单字段中 (`application/x-www-form-urlencoded`)。 - 某些特定服务的集成可能会使用该服务要求的 HTTP 方法和请求体格式。 ### 投递请求头 每次投递都包含唯一的 delivery ID 和事件请求头。对于兼容 GitHub 的集成, Gitea 也会同时发送对应的 GitHub 和 Gogs 风格请求头。 | 请求头 | 说明 | | --- | --- | | `X-Gitea-Delivery` | 本次投递尝试的唯一 UUID。 | | `X-Gitea-Event` | 规范化事件名,例如 `push`、`issues` 或 `pull_request`。 | | `X-Gitea-Event-Type` | 更具体的事件类型,例如 `issue_assign` 或 `pull_request_review_comment`。 | | `X-Gitea-Signature` | 原始请求体的十六进制 HMAC-SHA256 值,不带前缀。 | | `X-Gitea-Hook-Installation-Target-Type` | Webhook 定义所在范围,通常是 `repository`、`organization`、`user` 或 `system`。默认 Webhook 会先复制到仓库后再投递,因此通常会表现为 `repository`。 | | `X-Gogs-Delivery`、`X-Gogs-Event`、`X-Gogs-Event-Type`、`X-Gogs-Signature` | 与 Gitea 对应请求头值相同的兼容请求头。 | | `X-GitHub-Delivery`、`X-GitHub-Event`、`X-GitHub-Event-Type` | GitHub 风格兼容请求头。 | | `X-GitHub-Hook-Installation-Target-Type` | GitHub 风格的 Webhook 作用域请求头。 | | `X-Hub-Signature` | GitHub 兼容的 HMAC-SHA1 请求头,格式为 `sha1=`。 | | `X-Hub-Signature-256` | GitHub 兼容的 HMAC-SHA256 请求头,格式为 `sha256=`。 | 如果未配置密钥,签名请求头仍然会存在,但摘要值为空。 #### `Event` 与 `Event-Type` 某些 Gitea Webhook 订阅会被归类到同一个规范化事件名下。例如,issue 指派 投递会归类到 issue 事件组: ```http X-Gitea-Event: issues X-Gitea-Event-Type: issue_assign X-GitHub-Event: issues X-GitHub-Event-Type: issue_assign ``` 如果你需要知道真正触发投递的具体事件类型,请使用 `X-Gitea-Event-Type`。 #### 校验投递 Gitea 会使用你的 Webhook 密钥对原始请求体进行签名。要校验一次投递: 1. 按接收到的原始内容读取请求体。 2. 使用 Webhook 密钥计算 HMAC-SHA256 摘要。 3. 将结果与 `X-Gitea-Signature` 或 GitHub 兼容的 `X-Hub-Signature-256` 进行比较。 4. 尽量使用常量时间比较函数。 注意事项: - `X-Gitea-Signature` 仅包含小写十六进制的 SHA-256 摘要。 - `X-Hub-Signature-256` 使用相同摘要,但带有 `sha256=` 前缀。 - `X-Hub-Signature` 也会出于兼容性目的发送,其算法是 SHA-1。 - 在完成签名校验之前,不应先解析 JSON 或修改请求体。 ##### PHP 示例 下面的示例演示如何校验以 `application/json` 发送的通用 `Gitea` Webhook。 ```php