配置了台svn服务器,用来保存公司项目的代码,同时svn服务器也是一台web服务器。因此希望当我本地代码commit到svn服务器时,能够触发svn服务器的钩子hooks/post-commit将新版本的代码自动update到站点目录上去。
其实这样做,感觉有点傻。还不如直接把svn版本库指定到web服务器的站点目录下。而且这样,svn库一改,站点目录也马上就更改了。
svn 目录:/home/svn/dl_test/
站点目录:/home/www/data/dl_test/
实现:
1.找到svn项目的hooks目录,这里是/home/svn/dl_test/hooks。目录中默认会几个对应操作的钩子模板,我们需要创建一个post-commit的文件。
2.新建post-commit,内容如下
#!/bin/bash REPOS="$1" REV="$2" export LANG=zh_CN.UTF-8 echo "Code Deployed at `date "+%Y-%m-%d %H:%M"`" >> /home/svn/dl_test/hooks/deploy_log /usr/local/subversion/bin/svn update --username ****** --password ****** /home/www/data/dl_test
3.修改post-commit权限
# chmod +x post-commit
4.Checkout一份代码到web服务器上
# cd /home/www/data # /usr/local/subversion/bin/svn checkout svn://127.0.0.1/dl_test
5.测试
测试的话,我这里是在本地修改版本库,点commit,然后再看web(nginx)服务器上的数据是否更新来测试。
附录:
1.Warning: post-commit hook failed (exit code 255) with no output.
赋予post-commit文件可执行权限,文件第一行有没有#!/bin/sh,在Post-commit第一行不是#!/bin/sh开头也是出现255的
2.这样做,还有点问题。因为是在web服务器上checkout产生的版本库。会发现/home/www/data/dl_test里有.svn。听说这会有安全问题。考虑nginx配置下。
3.大数据量同步时,速度会变慢。
4.留一下别人说的,还没看。
代码CO出来之后,可以进行post-commit脚本的测试了。因为svn的hooks执行的时候不带有任何的环境变量,所以我们不能通过简单的 ./post-commit 进行代码的测试。必须要使用sudo su等命令切换到svn或者apache服务器运行用户下,用下面的方法进行测试 sudo ./post-commit
这样,执行svn update 命令的用户就是svn或者apache服务器的运行用户,因此,我们需要保证代码的存放目录必须有对应用户的权限,否则,这个脚本是不能执行的。我就是因为这个权限的问题,耽误了很多时间。