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前端,下期见。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

互联网应用主流框架整合之数据库事务管理

在互联网系统中同时运行着成千上百个线程是十分常见的事情,尤其当一个热门出现时,用户几乎同时打开手机、电脑、平板灯设备进行访问,这样就会导致数据库处在一个多事务访问的环境中,从而引发数据丢失或者数据不一致的现象&#xf…

Java GC问题排查的一些个人总结和问题复盘

个人博客 Java GC问题排查的一些个人总结和问题复盘 | iwts’s blog 是否存在GC问题判断指标 有的比较明显,比如发布上线后内存直接就起飞了,这种也是比较好排查的,也是最多的。如果单纯从优化角度,看当前应用是否需要优化&…

Mowgli用于配对多组学整合

对同一组细胞的多个分子层进行分析逐渐流行。越来越需要能够联合分析这些数据的多视图学习方法。Mowgli是一种支持配对多组学数据的整合方法。值得注意的是,Mowgli将非负矩阵分解和最优传输相结合,同时提高了非负矩阵分解的聚类性能和可解释性。作者将Mo…

解锁数据的力量:Navicat 17 新特性和亮点

解锁数据的力量:Navicat 17 新特性和亮点 大家好,我是猫头虎。今天我要为大家介绍 Navicat 17 的新特性和亮点。Navicat 是一款专业的数据库管理工具,支持多种数据库类型,包括 MySQL、Oracle、SQL Server、PostgreSQL、MariaDB、…

5月28号总结

刷题记录 1.A. Phone Desktop 输入: 11 1 1 7 2 12 4 0 3 1 0 8 1 0 0 2 0 15 0 8 2 0 9 输出: 1 1 2 2 1 1 0 1 1 2 5 题意:题目给我们1x1和2x2的图标个数,让我们求最少需要多少个5x3的屏幕。 思路:当只看2x2的图…

新建一个esri_sde_gists的服务

需求 新建一个esri_sde_gists的服务 步骤: 需要拷贝ora11gexe目标为新的目录,例如ora11gexe_gists 运行drivers找到etc下面的services文件,添加端口5152: 检查sde的library并创建: CREATE or REPLACE LIBRARY ST_S…

elastich运维

Elastichsearch是一种高度可扩展的开源全文搜索和分析引擎,可以用来实现快速、高效的数据检索。 集群规划与部署:首先需要根据业务需求规划Elastichsearch集群的节点数量和角色(如主节点、副本节点、协调节点等)。在部署时&#x…

@EnableConfigurationProperties源码解析

前言 EnableConfigurationProperties注解的使用,请移步相关博文:EnableConfigurationProperties注解使用 前置知识 Import注解作用简述 注入的类一般继承 ImportSelector 或者 ImportBeanDefinitionRegistrar 接口 继承ImportSelector接口&#xff…

AIGC 人工智能全能实操课:用AI工作,提升效率,帮你赚钱(33节课)

课程目录 2-AIGC介绍先导1.mp4 3-第一节-chatGPT介绍与原理1.mp4 4-第二节-CHATGPT提示词的三个原则_1.mp4 5-第三节-chatgpt提示词的7个步骤1.mp4 6-第四节-chatgpt提示词的4个技巧1.mp4 7-第五节-chatgpt制作分镜案例分享1.mp4 8-第六节-chatgpt提示词生成工具1.mp4 …

最短路Dijkstra求最短路(讲解 + 模板 + 例题)

Dijkstra算法 Dijkstra是基于贪心思想的单源最短路算法; 变量定义 : const int N 510; const int INF 1e9 10 ; struct edge{int v , w ; // 表示出边和边权 }; vector<edge> e[N] ; int d[N] ; // dis[u]存u到源点s的最短距离 int vis[N] ;// vis[u]标记u是否…

K8s集群调度续章

目录 一、污点&#xff08;Taint&#xff09; 1、污点&#xff08;Taint&#xff09; 2、污点组成格式 3、当前taint effect支持如下三个选项&#xff1a; 4、查看node节点上的污点 5、设置污点 6、清除污点 7、示例一 查看pod状态&#xff0c;模拟驱逐node02上的pod …

选择快充时代下的理想充电器与电压诱骗芯片PW6606

随着科技的不断进步&#xff0c;我们的电子设备对于充电速度和效率的要求越来越高。在快充技术迅猛发展的今天&#xff0c;了解不同类型的充电器及其对应的快充协议&#xff0c;以及如何选择适合的电压诱骗芯片&#xff0c;对于提升充电体验和保障设备安全显得尤为重要。 一、快…

「代码厨房大揭秘:Python性能优化的烹饪秘籍!」

哈喽&#xff0c;我是阿佑&#xff0c;上篇咱们讲了 Socket 编程 —— 探索Python Socket编程&#xff0c;赋予你的网络应用隐形斗篷般的超能力&#xff01;从基础到实战&#xff0c;构建安全的聊天室和HTTP服务器&#xff0c;成为网络世界的守护者。加入我们&#xff0c;一起揭…

什么情况下JVM内存中的一个对象会被垃圾回收?

什么情况下JVM内存中的一个对象会被垃圾回收? 1、什么时候会触发垃圾回收?2、被哪些变量引用的对象是不能回收的?3、Java中对象不同的引用类型4、finalize()方法的作用1、什么时候会触发垃圾回收? 平时我们系统运行创建的对象都是优先分配在新生代里的,如图: 然后如果…

【JVM底层原理,JVM架构详解】

1. JVM简介 1.1 什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 主流虚拟机: 虚拟机名称介绍HotSpotOracle/Sun JDK和OpenJDK都使用HotSPo…

【算法】位运算算法——丢失的数字

题解&#xff1a;丢失的数字(位运算算法) 目录 1.题目2.题解3.位运算异或4.总结 1.题目 题目链接&#xff1a;LINK 2.题解 哈希数组查漏高斯求和排序位运算异或… 3.位运算异或 class Solution { public:int missingNumber(vector<int>& nums) {int ret 0;for…

单调栈--

1.每日温度 那么单调栈的原理是什么呢&#xff1f;为什么时间复杂度是O(n)就可以找到每一个元素的右边第一个比它大的元素位置呢&#xff1f; 单调栈的本质是空间换时间&#xff0c;因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素&#xff0c;优点是整个数…

使用大模型LLM实现销售AI

想象一个场景&#xff0c;客户通过聊天窗口咨询一款产品。销售AI首先使用LLM解析客户的问题&#xff0c;然后通过智能代理查询数据库获取产品详细信息&#xff0c;并以自然而友好的方式回应客户。 在对话过程中&#xff0c;AI可以评估客户的兴趣&#xff0c;并主动提供促销信息…

【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)

&#x1f50d;目的 允许派生组件从与派生类型兼容的基本组件继承某些功能。 &#x1f50d;解释 真实世界例子 对于正在策划赛事的综合格斗推广活动来说&#xff0c;确保在相同重量级的运动员之间组织比赛至关重要。这样可以防止体型明显不同的拳手之间的不匹配&#xff0c;例如…

Linux——多线程(一)

一、线程的概念 1.1线程概念 教材中的概念&#xff1a; (有问题?) 线程是进程内部的一个执行分支&#xff0c;线程是CPU调度的基本单位 之前我们讲的进程&#xff1a; 加载到内存中的程序&#x…