当前位置: 首页 > news >正文

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 代码基础

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 流水线可以帮助团队更快地交付产品&#xff…...

【LeetCode题目详解】第九章 动态规划part01 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 (day38补)

本文章代码以c为例! 一、力扣第509题:斐波那契数 题目: 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是&#xff1a…...

图像处理 信号处理板 设计原理图: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查询和一对多、多对一的映射关系&#xff0c;而在这篇文章中荔枝将会梳理有关MyBatis动态SQL和MyBatis缓存的相关知识&#xff0c;同时也稍微了解了有关MyBatis中借助MAVEN中的插件管理来实现逆向工程。希望对需要的小伙伴有帮助哈哈…...

恒流电路的三种设计方案

作为硬件研发工程师相信对恒流电路不会陌生&#xff0c;本文介绍下三种恒流电路的原理图。 三极管恒流电路 三极管恒流电路 三极管的恒流电路&#xff0c;主要是利用Q2三极管的基级导通电压为0.6~0.7V这个特性&#xff1b;当Q2三极管导通&#xff0c;Q1三极管基级电压被拉低而…...

QT基础 关于QT延迟

目录 QT提供延时 1.自定义延时 2.使用QElapsedTimer 3.使用事件循环 4.跨平台延时 QT提供延时 这里提供四种方法&#xff1a; 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#设计模式之工厂模式,以及通过反射实现动态工厂。

题目如下&#xff1a; 假设你正在为一家汽车制造公司编写软件。公司生产多种类型的汽车&#xff0c;包括轿车、SUV和卡车。每种汽车都有不同的特点和功能。请设计一个工厂模式&#xff0c;用于创建不同类型的汽车对象。该工厂模式应具有以下要求&#xff1a;工厂类名为 CarFac…...

可拖拽编辑的流程图X6

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

神经网络与卷积神经网络

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

《Java极简设计模式》第05章:原型模式(Prototype)

作者&#xff1a;冰河 星球&#xff1a;http://m6z.cn/6aeFbs 博客&#xff1a;https://binghe.gitcode.host 文章汇总&#xff1a;https://binghe.gitcode.host/md/all/all.html 源码地址&#xff1a;https://github.com/binghe001/java-simple-design-patterns/tree/master/j…...

OceanBase 4.1解读:读写兼备的DBLink让数据共享“零距离”

梁长青&#xff0c;OceanBase 高级研发工程师&#xff0c;从事 SQL 执行引擎相关工作&#xff0c;目前主要负责 DBLink、单机引擎优化等方面工作。 沈大川&#xff0c;OceanBase 高级研发工程师&#xff0c;从事 SQL 执行引擎相关工作&#xff0c;曾参与 TPC-H 项目攻坚&#x…...

STM32的HAL库的定时器使用

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

Flink+Paimon多流拼接性能优化实战

目录 &#xff08;零&#xff09;本文简介 &#xff08;一&#xff09;背景 &#xff08;二&#xff09;探索梳理过程 &#xff08;三&#xff09;源码改造 &#xff08;四&#xff09;修改效果 1、JOB状态 2、Level5的dataFile总大小 3、数据延迟 &#xff08;五&…...

cocos 2.4 版本 设置物理引擎步长 解决帧数不一致的设备 物理表现不一致问题 设置帧刷新率

官网地址Cocos Creator 3.8 手册 - 2D 物理系统 官网好像写的不太对 下面是我自己运行好使的 PhysicsManager.openPhysicsSystem()var manager cc.director.getPhysicsManager();// 开启物理步长的设置manager.enabledAccumulator true;// cc.PhysicsManagercc.PhysicsManag…...

Spark及其生态简介

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

从Instagram到TikTok:利用社交媒体平台实现业务成功

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

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...

用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章

用 Rust 重写 Linux 内核模块实战&#xff1a;迈向安全内核的新篇章 ​​摘要&#xff1a;​​ 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言&#xff0c;受限于 C 语言本身的内存安全和并发安全问题&#xff0c;开发复杂模块极易引入难以…...