持续集成流程主要系统构成介绍(CI)

目录

一、概述

二、版本控制系统

2.1 概述

2.2 版本控制系统使用流程示意图

2.3 版本控制软件划分

2.3.1 集中式版本控制软件

2.3.2 分布式版本控制软件

2.3.3 总结

2.4 常用版本控制软件介绍

三、编译构建系统

3.1 概述

3.2 编译构建流程示意图

3.3 列举Java 源码编译构建流程

3.3.1 Java代码编译构建流程示意图

3.4 持续集成产品架构分层

3.4.1 持续集成产品架构分层示意图

3.5 常见编译工具列举

四、编排调度系统

4.1 概述

4.2 编排调度系统示意图

4.3 编排调度系统构成内容解析

4.3.1 任务

4.3.2 编排

4.3.3 调度

4.4 编排调度软件举例

4.5 编排调度系统的核心功能

4.5.1 流程编排管理

4.5.2 任务配置管理

4.5.3 作业调度管理

4.5.4 历史日志管理

五、其他系统

5.1 概述

5.2 企业配置管理数据库(CMDB)

5.3 资源管理系统

5.4 制品仓库

5.5 总结


一、概述

了解了持续集成和版本控制的基本概念之后,下面带大家从技术层面深入理解其具体内容。一个标准的持续集成功能通过平台来实现时,它至少包含如下三个部分:

  • 版本控制系统。
  • 编译构建系统。
  • 编排调度系统。

二、版本控制系统

2.1 概述

版本控制系统通常是由版本控制软件和仓库管理软件两部分组成,即业界常说的SCM软件。版本控制软件用来管理代码和项目文件(如SVN),仓库管理软件则基于版本控制软件之上对代码仓库进行管理(如SVNManager)。

2.2 版本控制系统使用流程示意图

在持续集成流程中,版本控制系统承载的操作流程如下图所示。

2.3 版本控制软件划分

根据版本控制管理的方式不同,当前市场上的版本控制软件可划分为集中型版本控制软件和分布式版本控制软件。集中式版本控制软件以SVN为代表,分布式版本控制软件以Git为代表。

2.3.1 集中式版本控制软件

在集中式版本控制软件中,代码集中存储在某台服务器上。项目人员使用时,需要先安装客户端软件,连接到版本控制软件的服务器端,将代码检出到本地,修改后再从自己的计算机同步更新或上传到服务器,如下图所示:

集中式版本控制软件的特点是所有的版本数据都保存在服务器端,项目人员在本地计算机中仅保存着自己以前同步的版本。在不连接服务器端的情况下,项目人员就看不到服务器上的历史版本信息。如果项目人员想切换到某个版本,也无法操作。除此之外,集中式版本控制软件最大的风险是所有数据都保存在单一服务器上,如果服务器受到损害,则有版本丢失的风险。为此,需要定期做数据备份。当然,也正是这种集中式、单一的管理方式,其使用比较简单,尤其对新手来说,很容易上手。

2.3.2 分布式版本控制软件

相比于集中式版本控制软件,分布式版本控制软件的使用相对复杂。项目人员在初次使用时,必须在本地计算机上克隆(git clone)一个完整的Git仓库,再基于这个本地仓库进行检入检出操作。再将本地仓库与服务器端仓库进行数据同步,从而完成版本控制管理的目的。如下图所示。

分布式版本控制软件对文件的修改通常以快照的方式记录版本差异。当本地仓库完成克隆之后,除非同步数据到服务器端,其他的操作都是在本地执行,无需联网。这对于网络环境相对封闭的项目组来说,多人协同开发版本管理比较方便。在分布式版本控制软件,中央仓库所在的服务器或版本控制软件的服务器端充当交换媒介的作用,将项目组中不同人员的修改进行交换,由修订人员在本地仓库间进行互相复制。同时,每个人的本地仓库都保存一份完整的版本库。

2.3.3 总结

从上述的这些特点来看,分布式版本控制软件的管理过程比集中式版本控制软件要复杂,但好处较为明显。目前在大中型企业管理中,分布式版本控制软件的使用占比高于集中式版本控制软件,分布式版本控制软件更适用于大规模的多人协作开发。

2.4 常用版本控制软件介绍

为了帮助大家在搭建DevSecOps平台时,选择契合业务实际需求的版本控制软件,下面介绍下常见的版本控制软件,如下图所示:

三、编译构建系统

3.1 概述

编译构建是源代码转为可执行程序过程中必不可少的一个步骤,在传统的开发模型中,编译构建通常是开发人员在本地计算机自己编译后上传版本库;在持续集成流程中,编译构建动作通常是平台上的持续集成工具来自动化完成的。除了基本的代码编译构建外,还有容器镜像的构建

3.2 编译构建流程示意图

当开发人员提交代码之后,触发持续集成平台中的编排调度系统发起调度流程执行编译构建动作。编译构建系统会根据不同的编程语言选择不同的编译工具将源码进行编译打包成制品。如果制品还需要制作成容器镜像,则继续调用镜像构建流程。

3.3 列举Java 源码编译构建流程

3.3.1 Java代码编译构建流程示意图

下面以Java语言的源代码为例,介绍代码编译构建过程,如下图所示:

当编译构建系统执行编译指令时,编译工具的编译引擎先解析编译配置文件,根据配置文件中的配置从中央仓库或本地缓存中获取版本所需要的依赖库,再对源代码进行编译,执行编译过程如果编译没有发生阻断性错误,则最终输出编译产物,即可执行程序或制品包。当有新的版本迭代时,重新触发上述流程,持续编译输出编译产物。

当代码编译构建完成打包成制品后,如果没有使用镜像,则流程结束;如果有镜像制作,则触发镜像构建流程,如下图所示:

在整个流程中,编排调度系统充当流程管理员的作用,通过不同的指令,将代码下载、依赖下载、应用制品打包、镜像制作的流程串联起来,形成持续集成管道化的功能

3.4 持续集成产品架构分层

3.4.1 持续集成产品架构分层示意图

从这些流程可以看出,不同的开源产品在持续集成平台架构中分别承担不同的功能。如果将这些开源产品进行系统分层,则结果如下图所示:

上图中,持续集成工具即编排调度层充当持续集成流程的管理中枢,并直接面向最终用户;编译工具层提供各种不同的开发语言编译工具,承上启下,连接编排调度层和基础代码仓库;而基础数据层则为上层的编译构建操作提供原始的源代码及代码管理功能。

3.5 常见编译工具列举

因开发语言、运行环境的不同,编译工具也各不相同。常见的编译工具如下图所示:

四、编排调度系统

4.1 概述

介绍完编译构建系统,再来看看编排调度系统。编排调度系统充当了代码编译、构建镜像、通知推送几个步骤的综合管理和调度工具,这就是编排调度系统的核心使用场景。

4.2 编排调度系统示意图

如果把代码编译、构建镜像、通知推送看成3个独立的任务,编排调度系统是调度中心,这就是编排调度系统的核心能力构成:任务、编排、调度。

4.3 编排调度系统构成内容解析

4.3.1 任务

在前文提及持续集成流程时,我们了解到整个流程是一个个动作串联起来的,这一个个的动作可以当作一个个具体的执行任务。体系在平台中,则需要完成任务所支撑的代码片段,这些代码片段能完成具体功能,如代码提交、代码安全的自动化检查、单元测试用例的覆盖度检查等。这些,在平台中统一称之为任务。

4.3.2 编排

编排是指不同的任务之间,通过一定的排列组合、先后顺序的承接,来完成一个整体的作业流程。进行排列组合和组装顺序的过程称之为编排,编排后的整体流程称之为作业。例如,代码提交后,接着执行单元测试用例覆盖度的检查,再执行代码缺陷的自动化检查;也可以代码提交后,先执行代码安全的自动化检查,最后执行单元测试用例覆盖度的检查;还可以设置多次代码提交,但不触发代码安全的检查,只有当代码编译构建通过后,再触发代码安全的自动化检查,这个流程中,代码提交的任务被触发了多次。这也是编排的一种。总之,编排就是通过不同的组合方式,来完成任务执行顺序关系的设置,以满足业务的需要。

4.3.3 调度

调度是指在不同的任务执行过程中,需要分布跟踪、调度任务的执行及执行情况,以根据上一步执行结果调用不同的下一步任务的过程。例如,代码编译后执行代码缺陷检查任务,如果代码缺陷检查调用不成功,则切换编译环境,再次执行代码编译、代码缺陷检查任务。这个流程的控制称为调度。调度通常关注任务执行的结果,被调用方常常是跨子系统的。

4.4 编排调度软件举例

目前,常用的编排调度软件(即持续集成工具)如表所示:

在知道了常见的持续集成编排调度软件,了解了编排调度的基本概念之后,大家也基本明白为什么在DevSecOps平台中需要编排调度系统。如果没有编排调度系统,不同的流程无法统一用平台来管理,不同的任务无法在平台中进行统一配置,DevSecOps规范中设置的安全卡点也就无法在平台中完成线上业务的承载

4.5 编排调度系统的核心功能

既然编排调度如此重要,那么编排调度系统中,到底包含哪些核心功能呢?

4.5.1 流程编排管理

流程编排管理是编排调度系统中的首要功能,每一个流程编排运行时产生一个流程实例,任务是此持续集成流程中最小的集成单元。对于整个流程来说,它是由一个一个的任务组合在一起形成的,为了完成这些不同任务的组合作业,在DevSecOps平台中,需要有任务编排管理的功能来形成流程。任务编排功能页面如下图所示:

如图所示,用户在编排时,可以在不同的阶段添加不同的任务。例如,在构建阶段添加对SCA的调用,检测开源组件安全漏洞;开发提测前,添加必须通过静态代码安全检测的任务等。当任务编排完成后即形成一个可以执行的具体作业,作业的完成依赖于其中每个任务的执行完成情况。一个标准的作业流程就是一次流水线管道的执行。在作业的实际执行过程中,不一定每一个任务都会执行到,有可能存在某个任务出现异常或被跳过的情况。如果某个任务中包含子任务或其他并行任务,则需要对子任务或并行任务进行配置管理,以保障作业流程的顺利执行,这也是任务编排管理的内容。

4.5.2 任务配置管理

在任务配置管理中,需要管理单个任务执行的基本参数,如开始条件、执行次数、调用脚本或脚本路径、相关参数配置等,这是任务配置管理的基本功能。除此之外,当某个任务执行存在多个入口或者多个出口时,也需要任务的路由策略进行配置管理。在某些企业,因任务的种类繁杂(如API接口类任务、bash脚本类任务、操作系统命令行类任务、数据操作类任务等),平台设计时会抽象出一个适配层去适配各种不同的任务执行环境,这也是任务配置管理的内容。典型的任务配置管理页面截图如下图所示:

对单个任务而言,一般都承担着流程中的某个具体的动作,如代码扫描、编译检查。除此之外,还有一些任务节点在整个流程不承担具体的动作,类似流程图上的开始、结束节点,但对于整个流程来说,这些节点也是不可或缺的。这类节点的任务配置也需要任务配置管理来实现,不同的是,这些任务配置可以标准化或模板化,以方便平台用户的使用。

4.5.3 作业调度管理

任务通过编排形成作业之后,进入作业调度管理。通过作业调度管理作业的启动、流转和结束。当多个作业同时执行时,需要管理不同作业之间的优先级,为优先级高的作业提高资源保障,这是调度管理的基本功能。很多时候,多个任务之间有着强依赖关系,如只有前置任务执行完成,才可以启动当前任务。这时对前置任务执行状态的监控和当前任务的拉起都离不开作业调度管理。同时,在作业流程的执行中,对任务节点的执行情况进行监控,当任务节点的状态发生变化时,及时跟进作业流程的状态。如果缺少了作业调度,则任务无法执行或执行混乱;如果作业流程缺少监控,则无法跟踪作业流程的执行状态,对于执行异常的任务也无法发现,及时干预和处置。基于任务监控功能之上的异常告警、任务重发、异常处理等都是作业调度系统中必不可少的功能模块。

4.5.4 历史日志管理

操作日志是每一个信息化系统必不可少的功能,在编排调度系统中,历史日志管理尤为重要。在前文中曾提及,编排调度的最小单元是一个个的任务,这些任务相互之间是独立的,通过流程串联、接口调用将它们联合在一起。这种跨模块、跨系统的调用,如果没有历史日志将是很糟糕的事。通过历史日志可以还原流程执行中任务的执行顺序、单个任务执行的过程详情、异常故障的原因分析、历史流程的归纳统计等

五、其他系统

5.1 概述

除了上述三个系统外,在持续集成流程中还有一些其他的周边系统参与整个流程的协作中,典型的如企业配置管理数据库(CMDB)、资源管理系统、制品仓库等。

5.2 企业配置管理数据库(CMDB)

CMDB主要是对企业IT资产的信息及这些资产的配置信息管理,通常是运维管理系统、资源管理系统的基础,为运维管理、流程管理提供基础数据。使用CMDB可以帮助DevSecOps平台解决应用与应用、应用与技术组件、应用与基础设施的关联关系,如下图所示(CMDB中资产映射关系示意图)。

5.3 资源管理系统

资源管理系统主要是对IT资源进行综合管理,如资源申请、资源分配、资源占用、资源回收等。资产可API化管理和CMDB数据的及时准确是自动化运维的基础。尤其是在大量服务运行的IDC环境或云原生环境下,通过资源管理系统,一方面可以实现对资源的精细化管理,提高资源使用效率,降低IT成本;另一方面,为资源的合理使用及资源之上服务运行的稳定提供基础保障。云计算环境下的资源管理系统产品功能如下图所示:

5.4 制品仓库

制品仓库主要与软件研发过程相关,用于存储软件交付的成果性产物。例如,可发布的二进制安装包、可执行应用程序;编译构建阶段的阶段性输出产物等。

5.5 总结

这些相关系统的存在为整个研发过程中的持续集成、持续部署、线上运维等流程提供基础的平台保障,也是DevSecOps体系中不可或缺的一部分。

好了,本次内容就分享到这,欢迎大家关注《DevSecOps》专栏,后续会继续输出相关内容文章。如果有帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Kafka重要配置参数全面解读(重要)

欢迎来到我的博客,代码的世界里,每一行都是一个故事 Kafka重要配置参数全面解读(重要 前言auto.create.topics.enableauto.leader.rebalance.enablelog.retention.{hour|minutes|ms}offsets.topic.num.partitions 和 offsets.topic.replication.factorlo…

回文数个数-第12届蓝桥杯选拔赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第43讲。 回文数个数&#…

macOS Sonoma如何查看隐藏文件

在使用Git进行项目版本控制时,我们可能会遇到一些隐藏文件,比如.gitkeep文件。它通常出现在Git项目的子目录中,主要作用是确保空目录也可以被跟踪。 终端命令 在尝试查看.gitkeep文件时,使用Terminal命令来显示隐藏文件 default…

推动制药行业数字化转型:基于超融合架构的MES一体机解决方案

随着中国对信息化重视程度的不断加深,制药行业作为国民经济的重要支柱之一,也在积极寻求通过数字化手段提升产业效率与产品质量。自党的十六大提出“以信息化带动工业化”的战略以来,制药业的这一转型探索尤为迫切。 在现代制药生产中&#…

C# OpenCv Haar、LBP 人脸检测

目录 效果 代码 下载 效果 代码 using OpenCvSharp;namespace OPenCVDemo {class Program{static void Main(string[] args){// Load the cascadesvar haarCascade new CascadeClassifier("haarcascade_frontalface_default.xml");var lbpCascade new Casca…

CSS(六)

一、精灵图 1.1 为什么需要精灵图 一个网页中往往会应用很多小的背景图像作为修饰,当网页中的图像过多时,服务器就会频繁地接收和发送请求图片,造成服务器请求压力过大,这将大大降低页面的加载速度。 因此,为了有效…

国外的Java面试题和国内的相比谁更卷

前言 有很多朋友很好奇国外的Java面试题长啥样,今天我们就去找5道国外的面试来和国内的对比一下看看谁难一些! 面试题分享 1. Is Java Platform Independent if then how?( Java平台是独立的吗?) Yes, Java is a…

【氮化镓】位错对氮化镓(GaN)电子能量损失谱(EEL)的影响

本文献《Influence of dislocations on electron energy-loss spectra in gallium nitride》由C. J. Fall等人撰写,发表于2002年。研究团队通过第一性原理计算,探讨了位错对氮化镓(GaN)电子能量损失谱(EEL)…

大话设计模式之迪米特法则

迪米特法则,也称为最少知识原则(Law of Demeter),是面向对象设计中的一个重要原则,其核心思想是降低耦合度、减少对象之间的依赖关系,从而使系统更加灵活、易于维护和扩展。 根据迪米特法则,一…

librdkafka的简单使用

文章目录 摘要kafka是什么安装环境librdkafka的简单使用生产者消费者 摘要 本文是Getting Started with Apache Kafka and C/C的中文版, kafka的hello world程序。 本文完整代码见仓库,这里只列出producer/consumer的代码 kafka是什么 本节来源&#…

Python图像处理——计算机视觉中常用的图像预处理

概述 在计算机视觉项目中,使用样本时经常会遇到图像样本不统一的问题,比如图像质量,并非所有的图像都具有相同的质量水平。在开始训练模型或运行算法之前,通常需要对图像进行预处理,以确保获得最佳的结果。图像预处理…

StarRocks实战——多点大数据数仓构建

目录 前言 一、背景介绍 二、原有架构的痛点 2.1 技术成本 2.2 开发成本 2.2.1 离线 T1 更新的分析场景 2.2.2 实时更新分析场景 2.2.3 固定维度分析场景 2.2.4 运维成本 三、选择StarRocks的原因 3.1 引擎收敛 3.2 “大宽表”模型替换 3.3 简化Lambda架构 3.4 模…

jmeter总结之:Regular Expression Extractor元件

Regular Expression Extractor是一个后处理器元件,使用正则从服务器的响应中提取数据,并将这些数据保存到JMeter变量中,以便在后续的请求或断言中使用。在处理动态数据或验证响应中的特定信息时很有用。 添加Regular Expression Extractor元…

Git,GitHub,Gitee,GitLab 四者有什么区别?

目录 1. Git 2. GitHub 3. Gitee 4. GitLab 5. 总结概括 1. Git Git 是一个版本管理工具,常应用于本地代码的管理,下载完毕之后,我们可以使用此工具对本地的资料,代码进行版本管理。 下载链接: Git - Downlo…

Micron 256 GB DDR5-8800 MCR DIMM:适用于大型服务器的大型内存

美光本周宣布,它已经开始对其 256 GB multiplexer combined (MCR) DIMM 进行采样,这是该公司迄今为止容量最大的内存模块。这些全新的基于 DDR5 的 MCRDIMM 面向下一代服务器,特别是那些由英特尔至强可扩展“Granite R…

最小可行产品需要最小可行架构——可持续架构(三)

前言 最小可行产品(MVP)的概念可以帮助团队专注于尽快交付他们认为对客户最有价值的东西,以便在投入大量时间和资源之前迅速、廉价地评估产品的市场规模。MVP不仅需要考虑产品的市场可行性,还需要考虑其技术可行性,以…

车载以太网AVB交换机 gptp透明时钟 8口 千兆/百兆可切换 SW1100TR

SW1100车载以太网交换机 一、产品简要分析 8端口千兆和百兆混合车载以太网交换机,其中包含2个通道的1000BASE-T1采用罗森博格H-MTD接口,5通道100BASE-T1泰科MATEnet接口和1个通道1000BASE-T标准以太网(RJ45接口),可以实现车载以太网多通道交…

Switch 和 PS1 模拟器:3000+ 游戏随心玩 | 开源日报 No.174

Ryujinx/Ryujinx Stars: 26.1k License: MIT Ryujinx 是用 C# 编写的实验性任天堂 Switch 模拟器。 该项目旨在提供出色的准确性和性能、用户友好的界面以及稳定的构建。它已经通过了大约 4050 个测试,其中超过 4000 个可以启动并进入游戏,其中大约 340…

7、鸿蒙学习-共享包概述

HarmonyOS提供了两种共享包,HAR(Harmony Archive)静态共享包,和HSP(Harmony Shared Package)动态共享包。 HAR与HSR都是为了实现代码和资源的共享,都可以包含代码、C库、资源和配置文件&#xf…

java算法day37 | 贪心算法 part06 ● 738.单调递增的数字 ● 968.监控二叉树

738.单调递增的数字 思路: 从后向前遍历,如果前一个数比后一个数大,则前一个数-1,后面的数都变成9. 思路不难,但实现的代码还是有一点繁琐的。 以下是用List实现的代码。 class Solution {public int monotoneIncrea…