前言
在一个大型团队中,生产发布是一件复杂的事情,从dev(前后端联调)-->test(测试集成&压力测试)-->pre(灰度测试)-->prod(生产环境)的多环境推进,以及生产环境的热更新、回滚等问题一直在困扰着各个公司,今天我将基于公司的自动化部署平台为大家讲解下我们是如何做到多环境部署。
每个环境做什么
在明确发布之前,我们需要明确一下每个环境的主要职责和角色:
DEV:也叫开发环境
●事项:前后端接口联调,修复代码基础缺陷
●角色:前端-后端
TEST:也叫测试环境
●事项:测试集成测试、压力测试,开发修复bug
●角色:开发(前端后端)、测试
PRE:也叫灰度环境
●事项:生产环境冒烟测试,切5个左右真实生产数据,回归流程是否有问题
●角色:开发(前端后端)、测试
PROD:也叫生产环境
●事项:发布代码,做真实环境验证,有问题第一时间修复(sql止血订正或代码回滚)
●角色:开发(前端后端)、测试、运维
大型公司如何管控代码发布
随着自动化部署CI/CD(DevOPS)成熟,目前大型公司都开始搭建自动化部署平台,形如下图:
环境管理应用监控分支应用部署部署信息配置管理应用模版流水线模板二方包
ICATION/DETAIL/OVERVIEWID=924&APPCODE=HBOS-IN
白检验白PDA白开发文档白业务文档白其他白架构小林CODING
S-INPATIENT住院工程在线发布
百度一下开发者搜索检验二
CA不安全|
正在讲话:何波;SSG;
1您正在共享屏幕
HBOS-INPATIENT
O微服务组化
双集群管理
目数据管理
应用分类
四监控管理
GIT地址
流量地图
HBOS-INPATIENT
NPATIENT.GIT
诊应用管理
8口L
业务站
X十
其他书签
自工单管理
APPCODE
应用类型
巨项目管理
只国
应用名
TT:口L
甲
应用部署名
应用组
住院工程
概要
1
8口
HBOS
后端
8杉
日志管理
9
修改
8口
8口
81
说点什公..
责任人
9
概述环址
2
R1
件.V
R1
S
口版本管理
风
图1 (自动化部署平台应用主页)
当用户进入应用主页后,会发现有不同的发布环境,每一个环境对应一台服务器、一个访问域名、一组中间件环境(即dev、test等环境的nacos-mysql等都是分环境部署的)。
HBOS1.0开发基准
项目环境分类
目环境分类
境名:请输入环境名
请输入环境CODE
开启CODEREVIEW
流水线模板
环境大类
环境CODE
环境大类:
环境类型
HBOS1.0测试基准
默认分类
默认分类
环境CODE:
启用发布审批
应用模版
部署信息
环境管理
基准环境
配置管理
应用监控
HBOS-INPATIEN
应用部署
二方包
HBOS-TEST
查询
HBOS一DEV
环境名
绑定环境
环境名:
基准环境
态
重置
概述
控分支
环境
环境
HBOS
批备注
TEST
HBOS
CEV
D
AA
图2 (自动化部署平台多环境)
同时自动化部署平台会自动整合公司的gitlab,将分支展现在发布平台,以便用户可以界面化操作和部署
总共64条数据<1234567>10条/页V
住院医护应用日志优化-HBO..
BOS-INPATIENT住院工程在线发布应用
G-PDA-SURGERY_20230710135753订
编辑创建REVIEW作废
K_PREMISSION_20230711140358
UT_DEPT_WARD_20230711180509
院医护应用抛异常优..FONE
PED_SURGERY_WG_20230711155401
2_20230710094804司
,住院护士站->医嘱执..IONE
,[技改]住院工程添加...IONE
住院护士站->)医嘱执行-)..
PDA入手术间,介入手术,...
住院护士站-今日手术..,FONE
[住院医生站]患者转..FONE
ANDOVER_WG_20230711154825
住院护士站-今日手术明日手.
士站]岗位权限未..,FIONE
...出院带药/自理药护士..,FONE
院医护应用日志优化..IONE
PDA入手术间,介入手...IONE
7WXB20230707164601厅
院带药/自理药护士站时间..,出院
理交接班]交班患..FONE
SSERTS_202307101440197
编辑创建REVIEW作废
IJ1_20230710170958司
编辑创建REVIEW作废
[住院医生站]患者转科
[技改]住院工程添加断言..
分支名:搜索分支
编辑创建REVIEW作废
编辑创建REVIEW作废
[护士站]岗位权限未生效
编辑创建REVIEW作废
编辑创建REVIEW化
编辑创建REVIEW作废
[护理交接班]交班患者数.
干分支:MASTE
森脑.弗T而尸控件代
编辑创建REVIEW作废
麻脑利!弗质日陈生朵IO
关联FONE/REGULUS
流水线模板二
伯妈创神口人IN,E应
EVIEWID操作
220118
FEATURE
新建分支
BUGFXG
人NLIANNNON7N71玩N7O0
FEATURE
应用部薯
UGFXG
环境管理
220272
FEATURE
FEATURE
FEATUREL
应用监控
19896
20933
220925
FEATUREL
部薯信息
220817
应用模版
FEATURE
配置管理
220461
220312
21064
二方包
分支名
10770
描述
既术
人人+人
图3 (自动化部署平台分支管理)
当用户需要创建分支时,不再需要像传统的那样去git创建,或者idea创建,而是可以直接在当前发布平台创建(底层是一样的,都是创建一个新的git分支)
91条数据<12345...10>10条/页
编辑创建REVIEW作废
编辑创建REVIEW作废
HBOS一DTC诊疗中心|在线发布应用
编辑创建REVIEW作废
编辑创建REVIEW作废
编辑创建REVIEW作废
取消确定
主干分支:MASTE
编辑创建REVIEW作
编辑创建REVIEW作废
FEATURE_GINGQUAN
故障O任务
通过..FONE
编辑创建REVIEW作
报错..FONE
描述:请输入描
ATUREMISHA
FEATURE_SANMU
BUGFX_LIULI_SAVE
EATURE_DONGLIX
变更..,FONE
FEATUREDONGLIX
FEATURE_LIULI_CU
REVIEWID操作
FEATUREHUANAII
ATUREJIYUNFE
*关联平台:O
关联类型:
列表:PD-HBOS
30711124230
EATURE_HUAYU
套餐..FON9
化...FIONE
新建分支
221093
内容列表@:
流水线模板
署部署信息
支持.FONE
主干分支:
221059
口...FONE
分支名称:
4646Q
环境管理
配置管理
应用监控
220637
报错FON
应用模版
220652
161853Q
220959
项目列表:
220630
应用部署
:MASTER
220376
新建分支
分支名
需求
O缺陷
OREGULUS
220789
二方包
概述
分支
图4 (自动化部署平台分支创建)
当用户需要发布时,只需要进入对应的环境(这里我们以test为例),勾选所需要发布的分支,即可实现自动化部署。下图可以看到test环境同时部署分支约20个。
1EUEYMTS9ENOIEOEAILETOUL2EI0I194E1NSEUEVIEDOIO.ON.MOH1.00O7OA195EFERELYENIR2LIEOPNG223029N3SFESUEUHEIE
MWN2OEOERE5RETUEBULSNECNARGE20EONESAEODEUREOINGAESOERTEASOD2OCOEON5OTETUEAERMIAAITIETLOAIBSENRER9HETSE
APEN2POEMOEIREOELARIN2OITIETEFATAEAC,AEIAPANETTE20N2EFATRGENLETATINUI.EUE.2IO0ERETARUAE.INREE.OAIA
ATUIREXINYLSUPLEMENTAYFESPRESORPTON2023070E02345,BUGHYSHYING.CANOL,EVEOUTE2023070193714,FEATUREQINGQUARNS-PDA-
TAEOSEREETATUEIAEANNAEAINAERTATATAOAOEABUTOARAOETAOERNEANEOAE.ASONOTATIETETHATETRENETIONTNADEOANTENITOE
20230704134339,FEATURE_WANZI_DOCTOR_ORDER_TYPE-20230ODOETT
FEATURE_QINGQUAN_SSQ-PDA-SURGERY_20230710135753可
.TRACELOG20230621184642.FEATURE_WANZLIS-SEL-PAY-2UE
BUGFX_QIANHUA_CHECK_PREMISSION_20230711140358划
BUGFX_QINGSHAN_EY1IJ120230710170958可
分支RELEASE_HBOS-INPATIENTTEST_DEFAULTPIPELINE_20230629120734
FEATURE_WANZILIS_SELF_PAY_20230707112457日
FEATURE_AZU_BACKFEE_MC_VALID_20230707150738
请选择:HBOS-INPATIENT_TEST_默认...V
住院护士站->医嘱执行-)执行详情-)修
OS-INPATIENT住院工程|在线发布
发布时间:2023-07-1115:27
当前流水线:HBOS-INPATIENTTESTDEFAULTPIPELINE请
发布时.2J23-07-1115:54:4
新提交退出分支
醉收费-项目补费需识别是否自
DA入手术间,介入手术,住院手术需做隔离提
?)合并分支日
发布时间:2023-07-1118:34:22
2023-07-1017:09:5
镜像构建日
)依赖校验
2023-07-1114:04:0
布时.L.23-07-119:07:39
醉科补费项目筛选优化
VMAVEN构建[
发布时间2023-07-1116:26:3
2023-07-1013:57:55
发布时间:2023-07-1116:56:3
发布状态:发布失败
发布状态:发布完成
[护士站]岗位权限未生效
发布状态:发布失败
2023-07-0711:24:59
发布状态:发布完成
部署日
发布状态:发布失败
流水线模板二
完成
支REVIEW状流
2023-07-0715:07:40
发布时L.CUCJ-07-1114:53:4
HBOS1.0测试基准环境
发布状态:发布完成
]发布门三
丫开始
发布,
发布内容
变更原因
合并分支
创建时间
内容列表
发布环境
版本发布
发布人:
分支名
看部奢信息
创建
发布人:
22046
发布人:
布人:
应用模版
部署分支
219670
部署信息
219773
220272
发布状态:发布完
EATURE_XINYI_SUPPLEMENTE
2081
发布入,.
TATNSEACTAIET02029EEIN2C20A20057AELR2AE1ERFEP0C2AEA52EEAL2
情->修改执...
PROD
发布时
二
详情
分支
用部署
详情
.....ONOANEOA1SOE31FEATUREBUIADMISSION_0621_20230616114631.FEATUREJINGCH
详情
详情
图5 (自动化部署平台提交发布)
需要注意的是:假设我们需要对A分支进行发布,只需要勾选A分支,底层Jenkins会自动完成jar包构建,并执行底层的Docker run指令完成容器部署,这里部署的jar包每个环境都是隔离的。
即dev的jar跟test无关,每次都是新构建自己的。即使是test,点击两次发布也是构建了两个jar,只不过第二次的会覆盖第一次。这点各位需要明晰。
当测试提出我们有bug时,对应的开发人员就需要在idea中,A分支上完成代码修复并push,然后在自动化部署平台重新勾选分支,然后提交部署,完成一次重新发布,循环此过程,直至缺陷被修复。
如何排查日志
当测试提出某个环境有bug时,如果是传统Linux直接部署,我们会登录到指定的服务器用cat、grep、vim等指令进入日志文件,然后找到错误的堆栈信息。如果有结合Arthas的(Arthas排查错误)可以启动Arthas查看错误信息。但是现在一般都是会借助于Skywalking或ELK进行日志查看
RACELD:36606E562FEA44D0A62D527473FE48DE.494.168907997086..V
C2F-REPEATER-CONSOLE/MODULE...
VAPEX-OSC/COM.C2F.APEX.OSC.CLIENT.API...2023-07-1120:45:59
COM.C2F.BOOT.BASE.LOG.WRAPPER.SUPPLIERCLEAR..2023-07-11
VAPEX-OSC/COM.C2F.APEX.OSC.CLLIENT.API.SER...2023-07
MYSQ/JDB/PREPAREDSTATEMENT/EXE.
Q降噪:忽略REDISSONX合并理表格
开始时间:2023-07-1120:52:50持续时间:3177MS
MYSGL/JDBL/PREPAREDSTATEMENT/EXE..
MYSGL/JDBL/PREPAREDSTATEMENT/EXE...
选择环境:HBOS1.0测试基准环境
/C2F-REPEATER-CONSOLE/MODULE/...
端点:/DRAGON-BOAT/APPREGISTER
(1...34567..
PEX-OSC/COM.C2FAPEX.OSC.CLIE...
时间范围:2023-07-1120:43:06
DRAGON-BOAT/APP/REGISTER
/DRAGON-BOAT/APP/REGISTER
2023-07-1120:58:06日最近15分钟
3344MS2023-07-1120:51:32
DRAGON-BOAT/APP/REGISTER
3134MS2023-07-1120:52:28
LETTUCE/HGET/ACCEPT
3518MS2023-07-1120:55:
GET/DICT/DEFAULT/STAFF
3249MS2023071120:44:58
152MS2023-07-1120:56:13
3151MS2023-07-1120:53:2C
2023-07-1120:45:59
DRAGONBOAT/APP/REGISTER
POST/DIRECTORY/LIST
STARTTIME
2023-07-1120:46:00
2023-07-1120:45:59
177MS2023-07-1120:52:50
2023-07-1120:45:59
SER...2023-07-1120:45:59
VLETTUCE/HGET/ONCOMPLETE
RACELD:请输入TRACEID
2023-07-1120:45:59
2023-07-1120:46:00
2树状
EXEC(%O)
2023-07-1120:45:59
ETTUCE/HGET
2023-07-1120:45:59
SELF(MS)
CE-PLATFORN
2023-07-1120:45:59
ACE-PLATFOR
CE-PLATFORM
EXEC(MS)
MYSGL-CON...
更多查询,
CE-PLATFORR
METHOD
ACE-PLATFORN
NKNOWR
MYSGL-CON..
SQL-CON...APEX
SERVICE
3183M
查看日志
列表
3205MS
3579MS
CE-PLATFORR
3705MS
ETTUCE
74MS
ETTUCE
3579MS
MYSQ-CON
SPRINGMVC
DUBBO
API
ETTUCE
3205MS
UBBC
6MS
查询
OMS
OMS
MS
OMS
9MS
重置
0MS
OMS
MS
APEX
..,APEX
MS
2023-07-1120:45:59
7MS
6MS
APEX
MS
3152MS
MS
图6 (自动化部署平台日志排查)
在上图中我们就可以看到:一个GET请求,请求路径是:/dict/default/staff,然后一个远程服务调用,使用的dubbo,最后查询mysql数据库,这样就完成一个完整的日志链路追踪。
如何回答相关问题
1.你们公司如何部署发布
方案一:Linux原生部署
我们公司的部署呢,还是比较原始的,就是直接部署在原生的Linux系统,我们平时dev发布就在idea构建好一个jar包,然后用XShell上传上去,用指令:nohup java -jar tj-learning.jar启动。测试环境和生产也是一样的操作
方案二:基于Jenkins的自动化部署平台
我们公司的部署都已经非常成熟了,有一套自动部署平台,底层是Jenkins+K8S实现自动化部署发布,我们只需要在dev、test、prod等环境勾选需要发布的分支就行,它全帮我们做好了自动部署。
2.你们公司怎么排查错误
方案一:Linux原生环境
我们公司的部署呢,还是比较原始的,就是直接部署在原生的Linux系统,所以排查日志也需要自己去找到error.log,然后手动找到报错的堆栈信息,分析出原因。比如有个NPE(NullPointException-空指针异常),就会显示具体哪行报错,我们就会分析、修复。
方案二:基于Docker的原生平台
我们公司目前的部署就是原生的Docker,通过docker logs命令人肉排查
方案三:基于Skywalking的日志检索平台(CI/CD平台)
对于日志排查,我们公司是有Skywalking的,只需要测试给我对应的traceId,我输入进去就可以看到完整的调用链路和报错的堆栈信息,然后就可以分析报错原因并修复了