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 流水线优化是一个经久不衰的话题,我相信流水线的高效稳定和便于管理是每个企业共同追求的目标,实现形式可以是多种多样,适合自身场景的方案就是好的方案,现阶段我们依然在为进一步优化流水线做努力,追求极致,没有最好,只有更好!

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

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

相关文章

16 Linux之JavaEE定制篇-搭建JavaEE环境

16 Linux之JavaEE定制篇-搭建JavaEE环境 文章目录 16 Linux之JavaEE定制篇-搭建JavaEE环境16.1 概述16.2 安装JDK16.3 安装tomcat16.4 安装idea2020*16.5 安装mysql5.7 学习视频来自于B站【小白入门 通俗易懂】2021韩顺平 一周学会Linux。可能会用到的资料有如下所示&#xff0…

Windows右键添加用 VSCODE 打开

1.安装VSCODE时 安装时会有个选项来添加,如下: ①将“通过code 打开“操作添加到windows资源管理器文件上下文菜单 ②将“通过code 打开”操作添加到windows资源管理器目录上下文菜单 说明:①②勾选上,可以对文件,目…

XSS 攻击是什么?怎么验证是否有XSS攻击漏洞?

XSS(跨站脚本,Cross-Site Scripting)攻击是一种网络攻击,攻击者利用网站漏洞将恶意脚本注入用户的浏览器,从而在用户浏览网页时执行恶意代码。这种攻击可能造成用户敏感信息泄露、钓鱼、欺诈等安全问题。 验证是否有 …

C#,《小白学程序》第八课:列表(List)应用之二“编制高铁列车时刻表”

1 文本格式 /// <summary> /// 车站信息类 class /// </summary> public class Station { /// <summary> /// 编号 /// </summary> public int Id { get; set; } 0; /// <summary> /// 车站名 /// </summary&g…

算法训练第五十二天

718. 最长重复子数组 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int findLength(vector<int>& nums1, vector<int>& nums2) {vector<vector<int>> dp(nums1.size() 1,vector<int>(nums2.size() 1,0));int res…

Windows docker desktop 基于HyperV的镜像文件迁移到D盘

Docker desktop的HyperV镜像文件&#xff0c;默认是在C盘下 C:\ProgramData\DockerDesktop\vm-data\DockerDesktop.vhdx如果部署的软件较多&#xff0c;文件较大&#xff0c;或者产生日志&#xff0c;甚至数据等&#xff0c;这将会使此文件越来越大&#xff0c;容易导致C盘空间…

java 浅谈ThreadLocal底层源码(通俗易懂)

目录 一、ThreadLocal类基本介绍 1.概述 : 2.作用及特定 : 二、ThreadLocal类源码解读 1.代码准备 : 1.1 图示 1.2 数据对象 1.3 测试类 1.4 运行测试 2.源码分析 : 2.1 set方法解读 2.2 get方法解读 一、ThreadLocal类基本介绍 1.概述 : (1) ThreadLocal&#xff0c;本…

[机缘参悟-103] :IT人关于接纳的思考与感悟

目录 前言&#xff1a; 一、接纳 1.1 什么是接纳 1.2 对接纳的误解 1.3 接纳的含义 1.4 "存在即合理" VS 接纳 1.5 接纳 VS 躺平 VS 随遇而安 1.6 为什么现实总是那么不尽人意 1.7 现实世界的多样性 1.8 接纳与认命 1.9 不接纳的表现 前言&#xff1a; …

python3.11教程1:python基础语法、程序控制、函数

文章目录 一、Python简介1.1 为什么学习python1.2 python安装与配置1.3 python解释器1.4 命令行参数1.4.1 sys.argv变量1.4.2 -c和-m选项 1.5 解释器的运行环境1.5.1 编码格式1.5.2 编码声明 二、Python基础语法2.1 行结构2.2 变量&#xff08;标识符&#xff09;2.3 字节串2.4…

神经网络NLP基础 循环神经网络 LSTM

用的时候&#xff0c;只关心token的输入&#xff0c;以及hidden state就好了 sequence的length是多少&#xff0c;lstm的cell的数量就是多少 LSTM BI-LSTM stacked lstm GRU 实现

【计算机网络】TCP 的三次握手和四次挥手

TCP 是面向连接的&#xff0c;面向连接就是数据通讯的时候需要进行三次握手&#xff0c;断开通讯的时候需要进行四次挥手。 1.seq(sequence number)&#xff0c;序列号&#xff0c;随机生成的 2.ack(acknowledgement number)&#xff0c;确认号&#xff0c;ackseq1 3.ACK(ackno…

Linux安装JenkinsCLI

项目简介安装目录 mkdir -p /opt/jenkinscli && cd /opt/jenkinscli JenkinsCLI下载 wget http://<your-jenkins-server>/jnlpJars/jenkins-cli.jar # <your-jenkins-server> 替换为你的 Jenkins 服务器地址 JenkinsCLI授权 Dashboard-->Configure Glob…

希尔贝壳入选“北京市人工智能大模型高质量数据集发布(第二批)”合作企业

8月28日&#xff0c;2023中国国际服务贸易交易会通用人工智能算力论坛在石景山区举办。论坛上&#xff0c;北京市人工智能大模型高质量数据集&#xff08;第二批&#xff09;发布&#xff0c;其中包含北京希尔贝壳科技有限公司的“大模型方言口语语音数据集”和“智能会议场景高…

评估安全 Wi-Fi 接入:Cisco ISE、Aruba、Portnox 和 Foxpass

在当今不断变化的数字环境中&#xff0c;对 Wi-Fi 网络进行强大访问控制的需求从未像现在这样重要。各组织一直在寻找能够为其用户提供无缝而安全的体验的解决方案。 在本博客中&#xff0c;我们将深入探讨保护 Wi-Fi&#xff08;和有线&#xff09;网络的四种领先解决方案——…

数据库(一)

数据库 1.为什么要使用数据库 如果要存储数据&#xff0c;我们是可以使用文件来存储数据的&#xff0c;但是使用文件管理数据有很多缺点&#xff0c;比如&#xff1a; 不安全&#xff0c;不利于管理&#xff0c;查询&#xff0c;如果要存储大量的数据&#xff0c;使用文件管理…

Show that f(z)=1/z is analytic or not

See https://brainly.in/question/21838444

HVV行动之态势感知平台(一)

知攻善防&#xff0c;遇强则强&#xff01; 先介绍一下什么是HVV行动&#xff1a; 它是由公安部牵头的&#xff0c;通过组织红队和蓝队进行为期两周到三周的攻防对抗演习&#xff0c;来检测一些企业单位可能存在的网络漏洞和威胁&#xff0c;进而进行修复和加固&#xff0c;提…

0829|C++day7 auto、lambda、C++数据类型转换、C++标准模板库(STL)、list、文件操作

一、思维导图 二、【试编程】将实例化类对象写入容器后&#xff0c;写入.txt文本中&#xff0c;再重新定义一个类容器&#xff0c;将.txt中的内容读取出来&#xff0c;输出到终端 封装一个学生的类&#xff0c;定义一个学生这样类的vector容器, 里面存放学生对象&#xff08;至…

什么是RESTful API,Spring MVC如何支持RESTful架构

文章目录 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;Java框架 ✨文章内容&#xff1a;Spring MVC支持RESTful架构 &#x1f91d;希望作者的文章能对你有所帮助&#xf…

ubuntu18.04.6的安装教程

目录 一、下载并安装virtualbox virtualbox7.0.8版本的安装 二、Ubuntu的下载与安装 ubuntu18.04.6操作系统 下载 安装 一、下载并安装virtualbox VirtualBox是功能强大的x86和AMD64/Intel64虚拟化企业和家庭使用的产品。VirtualBox不仅是面向企业客户的功能极其丰富的高…