Git应用实践
Git是Linus Torvalds同学为linux kernal开发的版本管理系统。九九房使用git进行版本管理,这篇博文不打算介绍git本身,不忽悠大家使用git,仅介绍九九房是如何使用git的,非常欢迎大家讨论和拍砖。关于git本身的内容,请见:http://git-scm.com/
用git管理哪些内容
目前我们用git管理的内容有:
- 源代码
- 二进制程序及其配置文件
- 系统应用程序的配置文件,如nginx, apache, mysql等的配置文件
- 系统配置文件,如hosts文件等
用git管理这些内容的原因有两个:
- 版本管理,可以看到相关修改历史,可以方便回到任意历史状态
- 方便上线到多台机器,使多台机器的配置一致
组织结构和权限管理
虽 然git是分布式的版本管理系统,非常适合linux kernal这类开发者分布广泛,结构松散的工程,对于九九房这样合作紧密的小型团队来说,有一个中心仓储还是要方便很多。我们定义了一个中心仓储,每个 研发人员和中心仓储交互,一般情况下不和其他人员直接交互。我们使用gitosis进行权限管理。
库组织
在库组织时我们考虑以下因素:
- 逻辑组织:逻辑上是否是一个独立的工程,是否需要一个独立的库
- 部署:因为我们实现了一套基于git库的测试、上线流程,如果一个工程需要独立的测试、上线流程,其可以是一个独立的git库
- 权限管理:因为git是个内容管理系统,它将整个库做为一个整体管理,无法仅clone某个子文件夹或对某个子文件夹设立权限,所以有独立权限管理要求的工程应独立为一个库。
标准分支
除 默认的master分支外,我们定义了两个标准的分支:test和online分支,其中test分支是我们测试环境所在的分支,为正在测试的内容,这个 分支的内容来自master分支,如果测试通过,test分支的内容将会进入online分支,online分支是线上机器所在的分支,进入到 online分支就意味着上线了。
使用流程
为了支持基于git库的测试和上线流程,我们开发了以下脚本:
- pushtest:需要将工程的内容放到测试环境运行这个脚本,这个脚本完成如下工作
- 将master分支的内容push到test分支
- tag这一次行为
- 执行该工程进入测试环境后的后续动作,比如编译,重启服务等
- pushonline:上线时使用这个脚本,这个脚本完成如下工作
- 将test分支的内容push到online分支
- tag这一次行为
- 执行该工程进入上线环境后的后续动作
- rollback:上线发现问题后使用这个脚本回退,这个脚本完成如下工作
- 将online分支上的内容回退到上一个线上版本
- tag这一次行为
- 执行该工程进入上线环境后的后续动作
有了以上三个脚本,使用流程就很简单了:
- 本地开发,commit
- 和中心仓储merge
- push到中心仓储
- pushtest进入测试环境
- 测试通过后由上线人员pushonline
开发过程的最佳实践
在本地开发时,我们遵循以下最佳实践
- 分 支原则:以可上线功能为单位在相应分支上开发,如果一项功能可以单独上线,则为其创立一个分支,并在该分支上开发该功能。如果该功能的开发需要多人合作, 或者该功能的开发需要时间超过2天,但应将该分支push到中心仓储。如果一个研发人员同时工作于几项可以单独上线的工作,则应该为这些工作创建各自的分 支。
- commit原则:commit的颗粒度尽量小,以可能被cherry-pick到其他分支为准,如果两项改动可能被两次cherry-pick到其他分支,则应该是两次commit。
- commit review:commit之前先git diff和git status看是否是包含且仅包含这次想commit的内容。
- 合并原则:在master上合并分支
- 分支删除原则:一项改动,在其被合并到master并成功上线后删除。
以上是九九房在工程实践中对git应用的粗略总结,希望能给大家一些参考,欢迎大家和我们做进一步的交流。