Webhook URL 必须能到达 Webhooks 服务(端口 3332)。仅当您的反向代理将
/.../webhook 路径转发到 Webhooks 服务时,才能使用 API 域名。Azure Repos webhook URL 需要签名令牌
与 GitHub、GitLab、Bitbucket 和 Forgejo 不同,Azure Repos webhook 请求必须包含加密的token 查询参数。Kodus 对每个到达的请求验证此令牌,没有令牌的调用会被 403 Unauthorized 拒绝。该令牌由您在自托管设置中已配置的两个环境变量派生:
CODE_MANAGEMENT_SECRET— 32 字节的加密密钥(十六进制编码)。CODE_MANAGEMENT_WEBHOOK_TOKEN— 密钥加密的明文。
<generated> 值由使用 AES-256-CBC 将 CODE_MANAGEMENT_WEBHOOK_TOKEN 用 CODE_MANAGEMENT_SECRET 加密产生,格式为 <ivHex>:<cipherHex>。
当 Kody 通过 UI 驱动的集成流程为您创建 webhook 时,会自动生成此令牌。仅当您在 Azure DevOps 中手动注册 webhook 时,才需要手动生成。
生成 webhook 令牌
选择适合您环境的选项。两个选项都使用您的 Kodus 堆栈已配置的环境变量 — 您不需要克隆代码库。选项 A — 在运行中的 Kodus 容器内(推荐)
对已运行的api 容器执行。环境变量已经在作用域内:
?token=... 的值。示例:
选项 B — 本地使用 Node(无 Docker)
如果您的 Kodus 堆栈未运行,或您想在另一台机器上生成令牌,导出两个环境变量后运行:在 Azure DevOps 中创建 webhook 订阅
- 导航到您的 Azure DevOps 项目。
- 单击左下角的项目设置。
- 在常规下,选择服务钩子。
- 单击 + 创建订阅。
-
配置 webhook:
- 服务: Web Hooks
- 在此类型的事件上触发: 选择一个受支持的事件(见下文)
-
URL: 您的 Kodus Azure Repos webhook URL,附加令牌:
- 过滤器(可选):如果需要,按仓库或分支过滤。
- 操作: 向给定的 URL 发送 POST 请求。
- 单击完成。
git.pullrequest.created— 拉取请求已创建git.pullrequest.updated— 拉取请求已更新git.pullrequest.merge.attempted— 拉取请求合并已尝试ms.vss-code.git-pullrequest-comment-event— 拉取请求已评论
确保该 URL 可以从 Azure DevOps 访问,并在端口 3332 上(直接或通过您的反向代理)接受到达的 POST 请求。
故障排查
Azure 发送了 webhook 但 Kodus 返回 403
Azure 发送了 webhook 但 Kodus 返回 403
?token= 值缺失、被截断,或者用与运行中 API 使用的不同的 CODE_MANAGEMENT_SECRET / CODE_MANAGEMENT_WEBHOOK_TOKEN 生成。使用选项 A 重新生成令牌(保证使用容器实际使用的环境变量产生),并在 Azure 中更新订阅 URL。Webhook 从未到达
Webhook 从未到达
Azure DevOps 对失败的投递重试次数有限。查看服务钩子页面 — 成功的投递会显示绿色勾号。如果投递因连接错误失败,验证 URL 从公网可达,并且您的反向代理将
/.../webhook 路径转发到端口 3332。一个事件有效但其他无效
一个事件有效但其他无效
每个事件类型在 Azure DevOps 中需要自己的订阅。如果您只创建了”拉取请求已创建”,更新和评论将不会触发审查。