PingCode DevOps 团队:企业CICD流水线可能会遇到的问题及解法
CICD 流水线是指一系列自动化的构建、测试和部署步骤,用于将应用程序从开发到生产环境的过程。在 CICD 流水线中,每个步骤都是自动化的,并且在完成后会触发下一个步骤的执行。
CICD 的价值
CICD 流水线可以帮助团队更快地交付产品,减少手动错误,并提高软件质量。通过自动化构建、测试和部署过程,团队可以更快地检测和修复错误,并更快地将新功能推向市场。
CICD 工具链
通常由8个部分组成
- 源代码管理:用于存储和管理应用程序代码的工具,代码管理是 CICD 工具链的基础,提供了代码的版本控制、协作和管理功能,例如 GitLab、GitHub、Bitbucket 等。
- 构建工具:将源代码编译成可执行文件或软件包的工具,例如 Maven、Gradle、Webpack 等。
- 测试工具:自动化执行测试用例并生成测试报告的工具,例如 JUnit、Selenium 等。
- 镜像构建:构建和管理容器镜像的工具,例如 Docker、Kaniko 等。
- 制品管理:存放业务镜像的仓库,在应用部署时需要拉取。例如:Harbor、Registry、云厂商私有仓库等。
- 监控工具:用于监控流水线运行过程中的状态,如资源占用、负载情况,为流水线性能优化提供数据基础。例如:Prometheus、Grafana、EFK 。
- 部署工具:用于将代码构建完成的制品发布到目标环境中,例如 Jenkins、GitLab CI、Travis CI 等。
- 自动化工具:用于代替分散脚本执行各种自动化类操作,使执行流程更加清晰有序。例如:Ansible、Puppet 等。
CICD 的演进历史
从CI/CD发展历史来说可以大致分为以下几个阶段:
1、人工发布阶段:开发或运维人员通常需要手动构建和部署应用程序。这种方法非常耗时且容易出错,因为它需要手动执行多个步骤,并且容易遗漏某些步骤。
2、脚本发布阶段:我们称之为“半自动化”阶段,人工手动操作的步骤严重困扰了开发和运维人员,过于耗时耗力以及手动执行具有一定的不可靠性存在。于是开始寻求用脚本来替代一部分人工操作,如 shell、python 脚本,但长此以往依然消耗开发运维人员大量时间成本,发布不够规范依然在持续
3、自动化发布阶段: 为了进一步规范发布流程,规避人为操作所带来的风险,提高发布效率,多数公司开始构建自己的 CI/CD 发布系统,这样的好处是无需人工介入,脚本内容不易被篡改。
4、智能化发布阶段:人工智能大数据时代,一些优秀的公司已经开启智能化 CI/CD 系统,通过引入数据分析、智能预测手段,进一步优化发布流程、提高发布效率。
在这四个阶段中,每个阶段都是在前一个阶段的基础上发展而来的,并且每个阶段都可以提供更高效、更可靠和更安全的软件交付过程。
进入自动化时代以后,CI/CD 效率虽得到了大幅提升,但架构的维护过程中依然会遇到各种各样的问题需要解决,下面我将介绍大多数企业在整个维护过程中可能会遇到的流水线问题以及优化方案。
企业CICD流水线可能会遇到的问题
Jenkins 当属业内持续集成老大哥,有着丰富的插件,适用于大型流水线方案的建设以及大多数场景,受到不少企业用户的追捧,所以本文主要基于 Jenkins 建设的流水线方案为核心从运维角度来讲述可能存在的瓶颈及优化点。
1、Jenkins Master 与 Worker 共用宿主机带来的失联问题
有些企业为了方便部署以及尽可能的节省服务器资源选择 Jenkins Master 与 Worker 共用宿主机,当流水线数量较少或 stage 耗费资源较少时无明显感知。随着项目越来越多,流水线数量的也随之增多,这种架构开始出现瓶颈,多个 Job 并行构建占用资源较多导致系统负载增高,Master 与Worker 之间的通信也会受到干扰,重连超时导致 Job 最终失败。
建议优化方案:
- Jenkins Master 与 Worker 分离部署,可以允许Worker有短暂的高负载波动,不至于拖垮所有流水线
- Jenkins Master 优化连接时间相关参数
- Worker 主机负载高优化
- kubelet 配置系统资源预留,保障系统进程的稳定性
- kubelet 限制 maxPods 来硬性控制并行构建数,超出限制会进入队列等待
- Jenkinsfile 中 PodTemplate 部分容器增加 resourceLimitCpu 参数限制最大使用CPU额度
- 这一点是防止某个Pod无限制使用资源导致卡死
2、代码依赖缓存拉取的问题
默认走官方源拉取依赖多多少少会遇到网络稳定性问题,导致Job的构建成功率降低,影响产品交付效率。
推荐优化方案:
- maven
- 推荐 nexus 私服
- npm
- 使用淘宝源
- 使用阿里云私有仓库,可以有效解决私有包的权限问题
- 缓存目录映射宿主机实现持久化,减少每次拉取的网络消耗
3、Docker 构建业务镜像体积大,耗时长
对于小型项目优化的必要性不大,大型项目的弊端较明显。
建议优化方案:
- 养成良好编写 Dockerfile 的习惯,合并多 RUN 步骤,减少 layer 层级
- 注意 ADD/COPY 的用法,禁止使用先 COPY 后解压操作,对于大型碎文件目录建议归档为 tar 包后使用 ADD 上传(大量碎文件会影响性能)
- Dockerfile 使用多阶段构建,最终镜像打包只引用构建产物
- 使用 .dockerignore 来忽略 docker build 时不需要加载的文件或目录,节省构建时间
- 基础镜像的选型很重要,根据所属项目依赖来确定满足需求最小基础镜像
4、镜像推送拉取慢
包含运行时镜像、打包基础镜像、业务镜像等
建议优化方案:
- 无论是公共镜像还是私有镜像尽量都使用私有仓库走内网传输,避免使用官方仓库。
- 常见私有仓库:
- 阿里云云效私有仓库
- AWS ECR
- Harbor
- Registry
- 等…
- 常见私有仓库:
- 流水线宿主机本地长期保留常用镜像
5、代码打 Tag 后 Jenkins 拉取版本有误
开发打 Tag 后触发 Jenkins 流水线,流水线访问仓储获取 Tag 代码,但偶尔会遇到流水线获取到的Tag与预期不符,引发网站访问报错
建议优化方案:
- 这可能是一个 bug,偶然出现
- 可以使用独立部署 webhook 服务来主动触发 Jenkins 的方式彻底解决
6、Jenkinsfile 文件多,管理难
一般 Jenkinsfile、Dockerfile 等文件都会存在在业务仓储内,如果企业仓储较多,而 Jenkinsfile 又不能共用的情况下就会面临统一管理的问题。
建议优化方案:
- 简化版
- 只需要将各仓储相关文件转移至统一仓储,Jenkins 先拉取管理仓储,再在 stage 中拉取业务代码来实现,不必合并所有Jenkins的内容
- 优势:
- 不依赖额外插件,属于轻量型
- 与业务解耦
- 劣势:
- 统一修改较耗时
- 复杂版(推荐,但不建议代码逻辑过于复杂化)
- 基于 Global Pipeline Libraries 插件做代码整合,通用部分提取到单独文件复用
- 官方文档: https://www.jenkins.io/doc/book/pipeline/shared-libraries/
- 优势:
- 复用部分一处修改生效全局,减少代码量
- 节省一定的时间成本
- 劣势:
- 复用部分的修改需要慎重,尽量使用判断
- 需要一定的 Groovy 代码基础
- 基于 Global Pipeline Libraries 插件做代码整合,通用部分提取到单独文件复用
7、多条流水线并行构建的问题
当 Worker 节点为固定时,资源少会导致流水线排队,整体效率低,资源多可以满足高峰期的并行构建需求,但空闲时间又会浪费成本。
建议优化方案:
- 使用云厂商的 Serverless 产品按需付费,只对Pod资源限制
- 使用云厂商的 Autoscheduling 功能来实现主机级别的扩缩容(需要依赖云厂商K8S产品)
- 编写工具根据业务实际场景实现动态调整Worker节点的配置大小
8、流水线拥堵问题,与第7条不冲突
上一条提到的并行构建指的是正常的构建需求,是建立在流水线拥堵优化之后的结论之上,如:单个 CD Job 的并行构建显然是不合理的,却需要多耗费几倍的资源。
建议优化方案:
- CD 流水线开启「不允许并行构建」以及「Abort previous builds」,每个Job只保留最新的构建进程
- CI 流水线需要测试每个 PR 的代码,所以可以开启「不允许并行构建」,无需开启「Abort previous builds」
- 当系统资源较充足时, CI 可以关闭 「不允许并行构建」,但需要注意的是共用缓存映射所带来的潜在冲突问题
- 主机负载高可能导致 Job Pod 运行状态失联,未及时被 K8S 回收,建议设置定时检测脚本来按需清理
9、Jenkins Master磁盘占用率高、运行缓慢卡顿
大概有几方面原因:构建日志保留过多、服务日志未定时清理、主机资源匮乏、JVM 限制参数不合理等。
建议优化方案:
- 按构建天数或个数进行日志保留
- 服务日志设置定时清理或调整日志级别
- 根据监控判断资源合理需求
- JVM 参数配置调整测试,得出合理值
- 对于分支构建的 Job 关闭 Tag 拉取,以及开启浅克隆
10、Jenkins 批量新增、修改 Job 信息麻烦
少量的流水线直接通过界面编辑即可,几十上百条甚至更多以后修改配置会很麻烦。
建议优化方案:
- 使用 Python、Go 等语言编写统一管理工具
- 合并可能通用的流水线,如:单条流水线发布多个项目,是一对多的关系
总结:
以上分享的是较常见可能影响流水线交付效率的因素以及建议解决方案,PingCode DevOps 团队充分借鉴了以上部分方案进行专项优化,流水线交付效率得到了质的提升。CICD 流水线优化是一个经久不衰的话题,我相信流水线的高效稳定和便于管理是每个企业共同追求的目标,实现形式可以是多种多样,适合自身场景的方案就是好的方案,现阶段我们依然在为进一步优化流水线做努力,追求极致,没有最好,只有更好!
相关文章:
PingCode DevOps 团队:企业CICD流水线可能会遇到的问题及解法
CICD 流水线是指一系列自动化的构建、测试和部署步骤,用于将应用程序从开发到生产环境的过程。在 CICD 流水线中,每个步骤都是自动化的,并且在完成后会触发下一个步骤的执行。 CICD 的价值 CICD 流水线可以帮助团队更快地交付产品ÿ…...

【LeetCode题目详解】第九章 动态规划part01 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 (day38补)
本文章代码以c为例! 一、力扣第509题:斐波那契数 题目: 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:…...

图像处理 信号处理板 设计原理图:367-基于zynq XC7Z100 FMC接口通用计算平台
基于zynq XC7Z100 FMC接口通用计算平台 一、板卡概述 板卡由SoC XC7Z100-2FFG900I芯片来完成卡主控及数字信号处理,XC7Z100内部集成了两个ARM Cortex-A9核和一个kintex 7的FPGA,通过PL端FPGA扩展FMC、光纤、IO等接口,PS端ARM扩展网络、USB、R…...
PHP中header()的七种用法
我们在实际开发中经常使用header()实现一些功能,这篇文章介绍关于header()的7中用法,需要的伙伴的开参考一下。 PHP header()的7中用法: 1、跳转页面 可以使用header()实现跳转页面功能。 header(Location:.$url); // $url 跳转页面的地址…...

臻图信息以数字孪生技术推动智慧小区数字化建设
伴随着智慧城市建设进程的加速发展,加速传统小区的管理与服务向智能化升级转型。运用智慧化的管理和服务,利用信息技术和物联网等技术手段,将传统的居住区域与智能设备相结合,实现楼宇、社区设施、服务管理的数字化、网络化、智能…...

15.CSS发光按钮的悬停特效
效果 源码 <!DOCTYPE html> <html> <head><title>CSS Modern Button</title><link rel="stylesheet" type="text/css" href="style.css"> </head> <body><a href="#" style=&quo…...
MyBatis —— 动态SQL和缓存
前言 在上一篇文章中荔枝梳理了一些特殊的SQL查询和一对多、多对一的映射关系,而在这篇文章中荔枝将会梳理有关MyBatis动态SQL和MyBatis缓存的相关知识,同时也稍微了解了有关MyBatis中借助MAVEN中的插件管理来实现逆向工程。希望对需要的小伙伴有帮助哈哈…...

恒流电路的三种设计方案
作为硬件研发工程师相信对恒流电路不会陌生,本文介绍下三种恒流电路的原理图。 三极管恒流电路 三极管恒流电路 三极管的恒流电路,主要是利用Q2三极管的基级导通电压为0.6~0.7V这个特性;当Q2三极管导通,Q1三极管基级电压被拉低而…...
QT基础 关于QT延迟
目录 QT提供延时 1.自定义延时 2.使用QElapsedTimer 3.使用事件循环 4.跨平台延时 QT提供延时 这里提供四种方法: 1、多线程程序使用QThread::sleep()或者QThread::msleep()或QThread::usleep()或QThread::wait()进行延时处理。 Sleep不会释放对象锁&#x…...

LLM - LLaMA-2 获取文本向量并计算 Cos 相似度
目录 一.引言 二.获取文本向量 1.hidden_states 与 last_hidden_states ◆ hidden_states ◆ last_hidden_states 2.LLaMA-2 获取 hidden_states ◆ model config ◆ get Embedding 三.获取向量 Cos 相似度 1.向量选择 2.Cos 相似度 3.BERT-whitening 特征白化 …...
【创建型设计模式】C#设计模式之工厂模式,以及通过反射实现动态工厂。
题目如下: 假设你正在为一家汽车制造公司编写软件。公司生产多种类型的汽车,包括轿车、SUV和卡车。每种汽车都有不同的特点和功能。请设计一个工厂模式,用于创建不同类型的汽车对象。该工厂模式应具有以下要求:工厂类名为 CarFac…...

可拖拽编辑的流程图X6
先上图 //index.html,有时候可能加载失败,那就再找一个别的cdn 或者npm下载,如果npm下载, //那么需要全局引入或者局部引入,代码里面写法也会不同,详细的可以看示例<script src"https://cdn.jsdeli…...

神经网络与卷积神经网络
全连接神经网络 概念及应用场景 全连接神经网络是一种深度学习模型,也被称为多层感知机(MLP)。它由多个神经元组成的层级结构,每个神经元都与前一层的所有神经元相连,它们之间的连接权重是可训练的。每个神经元都计算…...

《Java极简设计模式》第05章:原型模式(Prototype)
作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 源码地址:https://github.com/binghe001/java-simple-design-patterns/tree/master/j…...

OceanBase 4.1解读:读写兼备的DBLink让数据共享“零距离”
梁长青,OceanBase 高级研发工程师,从事 SQL 执行引擎相关工作,目前主要负责 DBLink、单机引擎优化等方面工作。 沈大川,OceanBase 高级研发工程师,从事 SQL 执行引擎相关工作,曾参与 TPC-H 项目攻坚&#x…...

STM32的HAL库的定时器使用
用HAL库老是忘记了定时器中断怎么配置,该调用哪个回调函数。今天记录一下,下次再忘了就来翻一下。 系统的时钟配置,定时器的时钟是84MHz 这里定时器时钟是84M,分频是8400后,时基就是1/10000s,即0.1ms。Per…...

Flink+Paimon多流拼接性能优化实战
目录 (零)本文简介 (一)背景 (二)探索梳理过程 (三)源码改造 (四)修改效果 1、JOB状态 2、Level5的dataFile总大小 3、数据延迟 (五&…...

cocos 2.4 版本 设置物理引擎步长 解决帧数不一致的设备 物理表现不一致问题 设置帧刷新率
官网地址Cocos Creator 3.8 手册 - 2D 物理系统 官网好像写的不太对 下面是我自己运行好使的 PhysicsManager.openPhysicsSystem()var manager cc.director.getPhysicsManager();// 开启物理步长的设置manager.enabledAccumulator true;// cc.PhysicsManagercc.PhysicsManag…...

Spark及其生态简介
一、Spark简介 Spark 是一个用来实现快速而通用的集群计算的平台,官网上的解释是:Apache Spark™是用于大规模数据处理的统一分析引擎。 Spark 适用于各种各样原先需要多种不同的分布式平台的场景,包括批处理、迭代算法、交互式查询、流处理…...

从Instagram到TikTok:利用社交媒体平台实现业务成功
自 2000年代初成立和随后兴起以来,社交媒体一直被大大小小的品牌用作高度针对性的营销工具,自 Facebook推出近二十年以来,这些网站继续彻底改变企业处理广告的方式。 在这篇博文中,我们将讨论订阅企业应该如何从整体上对待社交媒…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...