携程 Web CI/CD 实践(携程base)
ccwgpt 2024-11-03 12:46 34 浏览 0 评论
一、背景
在携程的日常Web开发生命周期中,本地代码开发阶段可通过NFES框架(携程内部一个支持SSR框架,其中还包含许多公共基础业务模块及UI组件)来快速完成项目需求。但开发完代码之后常常会遇到如下几点问题:
- 环境问题:Web/Node资源本地构建/测试环境和生产环境差异化大,导致有些问题无法及时发现
- QA流程:Web/Node端提交代码流程没有规范的QA环节,代码质量不可控
- 构建流程:资源本地构建与镜像构建是独立的,版本易混淆
- 代码开发完后的各个步骤比较分散,难集中管理
二、目标
通过引入CI/CD解决方案,建立完善的准备环境/测试/资源构建/镜像构建一整个流程的链路,使它可帮助项目以更快的速度和更高的质量来交付。
三、实现与实践
NFES 的 Web CI/CD 的实现,简单来说就是通过管道化 (GitDev Pipeline) 的执行过程来完成持续集成和持续交付,这篇文章先不涉及持续部署。
其管道 (Pipeline) 中集成QA,资源构建,生成镜像等多个Stage,而每个Stage中都包含详细的Step来完成其功能。接下来我们来详细从管道 (Pipeline) 中的Stage/Step的角度来介绍下NFES的Web CI/CD。
管道在这里可以理解为实现目标的顶层组件,整个NFES Web CI/CD就是这样的组件组合而成。目前Web/Node相关的管道分为三个Stage:
1)Install Stage
a. Install Step,安装用户项目下的依赖模块
2)Verify Stage
这里集成了三个Step:
a. Lint Step,静态代码检测
b. Test Step,单元测试/UI测试
c. Build Step,资源构建
3)SonarAndImage Stage
a. Sonar Step,Sonar代码检测并上传,此步骤依赖于Verify Stage中的Lint/Test Step
b. Image Step,构建Docker镜像,此步骤依赖于Verify Stage中的Build Step
上面三个Stage是依次顺序执行,而在同个Stage中的多个Step则是并发执行的。这些执行顺序的控制可通过编写.gitlab-ci.yml文件来完成。这里先简单介绍下.gitlab-ci.yml CI/CD配置的编写。
.gitlab-ci.yml是放在仓库根目录中的文件,默认仓库会去这个文件中读取CI/CD的相关配置。在此文件配置中你可以定义如下:
- 定义环境变量
- 需要顺序或者并行运行的脚本命令
- 前后Step依赖关系
- 此Step所需使用缓存和设置缓存
- 触发的条件分支
具体常用配置代码如下:
#配置所需的基础镜像地址
image: xxxxxxxxx
#配置相关变量
variables:
PROXY: http://proxy
HTTP_PROXY: $PROXY
#配置Stages的名称及顺序
stages:
- Install
- Verify
......
# Install Stage的详细配置
Test: #Step的名称
stage: Verify #属于哪个Stage
artifacts: #配置产物存档文件,可在Pipeline运行界面取到配置的文件,但此存档只能保存默认一周
paths:
- reports/
exclude: #忽略某些文件不作为产物存档文件
- .git
- .git/**
when: always
cache: #配置缓存
key: keyName
paths:
- node_modules #所需缓存的文件/文件夹
policy: pull #如需获取缓存的文件,这里定制policy属性为pull
allow_failure: true #此步骤是否允许失败,如果允许,即使步骤执行失败,仍旧可执行下个Stage
dependencies: #配置此Step依赖哪个Step
- Install
script: #配置所需执行的命令
- cd /testFolder
- node index
only:
- master #配置分支 只有配置的分支才会执行相关的Pipeline
......
在日常开发使用中,携程的GitDev CI/CD则提供公用的配置模版,如用户没有特殊Step的需求,可通过选择Step模版或者选择应用类型模版来自动生成上面的配置文件,无需关注yml的详细配置。
接下来我们详细看下NFES Web CI/CD的Install,Verify和SonarAndImage三个Stage做了哪些事情?
3.1 Install Stage
Install Stage中只包含一个Step,即执行安装用户项目下的模块依赖。此阶段安装结束后的nodemodules则会作为缓存给之后的Step使用,可节省很多不必要的重复安装模块的时间。当然如果在同一个commitID的情况下,多次执行这个Install Stage,则后面几次安装的nodemodules其实就是取第一次安装的缓存。
3.2 Verify Stage
Verify Stage默认会包含三个步骤Lint,Test,Build。这个Stage其实是一个规范的QA环节,而Build的Step为什么要放在此处,就是想构建与测试并发执行,从而缩短整个Pipeline的运行时间。
详细的各个Step的实现如下:
1)Lint Step集成了eslint静态代码检测功能
静态代码检测功能通过封装的全局模块来完成代码检测,其默认使用eslint:recommended推荐规则。如用户需要自定义eslint规则可以直接把规则写在当前项目的eslintrc.json文件中,模块会自动整合其默认规则。如想要忽略检查某些文件,则把规则写在.eslintignore文件中。执行完成后会生成eslint-report.json,此文件会作为artifacts可在pipeline的step任务页面中直接下载查看,也会通过后面的Sonar Step上传到Sonar。
2)Test Step集成了单元测试以及UI测试
集成的单测框架又可分为mocha和jest,Web端统一使用jest,NFES测试镜像中默认已有jest相关模块,如无特殊需求则不需要在用户项目的依赖中安装测试相关依赖的模块。如需自定义jest相关配置可写在用户项目下的jest.config.js中。单元测试的运行命令统一为:npm run test,其执行结果会以html/json/clover/lcov输出,输出结果中lcov和clover.xml文件与GitDev做集成,使其结果与代码的commitID进行绑定,这样每次代码提交就可在界面上直接查看本次提交代码的具体单测运行结果。这里也可设置对每次代码提交的单元测试覆盖率的要求,如其覆盖率不低于60%,否则不能进行下一步骤。
每次代码提交的CommitID的单元测试结果展示如下:
集成的UI测试是作为一个可选Step,我们提供了集成puppeteer/cucumber的镜像,用户如有UI测试的需求可自行在Test Stage中添加该UI Test Step。在UI测试中增加了视频录制的功能,每个Case对应一个视频,等用户的UI Cases执行完成后,则会自动生成报表并发布到资源站点上,方便用户查看及排查问题。
UI测试报表结果中录制视频(部分截图)展示如下:
3)Build Step集成页面的资源构建
这里的构建其实就是把在线构建搬到了Pipeline的Build Step中。首先是构建环境的搭建,分为两块:框架所需的依赖模块环境和用户项目依赖的模块环境。
关于NFES框架的依赖模块环境,Build Step使用的构建镜像中已经集成了NFES项目所需的开发态模块(我们对开发态模块加载做了些优化,把如Babel插件,webpack,loader等通用的模块全都集成到cli的全局模块中,然后预装到构建镜像)。执行构建时,更改构建时项目所需开发态模块路径指向预装路径,这样就可以不需要安装框架依赖模块。而对于用户项目依赖的模块环境则可以重用Install Stage中的node_modules中的缓存,这两点使用户项目安装模块的时间大幅度减少。
搭建完构建环境后,执行相关在线构建命令开始构建,构建的过程及日志都可通过Pipeline界面得到。构建完成后接下来是构建产物的处理。这里的NFES项目构建产物可分为Web端资源/node服务端资源。Web端的资源可以直接发布并获得相应的资源地址,此Web资源地址也会及时更新到node服务端资源中的资源路径。最后通过配置中artifacts属性来确定哪些node端的资源文件需要上传给下一步Image Stage来构建发布镜像。
3.3 SonarAndImage Stage
SonarAndImage包含了Sonar和Image两个Step, 这个Stage是目前管道中最后一个专门收集与处理前面依赖Step产物的Stage。
1)Sonar Step
此步骤是依赖于Test和Lint这两个Step, 用来收集依赖的这两个Step执行的结果并上传至Sonar中。用户可以在sonarqube的网站查看历史的代码质量报告。
2)Image Step
此步骤是依赖于Build Step,它是获取Build的构建产物与基础镜像一起构建出发布镜像并推送到Hub中,为接下来的应用发布做准备。到此步骤整个NFES Web CI/CD的流程就结束了。
四、小结
以上就是整个NFES Web CI/CD的实现与实践。目前几乎所有的NFES项目都已经切到CI/CD的流程上,它带来了集中式流程化管理,一站式对用户透明的资源构建与镜像构建更简单快捷,开发效率得到了很大的提高。
团队招聘信息
我们是平台研发中心,一个为携程快速发展提供各类基础产品和服务的平台,我们以技术驱动提升客户体验,提升跨团队协作效率。
我们拥有优秀而强大的团队,引导你学习业内领先的开发技术,与技术高手交流对话,学习切磋。在亿级用户严苛的品质要求中,激发你脑中不断涌现的创新思维,带领你体验飞速成长的惊喜快乐,并在各种机遇与挑战中发展自我,成就自身。
目前我们前端、后台、算法、测试等技术岗位均有职位。简历投递:tech@trip.com,邮件标题:【姓名】-【携程平台研发中心】-【投递职位】
【作者简介】西杰,携程软件技术专家,关注前端技术及其生态,致力于提升前端开发效能及质量。
相关推荐
- NestJS入门教程系列一
-
介绍Nest(NestJS)是用于构建高效,可扩展的Node.js服务器端应用程序的框架。它使用渐进式JavaScript,内置并完全支持TypeScript(但开发人员仍然能够使用JavaScrip...
- 【推荐】一个网盘资源搜索与转存工具,支持移动端与PC端!
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍CloudSaver是一个基于Vue3和Express的网盘资源搜索与转存开源实用工具。它支持...
- Appium原理精讲
-
目前使用Appium新版本和旧版本的企业数目都很多,而两个版本的安装过程和api的使用又有较大的区别。但是无论表面上的东东如何变化,内部原理都是一样的。在这里我给大家介绍一下appium的核心,增进大...
- Kubernetes最小部署单元Pod
-
一、Kubernetes与Pod简介在当今云计算和容器化技术盛行的时代,Kubernetes已然成为容器编排领域的中流砥柱。它是一个开源的容器编排平台,由Google基于其内部使用的Bo...
- 最常用的四种跨域解决方案
-
前置知识什么是跨域?浏览器发送的请求地址(URL)与所在页面的地址不同(端口/协议/域名其一不同)。简言之,浏览器发出的请求url,与其所在页面的url不一样。此时,同源策略会让浏览器拒收服务器...
- Bolt.New —— 全栈AI Web自动编程
-
Bolt.New是由StackBlitz公司推出的,全栈AI工具,代码编辑、运行、部署,通通一站式搞定。它使用WebContainers技术,无需任何本地安装或配置,在浏览器中,就可以运行完整的No...
- Nodejs Express新手教程&高手进阶
-
NodejsExpress新手教程&高手进阶Express是一个NodeJS平台的框架,主要用于构于Web服务器项目。本文将通过示例介绍适合新手入门的Express基础使用,以及高手进阶知识,如:c...
- Express.js 创建Node.js Web应用
-
Express.js是一个基于Node.js的Web应用框架,框架的设计目的是构建应用的架构和简化应用的开发。框架会解决一些通用的问题,在Express.js中,Express框架会处理如:中间件、代...
- JavaScript 的 Express.js 功能及应用场景详解
-
Express.js是一个基于Node.js的轻量级Web应用框架,主要用于快速构建服务器端应用和API。它的核心功能包括以下关键点:1.路由管理URL路径与HTTP方法映射:通过...
- nodejs的express4文件下载
-
在nodejs的express框架中,下载变得非常简单,就一个方法,res.download()首先express命令行生成项目基本框架:不会的看这里:http://blog.csdn.net/zz...
- Express 系列:快速生成一个项目
-
系列预告本系列将以一个项目入手结合相关技术细节来带领大家一起学习Express这个基于Node.js的后端框架。本文首先将介绍:如何快速的生成一个具有一定结构的Express项目。Express项目结...
- nodejs的express自动生成项目框架
-
nodejs版本为:4.X,express版本为4.X1.全局安装2个模块express、express-generator在命令行输入:npminstall-gexpressnpminsta...
- express开发(一)简介与搭建
-
上周末去了趟上海书城,不愧是上海数得上号的书城,流行的科技书应有尽有,话不多说直接上图。最经典的C语言O(∩_∩)O最流行的java(づ ̄3 ̄)づ超酷的R语言/(ㄒoㄒ)/~~然而,身为一个坚定的前...
- Vue+Echarts可视化大屏系统后端框架搭建(附代码)
-
各位同学,大家好。上节课,前面我们讲解了Vue+Echarts前端部分的设计方法。这节课程,我们开始讲解使用Express进行后端设计的方法。01项目相关理论介绍什么是expressExpress是...
- Shopify电商API接口开发
-
Shopify电商API接口开发上线流程主要包括以下步骤。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎洽谈合作。前期准备-注册Shopify账号:在Shopify官网注册,用于后续开发测试...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- bootstrap框架 (43)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- express框架 (43)
- scrapy框架 (52)
- beego框架 (42)
- java框架spring (43)
- grpc框架 (55)
- 前端框架bootstrap (42)
- orm框架有哪些 (43)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)