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

news2024/11/15 21:37:00

目录

一、概述

二、版本控制系统

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://www.coloradmin.cn/o/1552466.html

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

相关文章

uniApp使用XR-Frame创建3D场景(5)材质贴图的运用

上一篇讲解了如何在uniApp中创建xr-frame子组件并创建简单的3D场景。 这篇我们讲解在xr-frame中如何给几何体赋予贴图材质。 先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"><xr-node><xr-assets><xr-asse…

向量法求点在直线上的投影

已知直线上两点a、b和直线外一点p&#xff0c;求p在直线ab上的投影点。 根据《计算几何之 点在直线上的投影 代码模板与证明》一文中所述&#xff0c;p的投影点p’就是a x ⃗ \vec x x &#xff08;直线的点向式&#xff09;&#xff0c;所以我们只要求出 x ⃗ \vec x x 就能…

基于单片机的二维码LCD显示控制设计

**单片机设计介绍&#xff0c;基于单片机的二维码LCD显示控制设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的二维码LCD显示控制设计是一个集硬件、软件与通信于一体的综合性项目。此设计的主要目标是实现单片机…

AI新工具 又一个开源大模型DBRX击败GPT3.5;根据音频和图像输入生成会说话、唱歌的动态视频

✨ 1: AniPortrait 腾讯开源&#xff1a;根据音频和图像输入生成会说话、唱歌的动态视频 AniPortrait 是个先进的框架&#xff0c;专门用来生成高质量的、由音频和参考肖像图片驱动的动画。如果你有视频&#xff0c;也可以用来实现面部的再现&#xff08;Face reenactment&am…

Windows 最佳文件管理器:快速、简单、直观、自由 | 开源日报 No.175

files-community/Files Stars: 30.6k License: MIT Files 是为 Windows 构建的最佳文件管理器应用程序。该项目解决了在 Windows 上进行文件管理时的困难。 它具有以下主要功能和优势&#xff1a; 采用直观设计&#xff0c;使浏览文件变得更加简单支持标签、预览和自定义背景…

面试算法-121-完全二叉树的节点个数

题目 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的节点都集中在该层最左边的若干位置…

多源统一视频融合可视指挥调度平台VMS/smarteye系统概述

系统功能 1. 集成了视频监控典型的常用功能&#xff0c;包括录像&#xff08;本地录像、云端录像&#xff08;录像计划、下载计划-无线导出&#xff09;、远程检索回放&#xff09;、实时预览&#xff08;PTZ云台操控、轮播、多屏操控等&#xff09;、地图-轨迹回放、语音对讲…

Convex and Semi-Nonnegative Matrix Factorizations

我们提出了非负矩阵分解&#xff08;NMF&#xff09;主题的几种新变体。考虑形式为X FG^T的因子分解&#xff0c;我们关注的是G被限制为包含非负元素的算法&#xff0c;但允许数据矩阵X具有混合符号&#xff0c;从而扩展了NMF方法的适用范围。我们还考虑了基向量F被约束为数据…

win10微软拼音输入法 - bug - 在PATH变量为空的情况下,无法输入中文

文章目录 win10微软拼音输入法 - bug - 在PATH变量为空的情况下&#xff0c;无法输入中文概述笔记实验前提条件100%可以重现 - 无法使用win10拼音输入法输入中文替代的输入法软件备注END win10微软拼音输入法 - bug - 在PATH变量为空的情况下&#xff0c;无法输入中文 概述 在…

docker 部署 gitlab-ce 16.9.1

文章目录 [toc]拉取 gitlab-ce 镜像创建 gitlab-ce 持久化目录启停脚本配置配置 gitlab-ce编辑 gitlab-ce 配置文件重启 gitlab-ce配置 root 密码 设置中文 gitlab/gitlab-ce(需要科学上网) 拉取 gitlab-ce 镜像 docker pull gitlab/gitlab-ce:16.9.1-ce.0查看镜像是不是有 Vo…

Android和IOS应用开发-Flutter应用让屏幕在 app 运行期间保持常亮的方法

文章目录 Flutter应用让屏幕在 app 运行期间保持常亮的方法方法一&#xff1a;使用系统插件方法二&#xff1a;使用 Widgets注意事项 Flutter应用让屏幕在 app 运行期间保持常亮的方法 在 Flutter 开发中&#xff0c;可以使用以下两种方法让屏幕在 app 运行期间保持常亮&#…

c++|string模拟实现

目录 一、string.h 二、string.cpp 三、Test.cpp 对string的各种接口进行一个简易版的模拟实现&#xff0c;在模拟实现完之后对string的底层实现有了进一步的理解&#xff0c;了解大佬的编程写法思路。也算是对string有了一个小总结。 一、string.h 接口的声明。放在.h文件中…

excel中批量插入分页符

excel中批量插入分页符&#xff0c;实现按班级打印学生名单。 1、把学生按照学号、班级排序好。 2、选择班级一列&#xff0c;点击数据-分类汇总。汇总方式选择计数&#xff0c;最后三个全部勾选。汇总结果一定要显示在数据的下发&#xff0c;如果显示在上方&#xff0c;后期…

RabbitMQ3.x之四_RabbitMQ角色说明及创建用户与授权

RabbitMQ3.x之四_角色说明及创建用户与授权 文章目录 RabbitMQ3.x之四_角色说明及创建用户与授权1. 访问和授权1. Tags说明2. 命令行示例 2. 管理界面新建用户及访问授权1. 管理界面新建用户2. 管理界面中的授权说明3. guest用户不能远程登录提示 3. 创建用户1. 基本命令2. 实际…

Unity 实现鼠标左键进行射击

发射脚本实现思路 分析 确定用户交互方式&#xff1a;通过鼠标左键点击发射子弹。确定子弹发射逻辑&#xff1a;每次点击后有一定时间间隔才能再次发射。确定子弹发射源和方向&#xff1a;子弹从枪口&#xff08;Transform&#xff09;位置发射&#xff0c;沿枪口方向前进。 变…

2024-3-28 市场情绪强修复

这一轮退潮负反馈都修复了&#xff0c; 艾艾精工 博信股份 安奈尔 永悦科技 大理药业 &#xff0c;高新发展 也补跌了&#xff0c;收尸队也干活了&#xff0c;情绪不修复不接力得最好写照。这轮周期 宁科生物 已经7板&#xff0c;已经追平了 博信股份7板&#xff0c;看明天溢…

基于单片机产品数量自动计量智能系统设计

**单片机设计介绍&#xff0c;基于单片机产品数量自动计量智能系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机产品数量自动计量智能系统设计是一个融合了单片机技术、传感器技术和自动控制技术的综合性项目。…

【Web应用技术基础】CSS(6)——使用 HTML/CSS 实现 Educoder 顶部导航栏

第一题&#xff1a;使用flex布局实现Educoder顶部导航栏容器布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Educoder</title><script src"https://cdn.staticfile.org/jquery/1.1…

Java与Go:字符串转IP

在本文中&#xff0c;我们将了解如何将简单的对比Java和Go是如何将字符串解析为IP地址。 Java 在Java中&#xff0c;将字符串转换为IP地址最无脑的一个方法&#xff1a; import java.net.InetAddress; import java.net.UnknownHostException;public class Main {public stat…

shell脚本发布docker springboot项目示例

docker、git、Maven、jdk8安装略过。 使git pull或者git push不需要输入密码操作方法 约定&#xff1a; 路径&#xff1a;/opt/springbootdemo&#xff0c; 项目&#xff1a;springbootdemo&#xff0c; 打包&#xff1a;springbootdemo.jar&#xff0c; docker容器名字&#x…