可通过svn的post-commit钩子实现提交后自动部署:需将可执行脚本置于仓库hooks目录,配置svn路径、web目录及免密ssh更新命令,并确保权限、环境变量与用户上下文一致,同时规避本地修改冲突和编码问题。

可以通过 SVN 的 post-commit 钩子脚本,在每次代码提交成功后,自动拉取最新代码并部署到测试服务器。关键在于钩子脚本的权限、路径配置、SSH 认证和部署逻辑的健壮性。
确认 SVN 仓库钩子目录与执行权限
SVN 钩子脚本需放在仓库的 hooks/ 目录下(如 /path/to/repo/hooks/post-commit),文件名必须为 post-commit,且无扩展名。该脚本需具备可执行权限(chmod +x post-commit)。注意:SVN 进程通常以特定用户(如 svn 或 www-data)运行,脚本中所有路径和命令都应适配该用户环境。
编写轻量可靠的 post-commit 脚本
脚本接收两个参数:仓库路径和提交版本号。核心逻辑是切换到测试服务器的 Web 目录,执行 svn update 或通过 SSH 拉取更新。推荐使用免密 SSH 方式同步,避免密码交互:
《SVN视频教程》,SVN:全称Subversion,是代码版本管理软件,管理着随时间改变的数据。这些数据放置在一个中央资料档案库 (repository) 中。这个档案库很像一个普通的文件服务器,不过它会记住每一次文件的变动。这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。许多人会把版本控制系統想像成某种“时光机器”。
- 在 SVN 服务端生成部署专用密钥:
ssh-keygen -t rsa -f /home/svn/.ssh/deploy_id_rsa -N "" - 将公钥追加到测试服务器部署用户的
~/.ssh/authorized_keys中,并限制命令(如只允许svn update) - 脚本中用
ssh -o StrictHostKeyChecking=no -i /home/svn/.ssh/deploy_id_rsa user@192.168.1.100 "cd /var/www/test && svn update --non-interactive" - 建议添加简单日志记录,例如
echo "$(date): r$2 deployed" >> /var/log/svn-deploy.log
规避常见失败点
很多自动同步失败源于环境差异或权限问题:
- SVN 客户端在测试服务器上必须已安装,且版本与服务端兼容(尤其注意 SVN 1.8+ 的工作副本格式)
- 测试服务器上的 Web 目录需对部署用户可写,且
svn update执行时不能存在未提交的本地修改(可提前svn revert -R .或改用export+ 解压方式) - 避免在钩子中直接执行耗时操作(如构建),若需编译,建议触发 Jenkins 或独立部署服务,而非阻塞 SVN 提交响应
- Windows 测试服务器可用
plink替代ssh,但需确保 PATH 可访问,且私钥格式为 PuTTY 格式(.ppk)
验证与调试建议
调试钩子脚本时不要依赖 SVN 客户端触发——先手动模拟调用:./post-commit "/path/to/repo" "1234",观察输出和日志。可在脚本开头加入 set -x 查看每条命令执行过程。同时检查 SVN 服务日志(如 /var/log/apache2/error.log 若用 Apache 托管)是否报权限或超时错误。确认测试服务器防火墙放行 SSH 端口,且 SELinux/AppArmor 未拦截执行。










