利用svn的钩子脚本自动部署代码

假如我们在服务器上部署了svn服务,放在 /var/svn/ 文件夹下面,服务器ip假设为 192.168.0.101。
并假如网站与svn仓库都在同一服务器上。

创建一个名为 project1 的项目:

cd /var/svn/
#创建svn仓库
svnadmin create /var/svn/project1
#启动svn仓库命令
svnserve -d -r /var/svn/

从svn中签出项目:

svn co svn://192.168.0.101/project1 /var/www/project1/

post-commit脚本内容,/var/svn/project1/hooks/post-commit:

REPOS="$1"
REV="$2"
svn update /var/www/project1/ --username [name] --password [pass]

当有开发者向svn服务器提交代码时,就会触发执行 post-commit 钩子脚本,从而执行更新网站目录的命令。

如果我们网站在另一台服务器上,IP为192.168.0.102,那么钩子脚本里面这么写就好:

sshpass -p [password] ssh root@192.168.0.102 "cd /var/www/project1/ && svn update"

sshpass命令可以需要从网站下载后编译安装,用于自动将密码传送给ssh命令。

如果网站目录过大,或一个svn库里面有一大堆项目,那么提交一次的时候,对所有项目都进行svn up操作,显然非常费时。
这时候,就想只对那么有版本变化的文件进行 svn up。

cd /var/www/project1/
svnlook dirs-changed /var/svn/project1 | xargs /usr/bin/svn up -N

上面命令会列出有更新的目录,再更新这些目录。当然这个命令也只适合当网站目录 /var/www/project1/ 和 svn仓库目录 /var/svn/project1 在同一机器上时,如果不在同一机器上,通过svnlook dirs-changed检查哪些目录变化了,再用sshpass 登陆远程主机,只更新这些目录即可。

svnlook help dirs-changed 命令可以查看用法。