初创公司应该如何做好持续集成和部署?

阅读:429 2019-03-19 14:42:25 来源:新网

持续集成和部署是每一个互联网开发团队都必须要面对的问题,特别是在初创公司,由于业务和技术团队快速增长,技术积累较弱的,所以一个高效的,可持续的运维规范尤为重要。

最近一段时间一直在梳理项目开发流程以及自动化测试和部署规范,作为一个总结和大家分享,希望有所帮助。高效可持续的运维环境需要合理的规范作为支撑:应用管理规范权限管理规范配置变更规范发布策略规范日志运维规范持续集成部署实战(该内容将在后续文章中进行讨论,本次不展开)一、应用管理规范1.应用版本化可以使用svn、git对代码进行版本控制。建议使用git(如:gitlab/gogs),并使用gitgroup命名规范:大原则为根据产品域名区分,或者根据前后端业务模块进行分组(小写字母命名,横杠[-]作为连接字符)举例:maka官网http://www.maka.im对应的git仓库group为official,按照功能模块分组,商城前端对应的git仓库group为store。项目名命名规范:全部用小写字母横杠[-]作为连接字符命名规则:[产品名称]-[项目类型]-[自定义名称]举例:official-store-customer。实践建议:在创建项目仓库时就要权衡前后端或者大的功能模块的拆分,保持低耦合度。2.合理的分支策略常用的git工作流总结如下:第一种:集中式工作流,很多公司使用svn,对git的使用并不熟悉。如果迁移至git之后,可以考虑集中式工作流进行开发,即代码库只有master一个分支,所有开发者只有本地master和远端master分支。这种方式使用简单,但无法充分发挥git的优势。第二种:功能分支工作流,与上一种不同的地方在于,除了master分支以外还有功能分支。日常开发在功能分支,提测集成时提交mergerequests(在bitbucket中是pullrequest)。开发者可以在这个时候进行讨论、审核代码,同意后可以合并至master分支,未同意则可以让开发者修改后重新提交或者选择关闭该mr。第三种:gitflow工作流:,两个主干分支master(正式发布分支)和develop(功能集成分支)。开发者应基于develop分支创建feature功能分支,用于开发,开发完成后提交mergerequests请求合并进develop分支。此时若到了发布窗口,基于此时的develop分支创建发布分支release用于测试→预发布→发布,以避免影响develop分支的正常集成、合并功能分支;release分支不再有新的功能合并进来,一旦创建只用于bug修复并将修复cherry-pick到develop分支;发布完成后,release分支合并进master并分配版本号、打tag,用于存放发布历史。gitflow工作流方式适用于大型项目第四种:forking工作流,开发者fork官方的repo到自己的账号空间,对于官方分支只有只读权限,开发者通过pullrequest提交给官方审核是否合并进代码库;开发者通过同步上游官方的repo来使用其他人的代码,分支策略可参考上述三种工作流,适合开源项目。针对创业公司参与同一个项目的开发者并不多,过于复杂的分支策略并不能带来便利,可以参考leancloud的分支模式,根据团队的使用情况进行调整。介绍下我们当前使用的分支策略:master:主干分支,用作日常开发的基线;usera/develop:开发者a日常开发所在分支;release-201603091106:master分支集成测试完成后,构建到预发布环境时自动创建release-201603091106用于发布。hotfix-201603091106:基于当前发布之后的release-201603091106分支用于修复bug,通过提交mergerequests方式合并进release-201603091106,并将修复cherry-pick到master分支。日常开发在usera分支操作,然后提交mergerequests请求合并至master分支,本地通过gitfetchoriginmaster,然后在usera分支gitrebaseorigin/master将master最新commit合并到本地usera分支从而形成闭环开发。3.关于代码审核三剑客gitlab+jenkins+gerritgerrit作为创业公司代码审核工具略显复杂,不足够敏捷,建议使用gitlab的mergerequests或者github和bitbucket中的pullrequests作为代码审核和讨论的工具。也可以选择facebook的phabricator(可同时作为代码托管和评审,非常敏捷,由于phabricator提供的工具集在windows下使用起来不太友好,后来没有选用,后期会分享phabricator的使用思路和工作流)4.目录结构规范的目录结构不仅有利于开发者理解代码结构,更有利于代码的快速部署,以php为例,目录结构建议将代码配置文件(如:数据库,redis,osskey,语言开关,日志级别开关等)、日志文件,其他文件缓存等独立于代码库之外存放。前端项目src为源码目录,dist为前端经过压缩合并等最终生成的代码目录(发布时可忽略src)。每个项目详细写readme.md文件,详细说明,各个环境对应的访问路径、目录说明、构建压缩方式,nginx配置等,代码仓库中包含额外的test目录存放测试用例(本着谁开发谁写测试用例的原则);二、权限管理规范权限有两类:一个是系统权限(包括服务器登陆,数据库/redis等),另外一个是服务运行时的权限。1.系统权限统一入口,受限访问ip,禁止空密码弱口令,生产环境服务器需要先拨入vpn之后通过跳板机才能连接成功(当然我们使用的是开源当中最好的跳板机jumpserver),任何人的操作都需要审计;生产数据库及redis禁止了外网访问,分别使用phpmyadmin和redislive统一访问入口,增加了多主机访问及屏蔽了危险操作如ddl数据的导入导出等。也需要先拨入vpn才能访问。开发测试环境权限控制相对宽松,devleader和qaleader同时具有开发和测试环境的服务器及数据库权限,便于测试和debug;生产环境为了便于开发调试生产代码,且不影响线上,增加了staging节点,未在线,但环境代码及后端均和生产一致;2.针对服务权限层面以web服务为例,nginx和php-fpm运行用户和用户组为:www-data;代码目录用户为www。这样代码目录默认情况下web服务只读,避免出现文件和目录777权限的情况;日志和缓存目录用户设置www-data,但要禁止访问php等动态文件。禁止危险函数phpinfoexecevalsystem等,具体可参考http://www.sinacloud.com/doc/sae/php/runtime.html禁止跨目录访问open_basedir,开启前后的性能对比请参考三、配置变更规范1.系统部署传统idc机房可以通过定制镜像或者使用cobbler定制安装,运行的服务也可以定制在镜像中,但建议安装系统时注册puppet/saltagent,再自动化部署相关服务。公有云中可以在服务器上部署相应环境后创建系统快照,制作系统镜像,弹性扩容时可选择该镜像自动化安装。2.日常变更日常变更包括服务配置的变更和代码配置的变更,这些操作我们是通过ansible,相比puppet/salt的好处就是简单方便不用装agent,后面会详细介绍如何基于ansible做发布回滚。变更的内容使用git进行版本控制。四、发布策略规范1.发布时间注意:以上请根据自己业务做相应调整,避免在业务高峰期发布(除应急bug外)。我们业务高峰期基本在18:00-23:30,低峰期基本在01:00-06:00。这也是微信分享阅读的高峰和低峰时段。无论应急bug还是日常迭代都必须由qa测试通过和产品经理审核通过后才能上线。血的教训:曾经出现过开发为了修复线上很急的bug,开发修复后自主上线导致生产出现更严重的问题。2.发布工具的选择无论是自主开发发布系统,亦或是使用开源的系统都要本着解决问题的原则,否则只能是重复造轮子,然并卵呀!开源的持续集成和发布里面个人觉得比较好的如:jenkins,walle,spinnaker,go,gitlab-ci,bamboo(收费)等,其他参考。下面介绍我们基于gitlab+jenkins+ansible(flamingo自动化代码发布工具)实现的自动化代码部署平台,流程如下:flamingo(“火烈鸟”,https://github.com/geekwolf/flamingo)是基于ansible的自动化代码发布工具,目的是实现统一的代码发布方式,思路基于capistrano,并对ansisrano进行了改造可以通过传入语言环境,主机组(应用组/灰度机组等),项目代码库,分支名称,项目名称等参数来进行自动化打包发布,也可以将flamingo工具二次打包使用。flamingo本着回滚即发布的原则,以简化发布流程,回滚时传入要回滚的分支即可,其他参数可参看defaults/main.yml进行了解;(注:依赖git/rsync/ansible)例子:ansible-playbookdeploy.yml--extra-vars='flamingo_git_repo=git@github.com:geekwolf/flamingo.gitflamingo_product_name=flamingo'执行后生成的目录结构如下图(目录定义请参考defaults/main.yml):五、日志运维规范毫无疑问,规范的日志对于运维和开发排查问题有非常大的帮助,例如php项目日志格式可以规范为时间,日志级别,日志内容(比如对于连接多个db时出现连接不上或超时应该把实例地址一同写入日志),可以参考psr-3的标准:通过elk将业务日志,php自身错误日志/慢日志,nginx慢日志等进行搜集统计并结合zabbix实现报警,便于及早发现问题。六、持续集成部署实战后续篇章会分享针对php/java/前端以及android/ios持续集成和部署实战,敬请关注。总结以上只是粗略对持续集成和部署过程中遇到的问题进行了总结,并不完美,但对于初创公司应该有些帮助,欢迎一起学习讨论!

相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>
推荐商标

{{ v.name }}

{{ v.cls }}类

立即购买 联系客服