我是如何重构整个研发项目,促进自动化运维DevOps的落地?

为了这篇文章,我先后写了将近十篇文章铺垫,才将这篇总体重构思想引出。html

背景

先说下背景,咱们是一家小公司,虽然打着作产品的旗帜,可是每一个客户都有大量的个性化功能,这里指各个客户的java端、Android端、ios端(大部分功能代码是相同的,个性化功能代码不一样)。我以前是作Android的,实践证实,特殊状况下,只有咱们Android组能够随意切换到任意一家客户,任意一版本的代码。而且修复一处公共bug,全部客户的版本都会更新。我也一直在介绍这种开发模式,但并得不到支持,直到年初,我晋升为移动端组长,加上,后来java组组长跳槽,我才有机会全面实施重构计划。html5

前言

由于我作过不少年的运维(网吧软硬件运维等),对服务器硬件以及软件有较高的认识,加之我对各门语言有必定的开发经验,算是一位全栈工程师,对各端都比较熟悉。这一切,为个人实施带来了很大的帮助。
本人申明如下全部重构思路均出自本人想法,实施上,由我统一安排培训后落实。(虽然落实阻力极大,但最终效果不错)java

先说说效果

以前,咱们每接入一个客户项目,完成java端、Android端、ios端和部署服务器环境等,须要2周的时间。如今,咱们大概须要30分钟。而且每位客户个性化需求再多,咱们也能灵活开发及切换到各个客户的代码上。
以前,咱们开发流程极为混乱,没有文档,没有各类开发流程,如今咱们逐渐规范,至少节约50%的开发成本。固然,咱们还在不断改善中。linux

java项目组

咱们的java项目,原来分为接口服务、后台管理服务,可是都在一个git库里,我将它分为:ios

  1. 接口服务
  2. 后台服务
  3. html5包
  4. 公共包服务

由于本次重构,我逐步采用先后端分离方案,因此多出了h5包。git

每一个库分为多个分支,其中定义master为主分支,各个客户为新开的一个分支,经过分支来解决各个客户各类不一样需求,(由于客户需求实在过细,有些文字都得改,单纯的插件化开发的话,每一个插件都要n多个版本,这样对于咱们小公司,作不起来),固然各个客户也应该有个开发分支,但受限于咱们人员较少,一期省去了开发分支,把本地暂存区做为开发分支。
关于如何在不一样分支开发,可参照我另一篇文章
《你肯定你能记住那么多的git命令吗?快试试Sourcetree吧》web

开发流程以下:
sql

开发人员只须要本地调试后,提交代码到git库的某个项目分支上,由Jenkins自动编译,关于Jenkins自动编译全端项目可参照我另一篇文章
某小型公司持续集成工具jenkins实践(JAVA WEB、Android、IOS、html)
若是编译错误会经过邮件反馈到影响代码的开发人员邮箱中,另外测试人员一键部署后,测试出问题,也能够经过jira提单给开发人员。开发人员收到后,继续提交代码,再也不像咱们以前,必须通知开发人员,开发人员本地打包,这样没法跟踪项目代码。docker

补充:
由于咱们项目比较多,人为维护版本号会费时费力,我决定一期采用Jenkins自动填入版本号到项目中,并在文件名中体现,因此,项目编译出的包多是1.war、2.war、3.war,咱们内部将其(一、二、3)做为版本号,固然war包内部我也写入了版本号。
其次,咱们剔除了大量含状态的代码,使得每一个war在测试环境和生产环境自动加载不一样配置来运行,由于无状态,因此war包、h5包在测试环境和生产环境都是一套代码。这里咱们花了几周时间完成抽取无状态代码。数据库

一键部署:
咱们作了一套管理平台,可升级tomcat中间件下的各个war和h5,相关介绍见我另一篇文章
java web项目war包自动升级部署方案
能够看看咱们如今的效果:

主要功能以下:

  1. 升级、显示当前版本
  2. 对war包有效期,真实性校验
  3. 开发人员将公共sql放入公共.sql里
  4. 各个客户定制化需求的sql放入各个客户.sql里

每次只须要点后面的升级按钮,便可升级sql脚本或服务。
文章是以前写的,逻辑上有些变化,这里不作介绍。

客户端组

客户端开发流程,这里ios和Android一块儿说,咱们提交代码后,Jenkins都会同时生产两套链接服务器地址不一样的ipa、apk,这里由于不少状况在不一样网络环境下须要看测试环境和生产环境,因此,我采用同时发2套包方案。


Android的同时2套包方案可参照我以前
Android利用gradle同时编译多包(测试环境地址、生产环境地址)
IOS同时发2套ipa包方案可参照我以前的
IOS利用Xcode同时编译多包(测试环境地址、生产环境地址)
在ios上架appstore流程上,我采用了半自动化发包策略,将其上传到开发者平台后,手动上架。
各个客户,各个版本咱们采用多分支的方案,和上文java同理,不一样分支处理不一样客户项目。

测试组

测试组流程


测试人员从jira提单后,开发人员解决后,会看到具体解决的版本号,而后进入oss存储,安装Android程序,或者ios程序,一键部署java项目。
而由于安卓和ios均是同时发2个包,java项目、h5项目无状态,因此生产环境和测试环境均可快速部署测试。
图中,以real文件名结尾的是链接生产环境地址。

项目经理

项目经理流程


我采用新客户新流程,老客户老流程,并逐步迁移到新流程中。
其中执行数据库脚本已经被省略,由统一部署平台执行。

运维组


这张图是之前的逻辑,由于每一个时期,每一个客户给的服务器和服务器系统各不相同,运维起来极为复杂。我采用docker容器统一方案解决此问题,使得每一个客户机器环境均相同。
下图我是我解决后的模型图:


咱们把各个客户的服务器都整成docker集群,而后经过咱们公司统一管理平台管理,而后将各个容器分配给不一样的角色,这里咱们是用Portainer来解决,并二次开发了一些需求。
详细可看我另一篇文章
Docker的web端管理平台对比(DockerUI 、Shipyard、Portainer、Daocloud)
这里的管理都不须要linux机器的密码,经过tls证书进行控制,而Windows机器将废弃不用。

该方案优势:

  1. 在docker下,全部客户生产环境相同。
  2. 易于备份、迁移、恢复。
  3. 可建高可用环境,发包时采用灰度发包,蓝绿部署不中断服务。
  4. 可支持弹性伸缩设计,支持扩展。
  5. 支持负载均衡,域名转发,意外切换容器等。
  6. 有利于转型微服务架构。
  7. 快速搭建环境

而创建docker集群须要咱们自动化完成,这里我采用了Ansible工具来实施,咱们可经过指令分发,指令获取全部机器某个包的版本,执行不一样的代码。
详细参照我另一篇文章:
自动化运维工具ansible的实践

而后经过image镜像对客户进行统一部署容器,这里咱们创建了私服。

私服篇

这里我创建了各类仓库,方便java开发,我创建了一个私有仓库,一个maven官方代理仓库,一个阿里云代理仓库;
docker上我为了方便开发打包其余环境,我建立了docker私有仓库;
还有一些为了解决统一管理linux服务器而建立npm仓库;
以及安卓所要使用的gradle私有仓库;
将来,我可能还会建立更多仓库,能支持的仓库列表都在下面:

私服
私服

详细可参照我另一篇文章
利用nexus构建maven、docker、npm、gradle私服仓库

大数据篇

大数据一直以来是不少公司核心产品,对于小公司,如何低成本实施呢,我研究了一套强大的大数据框架,并对其作了部分的二次开发。
详细可参照另一篇文章
juejin.im/post/596702…
放心吧,只要你用了这个框架,必定能够轻松解决各类大数据图表问题。

接口篇

我全面统一采用restful风格api开发接口,接口文档自动生成,这里涉及几篇文章,暂时还没来得及写,后续补上。

规范篇

我还制定了一些规范和约定,好比内部开发协做等约定,暂时还没写完,后期我也会补上。

文化篇

以前,咱们开发需求彻底依靠项目经理分配,如今我安排不断重构项目,带来了不少新的流程,这里征得领导赞成,安排每周或每2周分别对各部门,培训后分配帐号,实施。这个涉及公司内部业务,不便详说,敬请谅解。

DevOps的落地

DevOps这个词,是我上次在上海CNUTCon全球运维技术大会2017会上所知,我才知道大部分公司都在作自动化运维,缩减运维工做。
关于这方面,我也写了2篇文章,可参照
[Day 1]上海CNUTCon全球运维技术大会2017实录
[Day 2]上海CNUTCon全球运维技术大会2017实录
在文章中,我融入了很多本身的想法。
固然,适合咱们公司DevOps的落地方案已经实施一大半了,剩下的我还在努力设计蓝图中。之后必定会和你们分享。

后续

我写了几个月各方面的文章,大部分读者可能觉得我是胡写一通。今天,终于把他们汇聚到一块儿,说实话,心情仍是蛮激动的。

我认可我全部的重构对于不少大公司都是提不上台面的,但对于咱们小公司,不少东西造成体系,说实话,真的很难。还有些内容,我不方便说,或者是忘记了说。事实上,咱们作的远比文章里的内容要多得多。
还有,部分文章多是几个月前写的,逻辑上和流程上,咱们都已经作了不少优化和调整,可是主体思想都没有变,不影响阅读。

其次,我申明,本文中全部介绍,绝对不是最好的解决方案,不少方案是我对公司进行分析后定下的,毫不是每一个小公司都适合。但我以为本文必定能给你带来很多的灵感。

最后,本人能力有限,开发圈子也比较小,不免有考虑不周的地方,若是您有任何高见,欢迎告知,小生在此谢过你们。

相关文章
相关标签/搜索