持续集成流水线介绍(CI)

目录

一、概述

二、持续集成的典型操作流程

2.1 概述

2.2 持续集成的操作流程图

2.3 持续集成关键流程说明

三、构建持续集成流水线的方式

3.1 依托云厂商能力

3.2 采用开源产品

3.3 企业自研

四、构建持续化集成流水线

4.1 基于GitHub的持续集成流水线(公有云方案)

4.1.1 概述

4.1.2 GitHub持续集成方案操作流程示意图

4.1.3 GitHub Actions持续集成技术实现原理

4.1.3.1 GitHub Actions工作流程构成关系图

4.1.3.2 GitHub Actions工作流程

4.1.3.2.1 新建Actions

4.1.3.2.2 自定义工作流程

4.1.3.2.3 选择快捷模板

4.1.3.2.4 进入配置页面

4.1.3.3 举例配置Node.js YAML文件

4.1.3.4 总结

4.2 基于Jenkins/GitLab CI的持续集成流水线(私有云)

4.2.1 概述

4.2.2 Jenkins持续集成方案操作流程示意图

4.2.3 Jenkins+GitLab持续集成技术实现原理

4.2.3.1 说明

4.2.3.2 安装GitLab

4.2.3.3 安装Jenkins

4.2.3.4 GitLab配置访问令牌

4.2.3.5 Jenkins配置


一、概述

介绍完了持续集成基本概念和包含的主要系统,接下来将从平台建设和技术实现的角度为大家详细讲述其典型流程下的技术细节。

二、持续集成的典型操作流程

2.1 概述

持续集成流程在DevSecOps平台中主要表现为持续集成流水线,在实际的平台建设中,这一段流程的线上化过程通常是分阶段、分步骤实现的。大多数情况下,首先实现的是代码管理到集成测试这一段的线上化,然后再通过安全左移,逐步完成整个持续集成到持续开发的线上化。

2.2 持续集成的操作流程图

当整个流程完成线上化之后,在DevSecOps平台中,编排调度系统是持续集成平台能力的核心,承担着流程调度、任务管理和面向用户交互的职责。基于日常的研发操作和上文中提及的持续集成流程中涉及的主要系统,其典型操作流程如下图所示:

2.3 持续集成关键流程说明

其关键流程如下:

  • 当开发人员完成开发后,提交代码至代码存储仓库。
  • 触发源码及版本控制系统事件HOOK,发起代码编译构建动作。
  • 编译构建系统拉取源代码,开始代码编译。
  • 依次执行代码编译、制品打包、静态检测。
  • 当上述步骤执行通过后,通过调度将制品上传至过程制品库。
  • 生成的过程制品将被部署在资源及环境管理系统准备好的研测环境上。
  • 制品部署完成后,进入测试阶段,依次完成集成测试、安全测试、回归测试。
  • 当测试阶段动作全部完成后,将验证后的制品上传可发布制品库,供生产环境发布使用。

在整个过程中,各个任务在流水线上依次递进,直至将代码转化为可交付的制品,这就是DevSecOps平台中持续集成流程的核心作用。

三、构建持续集成流水线的方式

当一家企业着手搭建持续集成流水线时,通常可以使用如下三种不同的方式去构建此能力

3.1 依托云厂商能力

依托云厂商能力,即利用云厂商SaaS化持续集成相关系统或服务,构建企业自身的持续集成流水线。

3.2 采用开源产品

采用开源产品,即企业通过整合开源的持续集成相关产品,构建本地化的持续集成流水线。

3.3 企业自研

企业自研,即企业通过独立研发持续集成相关产品,构建本地化的持续集成流水线。

上述三种平台能力构建方式中,企业自研的方式更适用于大型互联网企业的大规模并发的持续集成场景,当然需要的资源投入和实施周期也不一样。考虑本书内容的普及性和实用性,这里主要以前两种方式为例向读者介绍持续集成流水线平台能力的搭建。

四、构建持续化集成流水线

4.1 基于GitHub的持续集成流水线(公有云方案)

4.1.1 概述

基于GitHub的持续集成流水线适合中小型互联网企业,或者说使用公有云基础设施及源代码云托管服务的企业。这类企业有一个典型的特点是代码管理托管在云服务上(这里主要是指GitHub),企业大多数没有自己的数据中心,采购云厂商的云主机、云数据库、云存储等作为企业的基础设施,如研测环境和生产环境均在公有云上。

4.1.2 GitHub持续集成方案操作流程示意图

GitHub Actions是GitHub平台上的一个功能模块,在代码托管的基础上可以承担持续集成流水线的功能,用户通过GitHub Actions对软件开发流程的定义,自动化地帮助用户完成代码检出、编译构建、代码检测、依赖管理、测试、部署等操作。当基础设施使用公有云时,在此持续集成方案的基础上,可以快速方便地完成持续部署的自动化。此方案的操作流程概览图如下图所示:

从图中可以看出,当使用GitHub作为持续集成流水线控制时,GitHub Actions担当着总体流程调度的角色,当触发工作流程的事件后,流程启动开始执行。

4.1.3 GitHub Actions持续集成技术实现原理

4.1.3.1 GitHub Actions工作流程构成关系图

使用GitHub Actions来实现持续集成时,工作流程是通过在GitHub上定义的YAML文件来描述的。YAML文件一般存放在.github/workflows目录中,一个项目可以定义多个YAML文件,一个YAML文件定义一个流程(Workflows),流程由事件(Event)触发作为入口。一个流程包含多个不同的任务(Job),每一个任务由一个或多个步骤(Step)组成,每一个步骤可以执行一个或多个操作(Actions)。Workflows-Job-Step-Actions它们组装在一起,构成整个工作流程,如图所示:

配置完成的工作流程可以通过手工操作、GitHub CLI、API接口等方式触发流程启动事件。事情启动后,会依次执行每一个任务,直至流程结束。如果流程执行失败,GitHub Actions也会起到监控和调度的作用。

4.1.3.2 GitHub Actions工作流程
4.1.3.2.1 新建Actions

当用户代码托管在GitHub后,可以在项目中的Code标签页直接新建Actions,如图所示:

4.1.3.2.2 自定义工作流程

进入页面后,单击New workflow的按钮,开始定义工作流程。默认情况下,当前页面提供了一系列的工作流程模板,如推荐的模板列表、持续集成的模板列表、安全检测的模板列表等。同时,用户也可以自定义自己的工作流程。

在上图中,

❶所示位置为用户自定义工作流程入口,

❷所示位置为系统推荐的工作流程模板入口。

4.1.3.2.3 选择快捷模板

当然,用户还可以选择其他的工作流程的快捷模板,如下图所示:

4.1.3.2.4 进入配置页面

这里选择GitHub Actions工作流程后,则进入YAML文件的配置页面,如下图所示:

在上图中,

❶所示区域为YAML文件的自定义配置编辑区,

❷所示区域为GitHub根据应用市场的使用情况推荐给用户的操作模板和说明文档。用户参考操作模板和说明文档完成YAML文件的自定义编辑之后,修改❸的文件名,最后单击❹Start commit按钮提交YAML文件,提交后在代码项目“根目录/.github/workflows”下会存在刚才提交的YAML文件。

至此,工作流程的定义已完成。当代码仓库发生变化时,如果发现“根目录/. github/workflows”下存在yml文件,将根据流程触发条件,启动流程。

4.1.3.3 举例配置Node.js YAML文件

在整个工作流程中的定义中,YAML文件的配置是流程定义关键。下面以一个Node.js项目为例介绍持续集成配置,其文件样例如下图所示:

在上图中,文件主要包含三个部分:

❶表示整个流程的名称,

❷表示流程的触发条件为事件push,

❸表示要执行的任务内容。

其中

❹表示使用代码的主分支master,

❺表示任务主要是编译构建与测试,

❻表示编译构建和测试的使用环境为Ubuntu操作系统,

❼表示当前Job任务所包含的步骤,

❽~11均为其操作步骤:

❽表示代码Checkout操作,

❾表示命令行环境下依赖环境的安装、构建和测试操作,

10表示对dist目录下的文件排除txt类型之后生成的制品上传

11表示上传自动化测试报告。

这是一个简单的Node.js项目持续集成样例,在实际使用中,开发语言不同,使用场景不同,流程的定义往往要复杂得多。但通过这个样例,读者能概要性地了解GitHub Actions实现持续集成流程的基本逻辑。

4.1.3.4 总结

对于GitHub Actions的使用GitHub官方文档中有比较详细的描述,感兴趣的读者可以详细阅读其案例,并动手操作,理解不同场景下的持续集成流程的定义和使用。

例如,GitHub上Action的代码仓库包含各种流程定义模板,感兴趣的读者可以访问地址:

GitHub - actions/starter-workflows: Accelerating new GitHub Actions workflows

同时,在GitHub的应用市场上也有非常多的使用案例,这些案例,既包含持续集成能力,也包含安全能力(如下图所示);

既包含GitHub自身功能,也包含其他厂商的SaaS化能力,如亚马逊AWS、阿里云、RedHat等(如下图所示)。

这些与GitHub可集成的能力,对于使用GitHub实现持续集成流水线的企业来说,无疑是极大地缩短了DevSecOps能力构建的周期,降低了平台学习和平台使用的成本。

4.2 基于Jenkins/GitLab CI的持续集成流水线(私有云)

4.2.1 概述

基于Jenkins或GitLab CI去构建企业级持续集成流水线是业界非常普遍的方案,这与它们本身的开源、易于操作,满足常见持续集成场景下各个任务的调度需求有关,同时也与周边生态系统的成熟,与版本管理工具、版本控制工具、构建工具等易于集成也有很大的关系。用户通过使用此类方案,可以方便、一揽子地解决多个业务操作和系统数据之间的打通与联动。

除了少数大规模、高并发的大型互联网企业需要自己去研发流程调度系统外,在使用已有的开源产品或商业产品来构建持续集成能力时,Jenkins通常是企业的首选方案。

4.2.2 Jenkins持续集成方案操作流程示意图

Jenkins是基于Java语言的企业级持续集成工具,可以持续、自动化、分布式完成持续集成流程中的多个任务,如构建、测试、监控等。以Jenkins为流程调度的持续集成流水线,其概览图如下图所示:

从此方案中可以看到,图中编译、打包、镜像构建、上传镜像、删除镜像等操作,都是在Jenkins统一调度下完成的,Jenkins通过API接口、脚本、应用等调用,完成持续集成流程中的关键任务。它与基于GitHub持续集成方案的不同在于,此方案中代码托管在本地环境,管理工具使用的是Git和GitLab,Jenkins、Docker仓库、测试环境等也都是企业自己搭建的,整个平台具有很好的自主性和可定制性

4.2.3 Jenkins+GitLab持续集成技术实现原理

4.2.3.1 说明

接下来,将以Jenkins+GitLab相结合的方案介绍持续集成能力的实现。Jenkins+GitLab的安装市面上有很多文字资料和视频,这里仅做简要地介绍,通过简化安装让读者了解其系统构成即可。

4.2.3.2 安装GitLab

GitLab是业界使用比较广泛的一款覆盖DevSecOps全流程的软件,它分为GitLab CE和GitLab EE两个版本,其中GitLab CE为社区的开源版本,GitLab EE为企业级版本,企业版有一定时间的免费试用期。这里以GitLab CE版本为例,讲述GitLab的安装。GitLab安装有多种安装方式,常见的有使用已下载安装包安装、在线安装,如Linux环境下rpm包安装,yum在线安装、Docker安装等。使用yum安装时,需要注意的是,安装时需要考虑到网络速度的传输。建议选择安装源时,首选考虑国内的安装镜像源,如清华大学开源软件镜像源、科大镜像源、华为镜像源等,如下图所示:

本文为了简化GitLab的安装操作,方便读者快速使用和了解GitLab,使用Docker化安装方式。Docker安装首先要下载GitLab,如下命令行所示:

待此命令执行完成后,即可启动GitLab,如下命令行所示:

等待一段时间,当所有的容器状态正常时,即可以通过gitlab.devsecops-demo.com访问GitLab。如果通过域名无法访问,读者需要配置IP解析。首次使用时,需要配置GitLab管理员密码,设置完密码后才可以管理员身份登录GitLab。

相比yum安装,Docker的安装与配置要简单得多,读者也可以使用其他方式安装,来加深对GitLab的理解。另外,对于英文不好的读者,建议安装时选择中文版,即选择镜像gitlab-ce-zh:latest即可,其他步骤与英文版一致。

4.2.3.3 安装Jenkins

Jenkins是Java语言开发的,所以安装之前先查看本机是否已安装JDK,如果没有安装则需要首先安装JDK。本文默认JDK已正确安装,如果有读者不知道JDK如何安装,请查阅相关资料。这里仍以Docker环境为例,讲述Jenkins的安装过程。

在Docker命令行模式下,执行以下命令:

默认情况下,使用latest镜像。待此命令执行完成后,即可启动GitLab,如下命令行所示:

等命令行执行完成后,即可通过jenkins.devsecops-demo.com访问页面。这里需要读者注意的是,GitLab的Docker启动参数与Jenkins的启动参数在端口上要避免冲突,并且和GitLab安装一样,考虑jenkins.devsecops-demo.com与IP地址的解析。否则也是无法访问的。


首次访问Jenkins需要解锁管理员密码,这时只需要进入Jenkins HOME目录查询密码复制输入即可,如下图所示:

解锁完成后,即可登录进系统,参考新手入门的指引,创建用户、添加插件及执行相关配置。

4.2.3.4 GitLab配置访问令牌

GitLab配置访问令牌,并通过令牌与Jenkins之间进行认证和授权。进入GitLab主界面,进入一个代码仓库后,选择【Setting】→【Access Tokens】,填写Token name:gitlab-jenkins-user-api-token并勾选【api】后,生成令牌信息,如下图所示:

需要将该令牌信息复制下来并保存至安全的位置,后续在Jenkins配置的时候还会使用到该令牌。

4.2.3.5 Jenkins配置

Jenkins主页选择【Manage Jenkins】→【Available】,安装Jenkins GitLab Plugin插件,如下图所示:

选择【Credentials】→【System】→【Global Credentials】→【Add Credentials】,填写GitLab用户令牌,如下图所示:

最后选择【Manage Jenkins】→【Configure System】,选择【GitLab】标签,填入GitLab相关配置,如下图所示:

通过以上四个步骤,已经完成了GitLab与Jenkins的集成。接下来就可以在Jenkins中创建任务进行构建。

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

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

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

相关文章

【氮化镓】GaN器件中关态应力诱导的损伤定位

概括总结: 这项研究通过低频1/f噪声测量方法,探究了在关态(OFF-state)应力作用下,AlGaN/GaN高电子迁移率晶体管(HEMTs)中由应力引起的损伤的定位。研究中结合了电致发光(EL&#xf…

如何合理利用chatgpt写高质量论文,10分钟速成(四)

演示站点: https://www.cnsai.net/ 论文模块 官方论坛: www.jingyuai.com 京娱AI 一、文章结构剖析 如果我们经常去写文章或者是去看别人的文章,你会发现文章分为以下几部分 标题大纲前言/导语正文(不同的结构)结尾呼…

Linux查看重启时间,关机时间,运行时长的指令

Linux查看重启时间,关机时间,运行时长的指令 查看上次启动时间查看系统重启时间查看关机时间查看运行时长 这里测试环境为Ubuntu 16.04 查看上次启动时间 who -b可以通过who --help查看who指令的更多功能 查看系统重启时间 可以通过下面的方式来进行…

1. Java概述

文章目录 1.Java语言概述1.1 Java介绍1.1.1 软件开发概述1.1.2 计算机语言1.1.3 Java 简史1.1.4 Java 技术体系平台1.1.5 Java在各领域的应用1.1.6 Java语言特点1.1.7 Java核心机制一-Java虚拟机1.1.8 Java核心机制二-垃圾回收1.1.9 Java开发工具 1.2 Java环境搭建1.2.1 JDK、J…

农村分散式生活污水分质处理及循环利用技术指南

标准已完成意见征集: 本文件给出了农村分散式生活污水分质处理及循环利用的总则、污水收集、污水分质处理、资源化利用、利用模式、运维管理等的指导。 本文件适用于农村分散式生活污水分质处理及循环利用的设施新建、扩建和改建工程的设计、施工与运维。 注:本文件…

算法系列--动态规划--回文子串系列

💕"我们好像在池塘的水底,从一个月亮走向另一个月亮。。"💕 作者:Mylvzi 文章主要内容:算法系列–动态规划–回文子串系列 今天为大家带来的是算法系列--动态规划--回文子串系列(1),本文重点掌握如何快速判…

Echarts地图之——如何给地图添加外边框轮廓

有时候我们希望给地图外围加一圈边框来增加美感 但实际情况中,我们需要把国界的边框和各个省份属于国界的边框相吻合,否则就会造成两者看起来是错位的感觉 这就需要我们把echarts registerMap的全国省份json和国界边框json的坐标相一致。 这个json我们可…

佳能机械制造将莅临2024第13届生物发酵产品与技术装备展

参展企业介绍 过滤与分离设备专业制造商 •碟式离心机及机组模块、系统 •卧式螺旋卸料沉降离心机及系统 江苏佳能机械制造有限公司位于中国“龙虾之都”——江苏盱眙,地处淮安西南部,淮河下游,洪泽湖南岸&#…

网络七层模型之表示层:理解网络通信的架构(六)

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【LeetCode热题100】124.二叉树的最大路径和(二叉树)

一.题目要求 二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root …

Doris实践——叮咚买菜基于OLAP引擎的应用实践

目录 前言 一、业务需求 二、选型与对比 三、架构体系 四、应用实践 4.1 实时数据分析 4.2 B端业务查询取数 4.3 标签系统 4.4 BI看板 4.5 OLAP多维分析 五、优化经验 六、总结 原文大佬介绍的这篇Doris数仓建设实践有借鉴意义的,这些摘抄下来用作沉淀学…

docker-compose mysql

使用docker-compose 部署 MySQL(所有版本通用) 一、拉取MySQL镜像 我这里使用的是MySQL8.0.18,可以自行选择需要的版本。 docker pull mysql:8.0.18二、创建挂载目录 mkdir -p /data/mysql8/log mkdir -p /data/mysql8/data mkdir -p /dat…

软件测试基础理论、测试用例及设计方法、易混淆概念总结【软件测试】

一.软件测试基础理论 1.软件定义 软件是计算机系统中与硬件相互依存的一部分,包括程序、数据以及与其相关文档 的完整集合。 程序是按事先设计的功能和性能要求执行的指令序列; 数据是使程序能正常操作信息的数据结构; 文档是与程序开发、维…

对form表单对象中数组中的字段进行校验的方法

当对form表单中&#xff0c;数组readings中的字段进行校验时&#xff0c;prop和rules绑定要写成动态的&#xff0c;如下代码 <div v-for"(item,index) in form.readings"><el-form-item label"上次读数" > <!--prop"scds"-->…

LocalDateTime与时间戳转换

LocalDateTime与时间戳转换 1. 为什么LocalDateTime转时间戳需要时区2. 工具类 1. 为什么LocalDateTime转时间戳需要时区 讲道理&#xff0c;不管在什么时区&#xff0c;系统获取当前时间的时间戳都是一样的【因为时间戳指的是自 1970 年1月1日以来的秒数&#xff0c;所以无论…

使用ai智能写作场景之gpt整理资料,如何ai智能写作整理资料

Ai智能写作助手&#xff1a;Ai智能整理资料小助手 Ai智能整理资料小助手可试用3天&#xff01; 通俗的解释一下怎么用ChatGPT来进行资料整理&#xff1a; 搜寻并获取指定数量的特定领域文章&#xff1a; 想像你在和我说话一样&#xff0c;告诉我你想要多少篇关于某个话题的文…

在 Windows 11 上安装 MongoDB

MongoDB 是一个流行的 NoSQL 数据库&#xff0c;它提供了灵活的数据存储方案&#xff0c;而 MongoDB Compass 则是一个可视化管理工具&#xff0c;可以更轻松地与 MongoDB 数据库交互和管理。在本文中&#xff0c;我们将介绍如何在 Windows 11 上安装 MongoDB&#xff0c;并配置…

ESCTF-Web赛题WP

0x01-初次见面-怦然心动:your name? 随便输入一个字 根据提示可以看到 我们需要看源代码 直接 搜索 secret 关键字或者 ESCTF flag ESCTF{K1t0_iS_S0_HAPPy} 0x02-小k的请求 更安全的传参 post 参数为ESCTF 值为 love 自己的ip 同时还有个要求 是需要从度娘转过来 https://www…

QMT量化策略实盘(二)交易触发定时器run_time

上一篇分享中&#xff0c;介绍了QMT量化实盘中最常用的下单函数passorder&#xff0c;和它主要的参数。 如果再结合一个交易触发函数&#xff0c;就可以实现简单的量化交易策略了&#xff01;比如下面的代码可以实现&#xff1a; 在集合竞价期间以指定价买入中信证券100股 #c…

<el-table>设置一列为固定字段,其他列为循环生成

<el-table :data"tableData" style"width: 100%"><el-table-columnprop"name"label"固定字段名":formatter"formatter"></el-table-column><el-table-columnv-for"(item, index) in wordsColumns…