用途:帮助在服务端接收 CircleCI(CI/CD 平台)在 workflow 或 job 进入终态时 POST 的 JSON Webhook,并正确校验 circleci-signature 签名。注意与支付公司 Circle、以及第三方 POST 到 CircleCI 触发流水线的自定义 webhook 无关;签名密钥(Secret token)也不是 CircleCI API 令牌。
主要能力:签名校验,CircleCI 仅对原始请求体字节用 HMAC-SHA256 签名,密钥为 Secret token 的 UTF-8 字节(不做 base64 解码),摘要为小写十六进制。circleci-signature 形如逗号分隔的 <version>=<signature> 列表,只取 v1,无 v1 则拒绝,不得降级到其他版本;比较需先校验长度再用 timingSafeEqual 或 compare_digest,按第一个 = 拆分。提供 Node 与 Python 校验示例及已知测试向量。无官方 SDK,只能手写 HMAC。
事件与头:仅 workflow-completed(status 可为 success/failed/error/canceled/unauthorized)和 job-completed(无 error)两种;头含 circleci-event-type、可选 circleci-signature,无 delivery-id 与 timestamp 头。job-completed 额外带 job 对象。pipeline.vcs 仅在 GitHub OAuth 与 Bitbucket Cloud 流水线存在,GitLab 与 GitHub App 使用 trigger_parameters。负载为开放映射,需宽松解析。
使用方式:先验证再解析、异步处理,10 秒内返回 2xx;失败或超时会重试,次数与计划未公开;可能重复投递,按顶层 payload id 去重;每项目最多 5 个出站 webhook,需组织管理员管理。本地调试可用 npx hookdeck-cli listen 3000 circleci --path /webhooks/circleci,并配置环境变量 CIRCLECI_WEBHOOK_SECRET。
限制:无握手、无挑战请求、无来源 IP 白名单;Secret token 在 UI 中可选,未配置时可能收到未签名请求,示例要求 fail closed;无时间戳与重放窗口,happened_at 不是签名输入;ping 事件形态仅社区观察,非官方文档,勿依赖其字段。官方未提供 SDK、具体重试计划等,均已说明。