直接用 post-commit 钩子调用钉钉机器人 Webhook 可实现提交后自动发消息,需三步:1. 在钉钉群配置自定义机器人并获取 Webhook 地址;2. 编写可执行的 post-commit 脚本,提取提交信息并构造 JSON 发送 HTTPS 请求;3. 解决权限、证书校验、内容截断等问题,通过模拟参数和日志调试验证。

直接用 post-commit 钩子调用钉钉机器人 Webhook,就能在每次提交后自动发消息到钉钉群。核心就三步:配好机器人、写好钩子脚本、确保能发 HTTPS 请求。
1. 创建并配置钉钉自定义机器人
进目标钉钉群 → 点右上角「…」→「智能助手」→「添加机器人」→ 选择「自定义机器人」→ 设置安全验证(推荐「自定义关键词」,比如填“SVN”)→ 保存后复制 Webhook 地址。注意地址末尾的 access_token 是唯一凭证,不能泄露,也不能硬编码在公开脚本里。
2. 编写 post-commit 钩子脚本
钩子脚本放在 SVN 仓库的 hooks/post-commit 文件中(Linux 下需可执行权限,Windows 下常用 .bat 或 .cmd)。内容要能获取提交信息,并发起 HTTP POST。
- 提取关键信息:版本号(%2)、作者(svnlook author -r %2 %1)、日志(svnlook log -r %2 %1)、变更路径(svnlook dirs-changed -r %2 %1)
- 构造 JSON 消息体,格式符合钉钉要求(msgtype=text 或 msgtype=markdown),例如:
{"msgtype": "text", "text": {"content": "【SVN 提交】r1234 @张三:修复登录跳转逻辑"}} - 用支持 HTTPS 的工具发请求。Windows 常用 PowerShell 或 Java 封装的 jar;Linux 推荐 curl(需装 openssl 和 ca-certificates)或 Python 脚本
3. 处理常见问题
钩子不触发?先确认脚本有执行权限,且路径正确(VisualSVN 默认在 Repositories/xxx/hooks/ 下);消息发不出?多数是 HTTPS 证书校验失败或 token 错误;内容过长被截断?钉钉 text 类型限制 2000 字,建议对日志和路径做截取或改用 markdown 折叠。
- PowerShell 示例(Windows):用 Invoke-RestMethod 发送,注意设置 -SkipCertificateCheck(测试环境)或导入证书(生产)
- Java 方案:打包一个轻量 jar,接收参数(token、内容),用 HttpURLConnection 发 POST,规避 curl 的 HTTPS 依赖问题
- 避免敏感信息泄露:不在日志里打印密码、token;不把 Webhook 地址写死在脚本里,可用环境变量或配置文件(权限设为 600)
4. 验证与调试技巧
别等真实提交才测试。手动运行钩子脚本,传入模拟参数(如 post-commit D:\svnrepo 1234),配合 Postman 或 curl 测试 Webhook 是否返回 errcode: 0。日志输出很重要,在脚本里加 echo >> /path/to/hook.log 记录每一步,方便定位是 svnlook 取不到数据,还是网络请求失败。


















