Git是个好东西自不用说,对比SVN来,它有以下好处:
- 分支操作速度快,便于制定开发流程
- 每个节点都是完整的代码库,可以不受中心版本库的制约
- 使用开源类库框架一样可以随心所欲修改并且进行版本管理
做Web开发的时候,我一直想用Git进行部署。因为之前要么FTP,要么直接在服务器上修改,都会产生各种问题。最近尝试了下,发现还挺简单,记录下来。
明确几个概念
对于分支管理,我青睐“主干+开发”的策略,即一个master分支,保留可稳定运行的代码;开发和debug的时候,建立features和bugs分支,开发完测试完就合并到master。用户可以即时看到产品的演进,就不需要为大版本发布留分支了。从硬件架构来说,有如下几大块
- 开发机,我的电脑,mac/pc/笔记本,都配好环境,基本和生产机保持一致
- 测试机,用于测试各种功能、除错的服务器,配置也要和生产机保持一致
- 生产机,真正用来跑产品的服务器
- 代码库,用来存放所有产品代码的Git库
其中,开发机、测试机都有完整的分支,因为我们要开发产品,必然涉及分支管理;测试机更是需要能够在几个不同的分支之间切换,甚至能够支持标签化访问分支。而生产机则只保留master分支,也就是最稳定的分支,我们只需要操作它pull新的代码,或者做回滚动作即可。
大体步骤
- 接到需求,在开发机上建立分支“fea+问题号”或者“bug+问题号”
- 在专有分支进行开发、测试
- 每天推送新代码到统一的版本库
- 测试机将分支拉过来,进行测试(亦可在代码库添加hook,自动推送)
- 测试通过,合并分支到master
- 由统一的负责人确定上线时间,登录生产机pull master,完成代码部署
- 如果有问题,可以回滚到任何一个版本号
优点和适用范围
这样做,有不少优点:
- 保证代码的一致性
- 出了问题可以快速回滚
- 差异化部署,降低不必要的消耗
- 测试的时候,可以快速在不同分支间切换
- 所有代码都经过版本管理
- 可以通过先fetch再merge的方式,完成版本的快速切换
不过相应的,这种策略只适用于PHP这种部署在服务器端,且不需要编译的语言。另外,图片等二进制素材,也不合适用Git来管理;数据库设置与表结构,也会成为回滚的一个障碍。
不过,毕竟是第一次尝试这样的部署策略,以后再试着总结一些进阶的经验吧,比如:
- crontab等计划任务
- 二进制素材管理
- 数据库表结构管理
- 直接访问某个分支
欢迎吐槽,共同进步