其他部分恕删,以免文章过长
: ※ 文章网址: https://www.ptt.cc/bbs/Soft_Job/M.1475483798.A.9C0.html
: 推 pttworld: 10/03 17:11
: → pttworld: 本质问题。交给客户使用可能是客户不清楚。 10/03 17:12
: → pttworld: 德瑞克的似乎自己在用,未显示部署失败的处理。 10/03 17:13
pttworld大大也未免太小看我Hsu某人了吧(哈哈,别生气,开个玩笑)
: → Lordaeron: 搞哪么多工具,看起来不如写一写比较快。 10/03 17:34
: 推 tangblack: 推,看下来觉得写很清楚,回到第一页看作者原来是qrtt1 10/03 19:54
: 推 Hevak: 推,这篇观念好棒 10/03 21:50
部署失败或生效失败的情况,这当然有考虑在我之前分享的自干部署平台里面。
整个上线程序可以简单画分为三个不同阶段
1. 建置
2. 部署
3. 生效
建置失败,主要是开发者自己的问题,或者是位在DH系统上设定模组间的依赖关系
(我之前提过,模组之间的依赖关系跟每个开发者本地的build.gradle或是
gradle.properties没有关系)没有设定正确,才会导致建置失败,这一点会反应
在平台的查询结果上,并且透过整合Activity BPM Workflow跟企业内部讯息通报作业
告知开发人员进行修正。
到了部署阶段之后的所有过程,我都有在Graylog上面设定stream alert并整合
Slack,所以哪一台传输失败我们都可以近乎在第一时间知道哪一台在deploy的
过程中失败了,需要人工介入处理,通常会发生这种情况都是网络或是硬件出了
问题,导致SFTP/SSH的执行过程中断,这很难透过任何方式自动化。
等到丛集内完成部署,系统会开始进行生效作业,我在生效作业设计了两种不同
的作业方式,分别是rolling upgrade与Tomcat Parallel Deployment。
我先讲前者,在公司内的资讯系统可以分为多个不同的丛集,每个丛集运作一个
系统,每个系统又可以分为1~多个模组,部署是以模组为单位,而生效是以丛集
来进行。
每个丛集之下的服务器又可以分为几个群组,每个群组内的服务器是为一体的,
restart是一起进行。
每个系统都会有一个heartbeat/healthy check URL,这个URL是一个Spring MVC
的bean,他会呼叫DAO bean执行dummy query确保连线跟Bean都运作正确而且完成
bootstrap。
DH会先更动load balancer(Apache HTTPD或HAProxy,测试环境用,正式环境用F5)
,然后开始依序重启丛集内每个群组的所有服务器,然后每隔一小段时间测试每个
服务器的heartbeat/healthy check URL,等到所有服务器都测试通过之后,才会继续
下一群服务器,以此类推。
在这过程中,因为有Graylog跟Stream Alert功能的帮助,我们都可以即时知道生效
状态,比如是否生效时间超过平常预期,bean的加载或初始化错误,无法初始化数据库
连线的,这些都会被抓到然后人再介入处理。
若是使用Tomcat Parallel Deploy的方式,其实也是可以分成多个群组轮流进行平行部署
,但我没有这样做,也倒是没有什么问题发生,平行部署如果新的Spring Context run
不起来(bean有错或无法连线到资料都会造成context load fail),原来的application
不会被undeploy,我们一样可以透过Graylog第一时间知道问题发生。
以上部署过程只要不要真的发生一些问题,目前我们一整天几乎都不用连线到服务器上
处理任何问题,所有部署都可以让开发人员自己来做。
各位应该可以发现我提到的部署过程中缺少一段很严重,前一位大大有提过的:Testing
,建置完成之后应该做Unit Testing,Deploy到Test之后应该要做Integration Testing
.....等等每个阶段都有该做的Testing,但我把整个检查过程缩减到只靠healthy check
,这是有风险的。
但这是不得不为,由于人员因素,绝大多数同仁不会也不写testing program,如果开发
人员的程度不能够把unit test跟integration test自动化,那过程当中就不得不有大量
人为的参与,integration test交给同仁自己做并且相信他们做的结果。
种种权衡之下,我已经尽力处理部署或生效失败的情况,并避免因为这样的情况发生造
成使用者的不良体验。
走到自干deploy platform也是不得不为的做法,当你要考虑整合一切其他的流程,
像是Sonarqube,Doxygen跟我们上线时会自动从Gitlab中捞出一些程式异动资讯写到
数据库里面,当必须对手上现成工具进行大量客制化的时候才能达到你的目标时,与其
把时间花在那么多客制化上面,不如从头打造一个量身定做的系统。