SVN post-commit 钩子通过 curl 触发 Jenkins 构建,需复制模板、赋权、用绝对路径调用 svnlook/curl,配置 Jenkins 远程触发令牌,并重定向日志;也可用 Webhook 服务解耦增强灵活性与容错性。

使用 SVN 钩子脚本在代码提交后自动触发 CI 构建,核心是利用 post-commit 钩子向 CI 服务器(如 Jenkins、GitLab CI、自建 Webhook 服务等)发起 HTTP 请求。关键在于钩子脚本的可靠性、权限配置和错误处理。
配置 post-commit 钩子脚本
SVN 仓库的 hooks 目录下(通常为 repos/hooks/)存在一个名为 post-commit 的模板文件。需将其复制为可执行脚本并赋予执行权限:
- 复制模板:
cp post-commit.tmpl post-commit - 添加执行权限:
chmod +x post-commit - 脚本接收两个参数:$1 是仓库路径,$2 是新提交的版本号(REV)
脚本中建议用 svnlook 获取提交信息(如修改的路径、作者、日志),便于后续过滤或调试。
触发 Jenkins 构建(推荐方式)
Jenkins 提供了“触发远程构建”功能,需提前开启并设置认证令牌:
- 进入 Jenkins 项目 → “配置” → “构建触发器” → 勾选“触发远程构建”
- 设置“身份验证令牌”,例如
my-token-123 - 在 post-commit 脚本中用 curl 发起请求:
curl -X POST "http://jenkins-url/job/my-project/build?token=my-token-123" - 建议添加超时和静默选项(
--max-time 10 --silent --fail),避免阻塞 SVN 提交
安全与稳定性注意事项
钩子脚本运行在 SVN 服务端,以运行 svnserve 或 Apache 的用户身份执行,权限受限且无交互环境:
- 避免在脚本中调用需要交互或 GUI 的命令(如 git、node 等复杂工具链)
- 所有路径使用绝对路径(如
/usr/bin/curl、/opt/svn/repos) - 将输出重定向到日志文件(如
> /var/log/svn-postcommit.log 2>&1),便于排查失败原因 - 不要依赖环境变量(如 PATH),显式指定二进制路径
替代方案:通过 Webhook 中间服务解耦
若 CI 平台不支持简单 token 触发(或需更灵活控制),可部署轻量 Webhook 接收服务(如 Python Flask 或 Node.js Express):
- 该服务监听 HTTP POST,校验签名后调用 Jenkins API 或执行 shell 构建命令
- post-commit 脚本只需发送结构化 JSON 到该服务地址
- 好处:解耦 SVN 和 CI,支持异步重试、提交过滤(如跳过文档目录)、多目标分发
不复杂但容易忽略细节,重点是让钩子稳定跑起来,再逐步加日志和容错。

















