SVN自动更新 Linux

概述

环境:Linux
SVN版本库协作开发,每次本地开发之后,如果不想手动在服务器执行更新命令的话,可以设置服务器的自动更新。
自动更新的话,个人理解为分服务器主动更新(svn up),和服务器被动更新。

分析

  • 主动更新
    这种方式,服务器,自主执行svn update操作更新。
    手动执行该操作,或者通过定时任务crontab定时执行svn up
  • 被动更新
    这种方式,是通过SVN版本库所在的服务器,通过钩子(hooks),在版本库触发某个事件的时候,自动更新的WEB服务器。不需要执行定时任务触发。

实现

钩子自动更新

首先声明,该种方式,我没有手动执行实现过,只是知道大致的实现原理。

SVN的版本库里面,有个hooks,在里面,有好几个*.tmpl文件,找到其中post-commit.tmpl这个文件,这个钩子。大概的意思是在svn提交的时候,会触发该脚本。

在触发改脚本的时候,我们就可以在其中处理一下我们需要的时间,比如:将代码推送发布到WEB服务器等。

当时配置过windows上面的钩子,同步的WEB服务器,在linux上,由于各种账号权限的问题,配置起来非常麻烦,因此没有成功。

主动更新

主动更新的原理,就是执行svn up,目的是要实现自动更新。

  • crontab 定时任务
    这种新式比较简单,只需要在crontab中,配置定时执行svn update命令即可:
    */5 * * * * svn up /project/path
    就是每5分钟,执行指定目录更新一次。

  • web页面,手动执行更新
    通过crontab自动更新,总会有延迟的存在,如果想在svn提交之后,就能立即看到效果,而又没有通过钩子配置自动更新,而且也不能开放服务器的登录权限的话,只能通过web编写页面操作svn up,通过PHP执行Linux命令,主要的函数:shell_exec()。可以写个WEB应用,通过PHP执行shell_exec(),来执行SVN的更新,并可以将结果动态的展示给用户。该形式在我的git项目里,有个表哥(BigPao)提供的应用。

遇到问题

  • 在通过shell_exec()执行更新的时候,总是不成功,返回结果:
    Updating '/project/paty':,但是实际并没有执行成功,查看错误日志,
    提示:/root/.subversion没有权限
    该问题的原因是因为一般的WEB应用,都是通过www用户组运行的,该用户,是没有权限操作/root/用户的文件的,因此在执行svn up等操作的时候,需要制定config-dir参数:
    svn update --config-dir /project3/.subversion /project3/

  • shell_exec()执行更新,报错:svn: E155037: 以前的操作没有完成;如果它被中断,请执行“svn cleanup”
    该问题,是由于svn本地库遇到了一点问题,需要手动执行svn cleanup,但是如果通过在服务器执行svn cleanup的话,会将项目目录下的:/project/.svn/tmp文件的用户组改为:root。这样,在通过shell_exec()执行更新的时候,就会提醒:
    svn: E000013: 无法从模版“/project/.svn/tmp/svn-XXXXXX”创建临时文件: 权限不够
    因此需要通过PHP来执行svn cleanup

svn cleanup --config-dir /project3/.subversion /project3/;
svn update --config-dir /project3/.subversion /project3/;
sleep 1;
  • 在实际的项目开发过程中,有可能会用FTP上传了某个文件,如果该文件,不是www用户组的文件的话,再shell_exec()执行更新的时候,也会同样报无权限的错误,因此需要将上面的语句,再次优化:
chown -hR www:www /project3/;
svn cleanup --config-dir /project3/.subversion /project3/;
svn update --config-dir /project3/.subversion /project3/;
sleep 1;