邵磊 分布式实验室 

小型公司DevOps落地实践案例_Jav



最近几年DevOps的概念越来越火,各个企业也逐渐意识到DevOps对项目研发效率的重要性,也有不少第三方企业提供整套流程成熟的解决方案。而我们侥幸,在这些第三方平台尚未崛起时,制定了一套适合自己的DevOps流程。


先申明一下,因为我们公司规模较小,和在座各位朋友任职的一线互联网公司可能没有可比性。所以,我分享的一部分流程或方案,仅供参考。




小型公司DevOps落地实践案例_Jav_02





先说下背景,我们公司做的大概可以理解成SaaS服务,即从服务器硬件到系统环境到服务都归我们管。而且每家客户都有很多个性化的需求,在我接手重构前,我们平均半个月才能接入一家,经过我们几个月的改造,我们现在可以接入一家客户大概可以控制在1人天。之前,我们开发流程比较混乱,没有文档,没有各种开发流程,现在我们逐渐规范,形成稳定的流程和体系。




小型公司DevOps落地实践案例_Jav_03






下面我们聊聊Java项目,我们把一个Git库中的2个项目(接口、后台管理)进行拆分:


  1. 接口服务

  2. 后台服务

  3. html5包

  4. 公共包服务


我们主要做了前后端分离,代码Git库分支化管理(事实上大部分小公司都可以这么拆分)。


我们采用和其他公司不同的方式,定义公共版为主分支,为每个客户建立1个额外分支(事实上分为开发分支、集成分支),发现公版的bug,到主分支改,改完后合并到各个分支,这样就不必重复切换到每个客户项目中改bug。




小型公司DevOps落地实践案例_Jav_04






使用Jenkins编译,包含我们Java项目、H5项目、安卓项目、iOS项目。


开发人员只需要本地调试后,提交代码到Git库的某个项目分支上,由Jenkins自动编译。如果编译错误会通过邮件反馈到影响代码的开发人员邮箱中,另外测试人员一键部署后,测试出问题,也可以通过Jira提单给开发人员。开发人员收到后,继续提交代码,不再像我们之前,必须通知开发人员,开发人员本地打包。


流程如下:小型公司DevOps落地实践案例_Jav_05




这里我们做了一点偷懒,我们版本号的维护也交给了Jenkins,通过脚本由Jenkins自动增加版本号。


我们还将所有项目中状态抽取出来,做成无状态项目(大部分公司都是这么做的,尤其之前听阿里分享,他们做到自动识别环境),这样,测试环境、生成环境的war包都是相同的。




小型公司DevOps落地实践案例_Jav_06




然后我们做了一个自动化部署的小平台,主要功能如下:


  1. 升级、显示当前版本

  2. 对war包有效期,真实性校验

  3. 开发人员将公共SQL放入公共.sql里

  4. 各个客户定制化需求的SQL放入各个客户.sql里


项目经理升级时,自动提示未执行的SQL,点击执行即可。




小型公司DevOps落地实践案例_Jav_07





接下来,我们聊客户端:


客户端内容不多,我们有安卓、IOS客户端,也是经过一轮无状态抽取,然后抽取服务器地址,配置后,由Jenkins自动打包,同时打包测试环境包、生成环境包。


小型公司DevOps落地实践案例_Jav_08





小型公司DevOps落地实践案例_Jav_09





测试人员从Jira提单后,开发人员解决后,会看到具体解决的版本号,然后进入OSS存储,安装Android程序,或者IOS程序,一键部署Java项目。


因为安卓和IOS均是同时发2个包,Java项目、H5项目无状态,所以生产环境和测试环境都可快速部署测试。





小型公司DevOps落地实践案例_Jav_10


小型公司DevOps落地实践案例_Jav_11




运维组重构先看看之前的图:小型公司DevOps落地实践案例_Jav_12




因为各个时期部署的系统版本以及服务器型号等都不通,所以线上环境比较混乱。


我们采用Docker容器统一方案解决此问题,使得每个客户机器环境均相同。我知道在座的各位都是Docker大神,我就不多讲了。


看看我们现在的管理图:小型公司DevOps落地实践案例_Jav_13




我们用的是Portainer框架,简单二次开发了一点功能。


我们用了TLS认证,所以,管理者并不是通过Linux密码控制,而是通过配置平台,然后分配权限给各个项目经理所在的team中,然后,项目经理对team成员权限进行管理分配。


该方案优点:


  • 在Docker下,所有客户生产环境相同。

  • 易于备份、迁移、恢复。

  • 可建高可用环境,发包时采用灰度发包,蓝绿部署不中断服务。

  • 可支持弹性伸缩设计,支持扩展。

  • 支持负载均衡,域名转发,意外切换容器等。

  • 有利于转型微服务架构。





小型公司DevOps落地实践案例_Jav_14






而建立Docker集群需要我们自动化完成,这里我采用了Ansible工具来实施,我们可通过指令分发,指令获取所有机器某个包的版本,执行不同的代码。


这里我建立了各种仓库,方便Java开发,建立了一个私有仓库,一个Maven官方代理仓库,一个阿里云代理仓库;Docker上我为了方便开发打包其他环境,创建了Docker私有仓库;还有一些为了解决统一管理Linux服务器而创建npm仓库;以及安卓所要使用的Gradle私有仓库;未来,我们可能还会创建更多仓库,能支持的仓库列表都在下面:




小型公司DevOps落地实践案例_Jav_15



小型公司DevOps落地实践案例_Jav_16




大数据一直以来是很多公司核心产品,对于小公司,如何低成本实施呢,我研究了一套强大的大数据框架Superset,并对其做了部分的二次开发。他能实现各种大数据图表展示,如下图:小型公司DevOps落地实践案例_Jav_17




我们采用iframe的形式将部分功能加入到我们管理后台。




接口篇

小型公司DevOps落地实践案例_Jav_18





我们采用了RESTful风格的API,也许很多人说RESTful不是很简单,10分钟上手,30分钟精通,事实上绝对比这要复杂的多。有很多的细节,很多的约束,经过几个月的协调开发后,都未必能避免出现不太和谐的接口。


之前,我们项目,各种接口文档都存在,主要有一下:


  • Swagger

  • 阿里的RAP

  • Word文档

  • 其它


对了,之前的接口是这样的:


  • …/A项目/模块1/getProducts ----接口

  • …/A项目/模块1/Products.html ----页面

  • …/A项目/模块1/Products.js ----静态资源


留下了很多的坑,这里不对RESTful再做详细介绍,有兴趣,大家可以自己了解下。我们统一了一个接口文档为postman,可能很多朋友会说postman怎么能作为接口文档,我只想说,他适合小公司,不仅有入参、出参示例(可以多个例子),还能在tests里写接口说明,也方便前端调试,调用服务器使用。




规范篇

小型公司DevOps落地实践案例_Jav_18




我们制定了一些规范和约束,比如,原来项目经理发现问题,会立马找开发,现在规定为先联系测试,由测试提单给开发。