Posts Tagged ‘Hooks’

让虚拟主机也用上SVN:适用于个人的开发部署方式

注:本文仅针对没有条件在主机上安装SVN服务器的情况,例如使用虚拟主机的开发人员。如果满足以下几个情况,本文可能非常适合你:

  • 开发人员只有一个人
  • 服务器是虚拟主机只有ftp没有svn,并且也无法自己安装程序
  • 厌烦了每次部署修改都要整理更新文件列表并逐个提交

前言:我为什么要做这样的一个东西?近一个月来,在Raychou.com上花了不少时间,新开了实验室小技巧两个栏目,尤其是实验室,以后可能会经常要更新代码,而以往每次更新代码都是先在Eclipse里写好,然后打开FtpRush,切换到要更新的文件夹,将整个目录提交到服务器,繁琐又费时。更是因为这个原因,weather也有段时间没有更新了,我是懒人,但仅仅是懒于做繁琐而机械的工作,我需要改变这个现状,于是有了下面的内容。

相信很多开发人员和我一样,在工作之余还会管理个人网站,和网友们分享自己的经验和代码。应该大部分人都是租用的虚拟主机,这样平时在公司那一套使用SVN提交代码的方式就不管用了,每次更新程序,都要先整理一份修改记录,然后依次用FTP上传,麻烦耗时不说,还会经常遗漏文件,造成不必要的麻烦。

想要让线上代码和本地开发环境保持同步,方法也很多,最简单的可以利用CuteFtp,WinScp的文件夹监视功能,当被监视的文件夹内有修改动作,就会自动触发程序提交代码到服务器。但这样也有个弊端,在本地调试的修改也会带上线,虽然是方便了,但可能造成更大的问题。

之前我写过《利用SVN Hooks实现快速方便的代码管理/发布方式》一文,是利用SVN Hooks实现在提交代码到SVN时,自动部署更新的文件到测试服务器。同样的,利用Hooks,我们也可以把代码同步到FTP服务器,不同的是,这次的SVN服务器是架设在开发环境中,也就是说,不需要额外的服务器,任何人都可以通过SVN实现开发环境与线上的代码同步。

php-svn-hooks.gif

如图所示,当开发人员在本地开发并调试后,提交代码到本机SVN服务器,触发post-commit钩子,调用post-commit.bat,(由于对bat的语法不熟悉,在这个架构中,我用php代替bat,post-commit.bat仅做了在命令行下调用post-commit.php并传参),然后然后进行文件的同步处理。

大致流程如下:

  1. 开发人员提交代码到SVN服务器
  2. 提交完成后,自动调用post-commit钩子
  3. 钩子调用php脚本并传递三个参数:代码仓库路径,当前版本号,配置文件名
  4. php脚本通过传递过来的参数取得并分析当前版本的更新日志
  5. 根据不同的情况(新增、修改、删除、重名民)来同步文件

post-commit.bat代码如下:

set PATH=D:Program FilesWebServerPHP5.2.6;%PATH%
php "F:wwwrootsiteraychoulabsphp-svn-hookspost-commit.php" "%1" %2 "config/raychou.php" 1>&2

除post-commit默认的%1和%2两个参数外,这里我还传了第三个参数”config/raychou.php”,这个参数是传递给PHP脚本,让其去读取指定的配置文件,这个配置文件是在同步过程中需要用到的一些设置,例如SVN工作目录,FTP帐号等设置。

php在接收到hooks传递过来的参数后,读取配置文件,连接本地SVN版本库,取得并分析本地更新日志,连接FTP服务器,开始同步文件。

关于SVN Hooks以及post-commit的参数传递,请参考这里http://www.subversion.org.cn/svnbook/1.4/svnbook.html#svn.ref.reposhooks

代码下载,代码部署结构请参考http://www.raychou.com/labs/

php-svn-hooks php-ftp-client php-svn-client

利用SVN Hooks实现快速方便的代码管理/发布方式

三宝殿项目的开发中,一直使用SVN进行版本控制,但线上代码的更新方式,仍一直使用传统的FTP更新方式,由于经常更改了大量散布的代码,发布更新时却又不能很好的一一上传,因此一般在发布更新时,都是将整个项目代码全部提交,费时费力。而且由于发布更新的繁琐,很早就搭建的测试环境一直没有利用。

最近把服务器的目录结构做了一下整理,也萌发了将测试环境重新利用上的想法,但传统的FTP更新方式势必要淘汰。在和蓝色的讨论中了解了SVN的Hooks,简单说Hooks就是在进行SVN相关操作时,可以自定义一些前置或后置操作,可以实现代码提交时发送邮件,自定义目录权限验证等等。

经过两天的部署,最终实现方案如下:

SVNs.jpg

当开发人员提交代码到SVN,利用SVN的hooks,自动将代码更新到测试环境,这样可以实现测试环境永远是最近的代码版本,便于及时发现问题。

生产环境不使用hooks更新,因为提交到SVN的代码仍然存在大量Bug,目前采用的方式是通过登陆SSH手工update。计划今后通过PHP脚本diff代码仓库和工作副本的区别,通过Web页面进行选择性更新。

通过这种方式,完全抛弃了原来FTP的更新方式,不但节省了发布更新的时间,也最大限度的保证了代码的完整性。