让服务器自动从Hg版本库中下载代码

每次写完代码,提交到版本库,测试可以执行不会冲突,推到远端代码仓库。之后要发布的话,还要通过FTP上传到服务器上,FTP速度又不很理想,严重影响工作效率。

有没有解决之道?有!

直接让服务器从代码仓库中下载代码不就行了么?代码仓库中已经包含最新代码了,让服务器从代码仓库的服务器远程下载代码,方便快捷全自动!

而且,现在用的是hg,而不是svn。svn有个问题,提交的代码可能是未完成的半成品导致程序无法执行。而hg的好处是半成品可以提交在本地,阶段性成果完成后再往远端代码仓库中提交。

下面就以使用BitBucket为例,其他服务大同小异。

编译 hg

首先需要在服务器端编译一份 hg ,编译起来还是很方便的,直接从官网下载一份源码,解压缩后make && make install 一下就行了。他源码包里的README里就这么写的。

Mercurial/Hg 下载地址

第一次clone

第一次使用需要先clone一份代码仓库到本地,以后就可以简单的使用pull命令获取更新了。
所以第一次使用需要 hg clone <你的仓库地址>
仓库地址可以在 BitBucket里的项目里找到。

编写 PHP

然后在服务器端写一个文件up.php,放在需要更新的目录下面, 如下代码:

passthru(“/< hg命令行工具的绝对地址>/hg pull -u https://<你的用户名>:<你的密码>@<你的代码仓库地址>“);

以我的空间为例,就是:

passthru(“/home/shawphy/bin/hg pull -u https://shawphy:******@bitbucket.org/shawphy/test/”);

其中最关键的一步是要把密码也写在URL里,否则的话就得用popen()函数来处理密码交互了,比较麻烦。

这样,只要访问这个php文件,就能更新这个网站了。

配置Hook

然后,只需要在 BitBucket 项目管理中,Admin标签里,右边Additional options/settings面板下找到Services,点进去。然后添加一个POST服务,URL地址就填写你那个PHP文件的地址就可以了。

这样就能实现往代码仓库中提交代码后,网站服务器自动下载并更新代码了。

其他

如果要自己搭建的服务器上配置的话,参考 Hg 官方Wiki