BIGO前端CICD平台

file

本文首发于:https://github.com/bigo-frontend/blog/ 欢迎关注、转载。

workbench

我是谁

BIGO前端CICD平台,是一个服务于前端团队的全研发周期管理平台,已经是我们团队日常都要使用的工具了。

该平台实现了一键创建项目、发布编排、新建迭代、checklist、快速发布、快速回滚等能力。

统一了前端研发规范、脚手架治理、升级流程管控,打通内部多个研发系统,简化了升级步骤。

image.png

技术栈:vue.js+element-ui+eggjs

新建项目:

image.png

迭代列表:
image.png

扩展任意流程

业务的需求是无限的。即使整合好了现有流程,业务还是会不断提出一些平台无力承载的需求。这时扩展任意流程的能力就非常必要。让业务自己开发相关需求,然后集成到 CICD 平台即可。

怎么集成呢?我们先看下业界的做法,基本都是定义一些基础的 job,然后在 pipeline 的配置文件中自由组装 job。当然不同系统的“pipeline”和“job”的用词可能不同,但都是原子任务和装配流水线的意思。感兴趣的可以进一步了解开源的 Jenkins,Gitlab,大厂自研的美团 Pipeline,字节的宇宙大系统等。

前端 CICD 平台的解决思路类似。我们不需要这么高的组装自由度,因为大多前端特有的流程,都被我们内化到平台中了。前端发布的 pipeline 在项目设置中配置,业务 job 使用 webhook 的形式接入。

界面截图如下:
webhook-fin

接入点目前只开放发布前和发布后。流程和接口规范可以参考下图:

webhook

建设特色能力

好了,现在平台已经整合好了现有流程,也能扩展任意流程了,是不是万事大吉了呢?如果是的话,那平台存在的意义就不大了。用不着做“前端”的 CICD 平台。平台针对前端的定制功能,是前端 CICD 平台重要的加分项。

checklist 功能

checklist 是一种成本低,效用高的工具。上线前,我们可以使用 checklist 来确认产品验收情况、外链情况、埋点情况、配置上线情况等,从而有效避免低级错误。不同业务线的 checklist 可以配置不一样。

验收观察功能

需求上线后,需要及时验收和观察。不是所有的问题都能通过自动监控发现,人工观测还是必要的。平台会在上线后定时推送观察提醒,减少因观察不及时导致的问题。同时,我们提供二维码生成器,方便开发者在端内打开。

产物域名扫描功能

在一个典型的前后端分离的项目中,有测试、灰度、生产三个环境。前端项目中包含一份代码,三份配置。产物打包时,测试环境产物是根据代码和测试环境配置生成的,它的 XHR 请求 url 应该是后端的测试域名。以此类推,灰度产物应该访问后端的灰度域名,生产产物应该访问后端的生产域名。

如果开发测试阶段,后端请求域名写在了代码,而非配置文件中呢?灰度和生产的产物,就会访问后端的测试域名了。这种错误在测试和灰度阶段可能无法发现,等上了生产,就会酿成事故。

针对这种情况,我们有一些 webpack 插件等工具可以使用。但是 webpack 插件起效需要重新安装发布,而存量项目有几百个,改造成本太大。所以需要前端 CICD 平台提供统一的产物域名扫描功能,用于兜底。

技术细节方面,我们在构建过程插入一行 shell 脚本,将特定后缀的产物都当做文本处理。通过正则规则,识别出疑似域名的字符串。字符串数组去重后,将它们发送到服务端统一汇总处理。处理结果通过公司的 IM 消息异步推送。

平台统一处理的好处是能统一管理域名黑白名单。而且能保证所有上线的项目都能有效覆盖到。

当然,平台针对前端的定制功能不止以上几点。有些实用功能是为了解决特定的历史遗留问题的,虽然对我们很重要,但不在这里展开讲述了。

这些前端特色功能规范了流程,降低了线上事故率,提升了特定场景的效率。

写在最后

CICD 平台是通过提升研发效率,间接产生业务价值的平台。我们不会像一线大厂那样不计成本地卷效率,而是在人力投入与团队提效之间做了平衡。一年半以来,间断投入 1.5 人力,才建设成为今天的前端 CICD 平台。

希望我们的历程,能给正在建设平台的你一点参考。

欢迎大家留言讨论,祝工作顺利、生活愉快!

我是bigo前端,下期见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/17585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 使用vuex 在app上能获取到state,小程序获取不到

1. 在根目录下新建store目录, 在store目录下创建index.js定义状态值import Vue from vue; import Vuex from Vuex; import Vuex from vuex; Vue.use(Vuex);const store new Vuex.Store({ state: { login: false, token: , avatarUrl: , userName: }, mutations: { lo…

JavaWeb Servelt原理

Servlet简介: Servlet的主要工作:处理客户端请求,生成动态响应,通常用于扩展基于HTTP协议的Web服务器。 Servlet技术是Java EE规范的组成部分,代表了服务器端的Java程序,主要负责处理来自客户端的Web请求,…

国内信创web中间件生态

国内信创web中间件生态 东方通 官网https://www.tongtech.com/pctype/25.html 宝蓝德 官网https://www.bessystem.com/product/0ad9b8c4d6af462b8d15723a5f25a87d/info?p101 金蝶天燕 官网 https://www.apusic.com/list-117.html 中创 官网http://www.inforbus.com…

数据库数据恢复—空间不足导致sqlserver数据库连接失效的数据恢复案例

数据库数据恢复环境: 某品牌r520服务器,服务器中有7块SAS硬盘,这7块硬盘组建了一组2盘raid1阵列和一组5盘raid5阵列,raid1阵列存储空间安装操作系统,raid5阵列存储空间存放数据。服务器上部署sql server数据库&#xf…

野外作战武器操作3D模拟实操仿真训练以便老兵能适应不同的训练需求

强国必须强军,我国在军事方面的投入持续加大,自然在军事武器培训方面不容忽视,在军事领域,3D模拟展示不仅提升了军事训练的效率,还为我们提供了更加直观、真实的武器体验。 首先,3D军事武器模拟展示能够提供…

Nacos 2.x 系列【6】持久化

文章目录 1. 前言2. Derby3. Mysql3.1 初始化脚本3.2 服务端配置3.3 验证 4. 数据源插件 1. 前言 Nacos中的用户、租户、服务配置等信息,需要使用关系型数据库进行存储,在实际开发中,可能还会面临各种数据库适配问题。 2. Derby Derby是Ap…

人工智能在脉搏分析中的应用

人工智能在脉搏分析中的应用正在逐步深化,其凭借强大的数据处理能力和模式识别技术,为脉搏波信号的处理和分析带来了革命性的变化。以下是人工智能在脉搏分析中的几个主要应用: 脉搏波信号的采集与处理: 脉搏波信号作为生物医学信…

【并发小知识】

计算机五大组成部分 控制器 运算器 存储器 输入设备 输出设备 计算机的核心真正干活的是CPU(控制器运算器中央处理器) 程序要想计算机运行,它的代码必须要先由硬盘读到内存,之后cpu取指再执行 操作系统发展史 穿孔卡片处理…

学习java第七十九天

AOP有两种实现方式:静态代理和动态代理。 静态代理 静态代理:代理类在编译阶段生成,在编译阶段将通知织入Java字节码中,也称编译时增强。AspectJ使用的是静态代理。 缺点:代理对象需要与目标对象实现一样的接口&#x…

Android Studio 中gradle的bin和all区别

1.在android studio中设置安装gradle时,真各种版本看到眼花缭乱,还有疑惑gradle-*.*-all.zip与gradle-*.*-bin.zip的区别是什么。下面解压如下: bin: all: 其实,用bin就可以了,all文件就是多了docs(文档)和src(源码)两…

选择源代码防泄漏方案需要考虑哪些因素?

选择加密软件是确保公司数据安全和保护知识产权的重要决策。 选择合适的加密软件:关键因素与推荐方案 一、稳定性:加密软件的核心 稳定性是评估加密软件的首要因素,它直接关系到企业数据的安全性和业务的连续性。 避免文件损坏&#xff1…

Java基础——Optional

Optional 类主要解决的问题是臭名昭著的空指针异常NPE(NullPointerException) 在 Java 8 之前,任何访问对象方法或属性的调用都可能导致 NullPointerException: String isocode user.getAddress().getCountry().getIsocode().to…

Linux网络-Socket套接字_Windows与Linux端双平台基于Udp传输协议进行多线程跨平台的服务器与客户端网络通信的简易聊天室实现

文章目录 一、Socket套接字二、socket 常见API1. int socket(int domain, int type, int protocol);2. int bind(int socket, const struct sockaddr *address, socklen_t address_len);struct sockaddr 3. ssize_t recvfrom(int socket, void *restrict buffer, size_t length…

go defer

type _defer struct {siz int32started boolopenDefer boolsp uintptrpc uintptrfn *funcval_panic *_paniclink *_defer }runtime._defer 结构体是延迟调用链表上的一个元素,所有的结构体都会通过 link 字段串联成链表。 只…

【全开源】酒店订单管理系统源码(FastAdmin+ThinkPHP)

一款基于FastAdminThinkPHP开发的旨在为民宿、酒店、宾馆等提供房态、订单、财务、客史等数据化、信息化的智慧管理工具,实现一站式订房管理,帮助酒店、民宿、宾馆提升管理效率,降低管理成本,提升行业竞争力。 打造高效、便捷的酒…

Generate Anything Anywhere in Any Scene #论文阅读

URL https://arxiv.org/pdf/2306.17154 TD;DR 2023 年 6 月 Wisconsin 的文章。围绕 ip 保持做的扩展任务,核心目标是对指定 ip 可以生成任意大小的(指定 ip)、任意背景的图片,同时可以通过 bbox 控制物体位置和多物体生成。主…

SOLIDWORKS教育版代理商应该如何选择?

SOLIDWORKS作为目前流行的三维设计软件在工程设计,制造和建筑中有着广泛的应用前景。教育版SOLIDWORKS软件是学生及教育机构学习教学的理想平台。 下面介绍几个挑选SOLIDWORKS教育版代理的关键要素: 1、专业知识与经验:代理商应掌握SOLIDWORKS等软件的丰…

SCP‘s Story(2)

杰克古迪知道很多事情,但不包括内疚和痛苦。然而,他感觉到了,就像苦艾在他心里扎了根。 风把树叶从树上刮下来,把树叶吹得快要断了,也把他吹得差不多了。空气中弥漫着一种病态的感觉。天空中没有鸟;天空看起来太不友好…

ResNet残差网络的学习【概念+翻译】

基于何明凯前辈论文的学习 1.主要内容(背景) 1、首先提了一个base:神经网络的深度越深,越难以训练。 2、原因:因为随着神经网络层数的增加,通常会遇到梯度消失或梯度爆炸等问题,这会导致训练变…

2024 全新 Javascript 面试题目进阶篇

昨天,咱们介绍了关于Javascript面试篇的基础篇。今天,让我们来看看进阶篇都有什么。 12. 闭包是什么?闭包的使用场景有哪些? 闭包 是一种特性,它使得函数能够捕获其定义时的环境(或者说保留对外部作用域变…