持续集成概览

发布于 2022-08-21 | 作者: 陈琰AC | 来源: 简书 | 转载于: 简书

一、持续集成

1.1 软件开发生命周期

软件开发生命周期又叫做SDLC(Software Development Life Cycle),它是集合了计划、开发、测试和部署过程的集合,如下图所示:

SDLC
1.1.1 需求分析

这是生命周期的第一阶段,根据项目需求,团队执行一个可行性计划的分析。项目需求可能是公司内部或者客户提出的。这阶段主要是对信息的收集,也有可能是对现有项目的改善和重新做一个新项目。还要分析项目的预算多长,可以从哪方面受益及布局,这也是项目创建的目标。

1.1.2 设计

第二阶段就是设计阶段,系统架构和满意状态(就是要做成什么样子,有什么功能)。创建一个项目计划,计划可以使用图表,布局设计或者文字的方式呈现。

1.1.3 实现

第三阶段就是实现阶段,项目经理创建和分配工作给开发者,开发者根据任务和在设计阶段定义的目标进行开发代码。依据项目的大小和复杂度,可以需要数月或更长的时间才能完成。

1.1.4 测试

测试人员进行代码测试,包括功能测试、代码测试、压力测试等。

1.1.5 进化

最后阶段就是对产品不断的进行改进和维护阶段,根据用户的使用情况,可能需要对某功能进行修改,bug修复,功能增加等。

1.2 软件开发瀑布模型

瀑布模型是最著名和最常使用的软件开发模型。瀑布模型就是一系列的软件开发过程。它是由制造业繁衍出来的。一个高度化的结构流程在一个方向上流动(不可逆),有点像生产线一样。在瀑布模型创建之初,没有其他开发的模型,有很多东西全靠开发人员去猜测,去开发。这样的模型仅适用于那些简单的软件开发,但是已经不适合现在的开发了。下图对软件开发瀑布模型的一个阐述:

软件开发瀑布模型
瀑布模型优缺点
1.3 软件的敏捷开发
1.3.1 什么是敏捷开发

敏捷开发(Agile Development)的核心是迭代开发(Iterative Development)与增量开发(Incremental Development)。

1.3.2 何为迭代开发

对于大型软件项目,传统的开发方式是采用一个大周期(比如一年)进行开发,整个过程就是一次大开发。迭代开发的方式则不一样,它将开发过程拆分成多个小周期,即一次大开发变成很多次小开发,每次小开发都是同样的流程,所以看上去就好像重复在做同样的步骤。

1.3.3 何为增量开发

软件的每个版本,都会新增一个用户可以感知的完整功能。也就是说,按照新增功能来划分迭代。

举例来说,房产公司开发一个10栋楼的小区。如果采用增量式开发的模式,该公司第一个迭代就是交付一号楼,第二个迭代交付二号楼……每个迭代都是完成一栋完整的楼。而不是一个迭代挖好10栋楼的地基,第二个迭代建好每栋楼的骨架,第三个迭代架设屋顶……

1.3.4 敏捷开发如何迭代

虽然敏捷开发将软件开发分成多个迭代,但是也要求,每次迭代都是一个完整的软件开发周期,必须按照软件工程的方法论,进行正规的流程管理。

流程管理
1.3.5 敏捷开发有什么好处

还是以上面房产公司为例,如果按照传统的瀑布开发模式,先挖10栋楼的地基,再盖骨架,然后架设屋顶,每个阶段都等到前一个阶段完成后开始,可能需要两年才能一次性交付10栋楼。也就是说,如果不考虑预售,该项目必须等到两年后才能回款。敏捷开发是六个月后交付一号楼,后面每两个月交付一栋楼。因此,半年就能回款10%,后面每个月都会有现金流,资金压力就大大减轻了。

1.4 持续集成
1.4.1 什么是持续集成

持续集成(Continuous integration,简称CI)指的是,频繁地(一天多次)将代码集成到主干。继续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。

通过持续集成,团队可以快速的从一个功能到另一个功能,简而言之,敏捷软件开发很大一部分都要归功于持续集成。

1.4.2 持续集成的流程
持续集成的流程

根据持续集成的设计,代码从提交到生产,整个过程有以下几步。

1.4.3 持续集成的组成要素

1、一个自动构建过程,从检出代码、编译构建、运行测试、结果记录、测试统计等都是自动完成的,无需人工干预。

2、一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库,一般使用SVN或Git。

3、一个持续集成服务器,Jenkins就是一个配置简单和使用方便的持续集成服务器。

持续集成的组成要素
1.4.4 持续集成的好处

二、GitLab

2.1 GitLab安装

Ubuntu部署GitLab

2.2 GitLab项目组&权限
2.2.1 项目组

使用管理员root创建组,一个组里可以有多个项目分支,可以将开发添加到组里进行设置权限,不同的组就是公司不同的开发项目或者服务模块,不同的组添加不同的开发即可实现对开发设置权限的管理。

2.2.2 权限

GitLab用户在组里面有5种不同权限

三、Jenkins

3.1 Jenkins介绍

Jenkins是一款流行的开源持续集成(Continuous Integration)工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。

Jenkins的特征:

3.2 Jenkins安装

Ubuntu安装Jenkins

3.3 Jenkins插件管理

Jenkins本身不提供很多功能,我们可以通过使用插件来满足我们的使用,例如从GitLab拉取代码,使用Maven构建项目等功能需要依靠插件完成。

Jenkins国外官方插件地址下载速度非常慢,所以我们一般将地址修改为国内插件地址。

3.4 重启Jenkins

一般我们安装完插件后需要重启Jenkins,我们可以在Jenkis访问地址后加restart进行重启,http://192.168.1.1:8666/restart

3.5 Jenkins用户权限管理

我们可以利用Role-base Authorization Strategy插件来管理Jenkins用户权限。

3.5.1 安装插件
Role-base Authorization Strategy
3.5.2 开启Role-base Strategy
1
2
3.5.3 角色管理
1
2
3.5.4 用户管理
1
3.5.5 分配角色
1
3.6 Jenkins凭证管理

凭证可以用来存储需要密文保护的数据库密码、GitLab密码信息、Docker私有仓库密码等,以便Jenkins可以和这些第三方的应用进行交互。

3.6.1 安装Credentials Binding插件

要在Jenkins使用凭证管理功能,需要安装Credentials Binding插件。

1
2
3.6.2 Jenkins管理GitLab凭证

前提:已安装Git插件和功能

3.6.2.1 用户密码类型

创建凭证:Jenkins->凭证->系统->全局凭证->添加凭证

1
3.6.2.2 SSH密码类型

SSH免密登录示意图


1

1、使用root用户生成公钥和私钥

ssh-keygen -t rsa

2、把生成的公钥在GitLab中进行设置

3、把生成的私钥在Jenkins中进行设置


私钥
3.7、Maven

在Jenkins集成服务器上,我们需要安装Maven来编译和打包项目

3.7.1 Jenkins构建Maven项目类型

Jenkins中自动构建项目的类型有很多,常用的有以下三种:

每种类型的构建其实都可以完成一样的构建过程与结果,只是在操作方式、灵活度等方面有所区别,在实际开发中可以根据自己的需求和习惯来选择。

3.8 流水线项目(Pipeline Project)
3.8.1 Pipeline简介
3.8.1.1 概念

Pipeline,简单来说,就是一套运行在Jenkins上的工作流框架,将原来独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。

3.8.1.2 使用Pipeline的好处(翻译官方)
3.8.1.3 如何创建Jenkins Pipeline?
3.8.2 安装Pipeline插件
1
3.8.3 Pipeline-声明式
1
2
3
4
5
3.8.4 Pipeline-脚本式
1
3.9 Jenkins常用的构建触发器

Jenkins内置4种构建触发器

3.9.1 触发远程构建
1

访问地址:http://192.168.66.101:8888/job/web_demo_pipeline/build?token=6666 远程触发自动构建

3.9.2 其他工程构建后触发
1
3.9.3 定时构建
1

定时字符串从坐往右分别为:分 时 日 月 周。一些定时表达式的例子:

1、每30分钟构建一次:H代表形参

H/30 * * * *   

10:02 10:32

2、每2个小时构建一次

H H/2 * * *

3、每天的8点、12点、22点构建一次,天构建3次(多个时间点中间用逗号隔开)

0 8,12,22 * * *

4、每天中午12点定时构建一次

H 12 * * * 
3.9.4 轮询SCM

轮询SCM是指定时扫描本地代码仓库的代码是否有变更,如果代码有变更就触发项目构建。注意:这种构建触发器,Jenkins会定时扫描本地整个项目的代码,增大系统的开销,不建议使用。

1
3.10 Jenkins Git hook自动触发构建

Jenkins的内置构建触发器中,轮询SCM可以实现GitLab代码更新,项目自动构建,但是该方案的性能不佳,那是否有更好的方案呢?有的,就是利用GitLab的webhook实现代码push到仓库,立即触发项目自动构建。

1
3.10.1 安装GitLab Hook插件

需要安装两个插件:GitLab Hook和GitLab


1
3.10.2 设置自动构建
1
2
3
4
5
3.11 Jenkins的参数化构建

有时在项目构建的过程中,我们需要根据用户的输入动态传入的一些参数,从而影响整个构建结果,这时我们可以使用参数化构建。

1
2
3
4
3.12 Jenkins配置邮箱服务器发送构建结果
3.12.1 安装Email Extension插件
1
3.12.2 配置
2
3
4
3.13 Jenkins+SonarQube代码审查

SonarQube是一个用于管理代码质量的开放平台,可以快速的定位代码中潜在的或者明显的错误。目前支持Java等二十几种编程语言的代码质量管理与检测。官网:https://www.sonarqube.org

四、Jenkins+Docker+SpringCloud微服务持续集成

4.1 持续集成流程说明
image.png
4.2 Docker
1
2
4.3 Harbor镜像仓库

Harbor(港口,港湾)是一个用于存储和分发Docker镜像的企业级Registry服务器。除了Harbor这个私有镜像仓库之外,还有Docker官方提供Registry。相对Registry,Harbor具有很多优势:

4.3.1 Harbor项目

Harbor的项目分为公开和私有的

五、Kubernetes实现Master-Slave分布式构建方案

5.1 传统Jenkins的Master-Slave方案的缺陷

以上种种问题,我们可以引入Kubernetes来解决。

5.2 Kubernetes简介

Kubernetes(简称K8S)是Google开源的容器集群管理系统,在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。其主要功能如下:

5.3 Kubernetes+Docker+Jenkins架构图
Kubernetes+Docker+Jenkins架构图
5.4 Kubernetes+Docker+Jenkins持续集成方案好处
5.5 Kubernetes架构
Kubernetes架构