Vercel · Deployment Hook · OpenClaw · 远程 Mac · 2026

2026 OpenClaw 前端实战:
远程 Mac 对接 Vercel Deployment Hook——冒烟、安全 Headers 巡检与构建摘要回传

2026.04.17 前端 / 发布自动化 约 9 分钟阅读

适用读者:Vercel 上交付前端、需要在真实公网 URL上做部署后验收(而非仅 CI 绿灯)的团队。本文将 Deployment HookIngress 接到远程 Mac 上由 OpenClaw 编排的 Runner,用同一套入口脚本复现:预热安全 Headers 差分、Playwright 双引擎冒烟,以及结构化 build_summary 回传。固定 slug:2026-openclaw-vercel-deployment-hook-smoke-headers-summary.html。延伸阅读:Netlify Deploy Hook 冒烟Cloudflare Pages Deploy HookCSP 与 nonce 验收

固定 slug:2026-openclaw-vercel-deployment-hook-smoke-headers-summary.html

01 OpenClaw 与 Hook URL

Deployment Hook 只说明 Vercel 完成了一次构建,并不证明 CSPHSTSPermissions-Policy 在用户实际访问的主机名上仍然成立——中间还隔着 vercel.json、Middleware 与边缘路由。常见坑有三类:未做刻意预热时读到 ISR/边缘缓存的「半新」文档壳;仓库里的配置与线上响应头合并结果不一致,必须用线上 curl -sSI 对照检入的期望;Safari 与 Chromium 在存储与第三方上下文上仍有差异,诚实门禁需要远程 Mac 跑 Playwright 的 webkitchromium 项目。

取舍表:临时人工验收 vs Hook + OpenClaw Runner

维度 临时人工 Hook + OpenClaw Runner
触发 依赖同事「想起来」在群里点一下。 每次生产部署走同一脚本路径。
证据 聊天记录里的截图,难对齐版本。 NDJSON 阶段、Headers diff、与 VERCEL_DEPLOYMENT_ID 绑定的 build_summary
密钥 忙乱中容易过度共享。 Ingress 只认一条共享密钥;下游 Token 不挂在 Hook URL 上。

可复现接线步骤(按顺序执行):

  1. 在 Vercel Settings → Git → Deploy Hooks 为 Production 创建 Hook,把 URL 当密码管理,人员变动时轮换。
  2. Hook 只指向你方 Ingress:校验 HMAC 或 Authorization: Bearer1 秒内返回 202 Accepted,入队时生成 OPENCLAW_RUN_ID,将负载中的上下文转发到远程 Mac 上的 ~/runners/vercel-post-deploy.sh(或仓库内统一路径)。
  3. 导出 DEPLOY_URL=https://${VERCEL_URL}(或按环境映射自定义域名),以及 VERCEL_DEPLOYMENT_IDVERCEL_GIT_COMMIT_SHA;在 Runner 启动前用允许列表校验主机名,拒绝陌生域。
  4. 仓库中保留 scripts/vercel/openclaw-post-deploy.sh(或等价 Node 入口),保证本地 dry-runSSH 到远程 Mac 执行的是同一路径。
  5. 在远程主机上对「单次部署」加文件锁或队列,避免 Webhook 重试并发拉起多套 Playwright。

02 冒烟与 Headers 检查脚本接口

把 Runner 拆成三个阶段,每阶段产生稳定产物;每阶段向 .openclaw/reports/deploy_hook.ndjson 追加一行 NDJSON,字段包含 phasehttp_status(如适用)、duration_msopenclaw_run_id

(A)预热。$DEPLOY_URL 的健康路径循环执行 curl -fsS,直到 HTTP 200 且响应体含约定的 HTML 标记;对 429502503 与连接重置使用指数退避 + 抖动,上限与团队 SLO 对齐。

(B)Headers 巡检。 在仓库维护 config/headers_expect.json,列出对 strict-transport-securitycontent-security-policy(或 content-security-policy-report-only)、x-frame-optionspermissions-policy 等指令的最低要求。用 curl -sSI 抓取线上响应头,统一大小写与空白后,将差异写入 .openclaw/reports/headers_diff.txt;任一必需指令缺失则该阶段判失败。

(C)冒烟测试。 执行 npx playwright test tests/smoke --project=webkit --project=chromium,并设置 BASE_URL=$DEPLOY_URL。在 Apple 硅片上建议先跑 WebKit,便于暴露 ITP 相关回归。失败时在 .openclaw/traces/ 保留 trace,文件名含 openclaw_run_id

03 失败摘要回传模式

成功时写入 .openclaw/reports/build_summary.json,使用 schema: "build_summary/v1",包含 git_shadeploy_id(即 Vercel 部署 id)、各阶段 duration_msheaders_diff_bytes。失败时在同一文件形状内填写 failed_phase、stderr 摘要片段与非零 exit_code,便于机器人和 PR 评论侧只解析一种 JSON。

向团队 Webhook 或 PR 评论接口 POST 时携带 Idempotency-Key: ${VERCEL_GIT_COMMIT_SHA}:${VERCEL_DEPLOYMENT_ID}:summary,避免 Vercel 重试导致重复刷屏。日志中禁止打印 Bearer;归档 NDJSON 时对主机名与查询串脱敏。若需与构建体积看板对齐,字段命名可与 构建指标 PR 摘要 共用约定。

预热与轮询预算

为预热设置墙上时钟上限(例如 5 分钟),并在日志中记录 x-vercel-idcf-ray(若存在),便于运维判断命中哪一弹。

Headers 差分留存

headers_diff.txt 纳入部署产物目录,安全评审可直接对照「仓库意图」与「线上捕获」。

网关 Token 范围

OPENCLAW_GATEWAY_TOKEN 仅用于入队与摘要 API;勿把 Vercel 或 GitHub Token 写进前端包体或公开构建日志。

04 FAQ

现象 可能原因 建议核对
Hook 侧 401 Ingress 密钥轮换或 Authorization 方案不一致。 更新 Vault 中密钥;全文搜索文档里的旧端点。
Headers 突然不一致 Middleware 变更、vercel.json 新段、或 ISR 首包。 VERCEL_DEPLOYMENT_ID 留存 curl,再缩小 diff 范围。
WebKit 失败、Chromium 通过 ITP、分区存储或第三方 Cookie 默认策略。 Playwright trace 附带部署元数据;必要时收紧 Cookie jar 重试。
摘要 POST 返回 429 GitHub 等对评论 API 的次级限流。 退避;尽量复用同一条 issue 评论;拉宽 webhook 重试间隔。

能否用 curl 批跑替代 Playwright?不能替代。curl 证明传输层头与重定向;浏览器对 CSP、混合内容仍各自执行。推荐 curl 作快速门禁,再用 Playwright 覆盖 DOM 与存储行为。

远程 Mac · Vercel · 7×24 Hook Runner · 免登录了解

在真实 Apple 硬件上跑通 Deployment Hook 验收链

将 Hook 接到长期在线的远程 Mac,可避免「笔记本合盖即断」的本地环境,把 Safari/WebKit 与 Chromium 冒烟做成发布默认项,并把结构化摘要推回 PR 或协作频道。无需登录即可打开 帮助中心 查看接入说明,在 算力资费 页选型后,通过 购买页 租用或扩容远程 Mac;更多文章见 博客列表官网首页

远程 Mac 跑 Vercel Hook 验收