注意:此文章写于2012-10-30,内容可能已过时,而且可能包含错误。
目前使用svn,尚未详细学习git的分支与主干,只会git基本语法是无法实现脚本上线的,待学习。
svn目录结构demo:
tags/
movie_0.0.1
movie_0.0.2
www_0.0.1
www_0.0.2
pt_0.0.1
trunk/
movie/
src/
model/
test/
model/
www/
src/
test/
pt/
src/
test/
branches/
movie_0.0.2.1
www_0.0.1.1
读写限制:tags是只读的,trunk和branches是读写的。
一个web项目会如果规模大,会分成多个模块开发,所以trunk下有多个模块目录,比如movie、www、pt。
如果人少,在trunk上开发简单方便。如果人多,则在branches上分多个版本开发。
如果多版本并行,则只能在branches上开发,比如chrome有stable、beta、dev并行开发和发布。
服务器环境划分——简单版:
example.com、movie.example.com、www.example.com 为internet外网线上生产环境,面向用户。
本地和线上使用相同软件环境,比如都安装到/usr/local/nginx/ 端口80,nginx.conf里写上include sites-enabled/*.conf
nginx/conf/sites-enabled/movie.example.com.conf放在svn里,如下:
server { listen 80; server_name movie.example.com; root html/movie.example.com/enabled/src/webroot/; location = /robots.txt { } location = /favicon.ico { } location / { rewrite .* /index.php last; } location ~ \.php$ { fastcgi_pass unix:/usr/local/php/var/run/php-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
本地开发时,配hosts:
127.0.0.1 movie.example.com
127.0.0.1 account.example.com
内部测试时,配hosts,比如:
192.168.1.3 movie.example.com
192.168.1.3 account.example.com
线上预览时,配hosts,比如:
74.125.31.161 movie.example.com 74.125.31.161 account.example.com
优点:简单
缺点:
1、如图所示
2、movie.example.com如何内网调用 0-0-2.account.example.com的API呢?
因为没有0-0-2.account.example.com的外网域名,所以无法调用。
如果添加0-0-2.account.example.com这个外网域名,会导致用户也可以访问,造成误解和搜索引擎收录。
如果配hosts或限制IP,会导致一旦更换IP,就需要重新审核录入(产品多了,更改IP的事情常有发生)。
服务器环境划分——完善版:
example.com、movie.example.com、www.example.com 为internet外网线上生产环境,面向用户。
*.intra.example.com 为intranet内部网(intranet不一定是lan局域网,可能也有外网ip,比如远程办公使用或者ipv6全是外网ip没有lan了),面向内部员工。
*.user.intra.example.com 个人开发调试环境,比如*.jim.user.intra.example.com解析到工程师jim的机器,开发movie项目时,域名是movie.jim.user.intra.example.com。注意:域名最大长度是253字节。
*.dev.intra.example.com 内部开发调试环境,比如trunk.movie.dev.intra.exmple.com或者0-0-3.movie.dev.intra.exmple.com。
*.prod.intra.example.com 内部线上生产环境,比如SOA业务之间api调用。比如0-0-3.movie.prod.intra.exmple.com需要调用0-0-2.account.prod.intra.exmple.com。预览时使用0-0-3.movie.prod.intra.exmple.com,测试完成,切换生效,对外是movie.example.com。
因为安全和集中管理,云主机或者自购服务器托管 和办公网不在同一个内网,所以需要VPN。参考:http://ariejan.net/2010/10/11/setup-a-ubuntu-vpn-server
每个人都设置VPN pptp比较麻烦,如果路由器支持Site to Site VPN会更方便,企业级路由器大都支持(比如TP-LINK TL-WVR300 ¥299)。参考:http://zhengweiit.blog.51cto.com/1109863/519821
家用级路由器如果支持DD-WRT开源系统,就能支持Site to Site VPN。参考http://www.dd-wrt.com/wiki/index.php/OpenVPN_-_Site-to-Site_routed_VPN_between_two_routers
如果购买了开源路由器可以配置dnsmasq,很方便,待验证企业级路由器是否支持。参考:http://www.cnblogs.com/sink_cup/archive/2012/08/17/router_dnsmasq_android_hosts.html
如果没有买开源路由器,则需要在内网自行搭建DNS,稍微麻烦点,但性能强。dnspod免费账户不支持子域名泛解析,比如用外网DNS解析*.jim.user.intra.example.com。
这里以trunk开发movie项目为例:
几个开发工程师从trunk上checkout,然后本地开发调试(movie.jim.user.intra.example.com、movie.tom.user.intra.example.com),自测完毕提交svn。
然后部署trunk到内部网的开发环境trunk.movie.dev.intra.example.com,进行开发工程师自测,如果是web,则界面测试;如果是api,则用代码测试。
开发工程师自测通过,打tag:
svn copy trunk/movie tags/movie_0.0.2
部署tag到线上内部环境0-0-2.movie.prod.intra.example.com,进行预览。
预览通过,把预览代码切换到线上movie.example.com。
然后大家继续在trunk上开发,线上的movie_0.0.2如果有bug,需要紧急修复,不能等到trunk下一版本再修复了,
那就建立branch:
svn copy tags/movie_0.0.2 branches/movie_0.0.2.1,
在branches上开发提交,然后打tag:
svn copy branches/movie_0.0.2.1 tags/movie_0.0.3
因为0.0.3作为一个紧急版本发布了,下一个trunk版本就会打0.0.4的tag然后发布。
版本号用几位?
常用的是3位发布(tags),4位开发(branches)。
也有4位发布的,比如chrome 22.0.1229.79。
使用自增还是日期?
采用自增比较多,采用日期的少,比如:
MIUI,每周五发布,比如2.10.12版就表示 2012年10月12日。
Ubuntu,每半年发布,比如12.04版表示2012年4月,12.10版表示2012年10月,但12.04.1版是8月发布的,表示基于12.04的第1个升级版。
每位的范围是多少?
自行参考现有的app store、google play。
如果使用3位自增 [0-99].[0-9].[0-9],第1版是0.0.1。
web每天或两天发布一次,1年以后版本号会增长到1.8.0,5年以后会增长到9.0.0……这时候创业也该成功或失败了吧……
小米手机的MIUI是每周发布一次,盛大bambook手机rom是每月发布一次……所以盛大不要搞了,歇着吧,项目管理能力和效率不行。
部署脚本:
主要功能:svn up、svn export、根据环境选择配置文件、打包上传、解包、重启web server、线上生效某一版本(生效旧版本即是回滚)
多种解决方案:make、shell、phing(ant)。
make和shell都不用安装额外的软件,linux已经支持了,所以很方便。
phing(ant)缺点是要安装软件,好处是以后可以用持续集成……(算了吧,国内公司很少达到这种境界的,有点繁琐)
这里介绍make,简单方便。按照完善版的环境划分进行部署。
todo
参考资料:
http://zh.wikipedia.org/wiki/Google_Chrome
广告:
创业需要PHP技术的,联系我:http://www.cnblogs.com/sink_cup/archive/2012/10/25/chuangye.html#me