由于网站的结构是基于lnmp的,所以我们主要的代码都是php代码,之前在大网站的时候,一般会有比较严格的流程和比较严格的打包发布机制,比如Yahoo的 yinst package, 但是对于初创团队来说有些重了,这里我们直接使用svn进行代码的管理和发布。
虽然系统环境不复杂,但是我们还是分为开发环境,测试环境(beta),和生产环境(线上),开发环境我们在自己的机器上搭建,我的是 Ubuntu的系统,everfly是MacOS的系统,测试环境在和svn服务同一台服务器上,我们使用svnseve的post-commit 功能实现了一旦我们提交了代码,服务器会自动将代码部署到beta环境的web服务器上, 在生产环境则是直接使用svn export进行部署,整个流程还是非常简单的。
注意,有的时候我们在生产环境和开发环境的时候需要执行不同的逻辑,比如针对html内部引用的javascript代码,为了节省流量(当然 还有一个原因是代码写的太丑了,不想让大家看到笑话),在生产环境上,我们使用了jsmin进行压缩,但是在本机进行开发的时候,为了调试前端代码方便, 不能对javascript代码进行压缩,所以我们通过设置环境变量,然后在代码中检测环境变量的方式解决了这个问题,由于环境变量是设置在web server或者php-fpm的配置中的,所以线上和开发环境可以保持同一份代码,在代码中判断当前的系统执行不同的逻辑即可。
SVN自动发布系统实现
实现过程,是使用了svn的一个hook的功能,调用了 post-commit 来做一些当提交完成后的操作。
1、在版本库的hooks目录下面,有一些基于事件触发的执行脚本,比如post-commit, 去掉后缀.tmpl
2、编辑svn代码库服务器上文件: svn/test/hooks/post-commit
1
2
3
4
5
6
7
8
9
10
|
#!/bin/sh
REPOS=
"$1"
REV=
"$2"
export
PATH=
"/usr/local/svn/bin:$PATH"
#由于代码是apache的进程用户www运行,所以需要设置环境变量
export
LC_CTYPE=en_US.UTF-8
#防止提交的文件名存在非字母字符。
if
(svnlook log -r $REV
/home/http/repository/svn/test
|
grep
"auto_deploy"
)
#当用户提交时注释中写上"auto_deploy"的时候,就自动部署到apache目录,否则不部署。
then
echo
"`date` 'auto depoly command received"
>>
/tmp/test_svnautocommit
.txt
#这一行仅作调试使用
svn
export
"http://192.168.16.48/repo/svn/test/trunk/test_website"
/home/http/html/test_website
--force
fi
|
3、 在客户端测试,并且要在comment中加入 auto_deploy,否则不会触发自动部署的操作。
参考文章