1 Git Flow
一般而言,软件开发模型有常见的瀑布模型、迭代开发模型、以及最近出现的敏捷开发模型等不同的模型。每种模型有各自应用场景,Git Flow是构建在Git之上的一个组织软件开发活动的模型,Git Flow重点解决的是由于源代码在开发过程中的各种冲突导致开发活动混乱的问题。在此介绍Git Flow是由于walle依赖它的思想进行持续部署。
开发过程中可能出现的git flow
1.1 Git Flow中的分支
Git Flow模型中定义了主分支和辅助分支两类分支。其中主分支用于组织与软件开发、部署相关的活动;辅助分支组织为了解决特定的问题而进行的各种开发活动。分支的名字是一种共识,更重要的是它承担的责任。
1.2 主分支
主分支是所有开发活动的核心分支。所有的开发活动产生的输出物最终都会反映到主分支的代码中。主分支分为master分支和development分支。
1.2.1 master分支
master分支上存放的应该是随时可供在生产环境中部署的代码,它承担的责任就是:仅在发布新的可供部署的代码时才更新到master分支上的代码。当开发活动告一段落,产生了一份新的可供部署的代码时,master分支上的代码会被更新。同时,每一次更新,最好添加对应的版本号标签(TAG)。
1.2.2 develop分支
develop分支是保存当前最新开发成果的分支,它承担的责任就是功能开发完毕等待最后QA的验收,通常这个分支上的代码也是可进行每日夜间发布的代码。当代码已经足够稳定时,就可以将所有的开发成果合并回master分支了。
1.3辅助分支
辅助分支是用于组织解决特定问题的各种软件开发活动的分支,它的生存周期伴随着它的功能完成而消失。辅助分支包括:
用于并行开发新功能时所使用的feature分支;
用于辅助版本发布的release分支;
用于修正生产代码中的缺陷的hotfix分支。
当这些分支完成它的使命之后在merge到主分支之后,也将被删除。
Git Flow开发模型从源代码管理角度对通常意义上的软件开发活动进行了约束,让小组各个成员之间的开发相互隔离,能够有效避免处于开发状态中的代码相互影响而导致的效率低下和混乱,各自开发团队根据自己的特点和节奏自行剪裁或扩展。
2 Walle介绍
2.1是什么?
Walle 一个web部署系统工具,可能也是个持续发布工具,配置简单、功能完善、界面流畅、开箱即用!支持git、svn版本管理,支持各种web代码发布,静态的HTML、动态PHP、需要编译的JAVA等,用户权限管理,各种自定义高级任务。一键上线、回滚。
项目地址:walle-瓦力,上线开源两个月,目前已支持超过十家企业线上部署使用,每周更新一个版本,持续带来新特性。
2.2 walle的组件关系、原理
walle部署在一台宿主机提供一个web UI,方便用户自主更新代码部署到目标机群。Walle是一个跑在LNMP(LAMP)上的PHP服务,宿主机与目标机群建立信任,通过操作bash命令来实现代码同步、自定义高级任务。
宿主机、目标机群、操作用户关系
2.3配置
用户的项目可自定义git/svn代码托管地址、宿主机、目标机群、高级任务等。配置完成后可快速复制当前配置、检测配置是否正常、以及该项目的审核管理员和成员。
3 walle与Git的配合
walle的持续部署与Git Flow思想一致,在不同的环境部署不同的分支。划分三个环境:测试环境、预发布环境、生产环境。测试环境和预发布环境推荐分支部署,生产环境推荐tag部署。当然,这更适合milestone开发方式,如果是每天快速迭代多个版本,打tag成本就有点高了。
3.1 部署环境
3.1.1 测试环境
开发者的feature分支开发、自测验收通过后,merge到测试环境的develop分支,(QA)部署到测试环境,等待QA验收。
QA提bug issue,开发者从develop切分支修正再次合并、部署、验收。
3.1.2 预发布环境
测试环境验收通过之后,合并到预发布环境的master,部署预发布环境
QA全面回归,发现问题提bug issue,开发者从master切分支修正再次合并、部署、验收。
回归完毕打tag,准备上线
3.1.3 生产环境
上线验收通过的tag
回归测试,发现问题开发者从master切分支hotfix修正。
3.2 环境上线流程
开发者选择要上线的项目,选择要上线的分支和版本提交上线单,项目管理员审核通过后,开发者发起上线。
4 Walle的部署流程
部署是在一台宿主机拉取代码,做编译、配置后,向目标机群分发,执行相关目标机群任务。部署流程拆分为以下6个环节,其中1-5为在宿主机进行,6在目标机群执行。
权限、目录检查,开辟一个上线的独立空间以并行发布,防止同时部署出现代码污染
pre-deploy任务,代码检出前的一些操作任务,如环境检查
代码从git/svn版本库中检出
post-deploy任务,代码检出之后操作任务,如java的mvn编译,php的composer插件安装
保留在独立空间的代码均会被同步至目标机群的一个版本库中
全量更新:当所有机器都分发完毕,开始做pre-release任务(java暂停服务)、切换版本软链、post-release任务( java启动服务)
为保证服务的完整性,先同步代码,后切换服务。部署发布每次都会有版本记录保留,版本上线事故一旦发生,回滚可瞬间完成。可配置线上版本最大保留数,过期的版本被会删除,同时也就不能回滚被删除的版本。对于需要编译、自定义多任务辅助,可配置前置、后置操作自定义任务;同时提供一些预置变量({WORKSPACE}宿主机的当前独立空间、目标机webroot,{VERSION}版本库目录)方便用户操作自定义任务。
上线过程直到目标机群全部完成之前,如有任一环节失败将会回滚,需要重新上线,同时会把错误信息提示用户。
5 Todo list
支持Docker
开放接口
支持第三方hook