1、持续集成及Jenkins介绍
2、Jenkins安装和持续集成环境配置
3、Jenkins构建Maven项目
4、Jenkins+Docker+SpringCloud微服务持续集成
5、基于Kubernetes/K8S构建Jenkins微服务持续集成平台

一、持续集成及Jenkins介绍

1.1.软件开发生命周期

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

  • 需求分析

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

  • 设计

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

  • 实现

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

  • 测试

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

  • 进化

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

1.2.软件开发瀑布模型

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

优势 劣势
简单易用和理解 各个阶段的划分完全固定,阶段之间产生大量的文档,极大地增加了工作量。
当前一阶段完成后,您只需要去关注后续阶段。 由于开发模型是线性的,用户只有等到整个过程的末期才能见
到开发成果,从而增加了开发风险。
为项目提供了按阶段划分的检查节点 瀑布模型的突出缺点是不适应用户需求的变化。

1.3.软件的敏捷开发

1.3.1.什么是敏捷开发?

敏捷开发(Agile Development)的核心是迭代开发(Iterative Development)与 增量开发 (Incremental Development)。
===何为迭代开发?===
对于大型软件项目,传统的开发方式是采用一个大周期(比如一年)进行开发,整个过程就是一次”大开发”;迭代开发的方式则不一样,它将开发过程拆分成多个小周期,即一次”大开发”变成多次”小开发”,每次小开发都是同样的流程,所以看上去就好像重复在做同样的步骤。举例来说,SpaceX 公司想造一个大推力火箭,将人类送到火星。但是,它不是一开始就造大火箭,而是先造一个最简陋的小火箭 Falcon 1。结果,第一次发射就爆炸了,直到第四次发射,才成功进入轨
道。然后,开发了中型火箭 Falcon 9,九年中发射了70次。最后,才开发 Falcon 重型火箭。如果SpaceX 不采用迭代开发,它可能直到现在还无法上天。
===何为增量开发?===
软件的每个版本,都会新增一个用户可以感知的完整功能。也就是说,按照新增功能来划分迭代。举例来说,房产公司开发一个10栋楼的小区。如果采用增量开发的模式,该公司第一个迭代就是交付一号楼,第二个迭代交付二号楼……每个迭代都是完成一栋完整的楼。而不是第一个迭代挖好10栋楼的地基,第二个迭代建好每栋楼的骨架,第三个迭代架设屋顶……
敏捷开发如何迭代?
虽然敏捷开发将软件开发分成多个迭代,但是也要求,每次迭代都是一个完整的软件开发周期,必须按照软件工程的方法论,进行正规的流程管理。

1.3.2.敏捷开发有什么好处?

==早期交付==
敏捷开发的第一个好处,就是早期交付,从而大大降低成本。 还是以上一节的房产公司为例,如果按照传统的”瀑布开发模式”,先挖10栋楼的地基、再盖骨架、然后架设屋顶,每个阶段都等到前一个阶段完成后开始,可能需要两年才能一次性交付10栋楼。也就是说,如果不考虑预售,该项目必须等到两年后才能回款。 敏捷开发是六个月后交付一号楼,后面每两个月交付一栋楼。因此,半年就能回款10%,后面每个月都会有现金流,资金压力就大大减轻了。
==降低风险===
敏捷开发的第二个好处是,及时了解市场需求,降低产品不适用的风险。 请想一想,哪一种情况损失比较小:10栋楼都造好以后,才发现卖不出去,还是造好第一栋楼,就发现卖不出去,从而改进或停建后面9栋楼?

1.4.什么是持续集成?

持续集成(Continuous integration ,简称 CI )指的是,频繁地(一天多次)将代码集成到主干。持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。通过持续集成,团队可以快速的从一个功能到另一个功能,简而言之,敏捷软件开发很大一部分都要归功于持续集成
image.png
根据持续集成的设计,代码从提交到生产,整个过程有以下几步。

  • 提交

流程的第一步,是开发者向代码仓库提交代码。所有后面的步骤都始于本地代码的一次提交(commit)。

  • 测试(第一轮)

代码仓库对commit操作配置了钩子(hook),只要提交代码或者合并进主干,就会跑自动化测试。

  • 构建

通过第一轮测试,代码就可以合并进主干,就算可以交付了。
交付后,就先进行构建(build),再进入第二轮测试。所谓构建,指的是将源码转换为可以运行的实际代码,比如安装依赖,配置各种资源(样式表、JS脚本、图片)等等。

  • 测试(第二轮)

构建完成,就要进行第二轮测试。如果第一轮已经涵盖了所有测试内容,第二轮可以省略,当然,这时构建步骤也要移到第一轮测试前面。

  • 部署

过了第二轮测试,当前代码就是一个可以直接部署的版本(artifact)。将这个版本的所有文件打包(tar fifilename.tar * )存档,发到生产服务器。

  • 回滚

一旦当前版本发生问题,就要回滚到上一个版本的构建结果。最简单的做法就是修改一下符号链接,指向上一个版本的目录。

1.5.持续集成的组成要素

  • 一个自动构建过程,从检出代码、 编译构建、 运行测试、 结果记录、 测试统计等都是自动完成的,无需人工干预。
  • 一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库,一般使用SVN或Git。
  • 一个持续集成服务器, Jenkins 就是一个配置简单和使用方便的持续集成服务器。

    1.6.持续集成的好处

    1、降低风险,由于持续集成不断去构建,编译和测试,可以很早期发现问题,所以修复的代价就少;
    2、对系统健康持续检查,减少发布风险带来的问题;
    3、减少重复性工作;
    4、持续部署,提供可部署单元包;
    5、持续交付可供使用的版本;
    6、增强团队信心;

    1.7.Jenkins介绍

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

    1.7.1.Jenkins的特征

  • 开源的Java语言开发持续集成工具,支持持续集成,持续部署。

  • 易于安装部署配置:可通过yum安装,或下载war包以及通过docker容器等快速实现安装部署,可方便web界面配置管理。
  • 消息通知及测试报告:集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知,生成JUnit/TestNG测试报告。
  • 分布式构建:支持Jenkins能够让多台计算机一起构建/测试。
  • 文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等。
  • 丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如git,svn,maven,docker等。

    二、Jenkins安装和持续集成环境

    image.png
    1)首先,开发人员每天进行代码提交,提交到Git仓库
    2)然后,Jenkins作为持续集成工具,使用Git工具到Git仓库拉取代码到集成服务器,再配合JDK,Maven等软件完成代码编译,代码测试与审查,测试,打包等工作,在这个过程中每一步出错,都重新再执行一次整个流程。
    3)最后,Jenkins把生成的jar或war包分发到测试服务器或者生产服务器,测试人员或用户就可以访问应用。

2.1.服务器列表

统一采用centos7

名称 IP地址 安装的软件
代码托管服务器 192.168.254.30 gitlab
持续集成服务器 192.168.254.31 Jenkins-2.190.3,JDK1.8,Maven3.6.2,Git,SonarQube
应用测试服务器 192.168.254.32 JDK1.8,Tomcat8.5

三、Jenkins-gitlab使用

3.1.安装Git插件和Git工具

为了让Jenkins支持从Gitlab拉取源码,需要安装Git插件以及在centos7上安装Git工具(要先安装,否则构建项目时,无法连接git)
管理插件中搜索Git安装即可

3.2.新建项目

image.png

3.3.使用gitlab账号密码拉取

image.png
添加凭据
image.png

image.png
image.png
image.png
image.png

3.4.使用SSH密钥拉取

SSH免密登录示意图
image.png

3.4.1.使用root用户生成公钥和私钥

  1. ssh-keygen -t rsa

在/root/.ssh/目录保存了公钥和使用
id_rsa:私钥文件
id_rsa.pub:公钥文件
image.png
image.png
image.png

五、持续集成环境-Maven安装和配置

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

5.1.安装maven

先上传Maven软件到Jenkins服务器上

  1. tar -xzf apache-maven-3.8.4-bin.tar.gz
  2. mkdir -p /opt/maven
  3. mv apache-maven-3.8.4/* /opt/maven

image.png

5.2.配置环境变量

  1. vi /etc/profile
  1. export JAVA_HOME=/lib/jvm/java-11-openjdk
  2. export MAVEN_HOME=/usr/share/maven
  3. export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
  1. source /etc/profile #配置生效
  2. mvn -v

5.3.全局工具配置关联JDK和Maven

Jenkins->Global Tool Configreation->JDK->新增JDK,配置如下:
image.png
image.png
image.png
image.png
image.png

5.4.修改Maven的settings.xml

  1. mkdir /root/repo #创建本地仓库目录
  2. vi /opt/maven/conf/settings.xml

本地仓库改为:

  1. <localRepository>/root/repo/</localRepository>

添加阿里云私服地址:

  1. <mirror>
  2. <id>alimaven</id>
  3. <name>aliyun maven</name>
  4. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  5. <mirrorOf>central</mirrorOf>
  6. </mirror>

5.5.测试Maven是否配置成功

image.png
image.png
image.png
打包后存放的位置

  1. cd /var/lib/jenkins/jobs/xxx项目/workspace/target

六、新建一台服务器,搭建tomcat

6.1.安装tomcat

把tomcat压缩包上传到服务器

  1. yum install java-1.8.0-openjdk* -y
  2. tar -xzf apache-tomcat-8.5.47.tar.gz
  3. mkdir -p /opt/tomcat
  4. mv /root/apache-tomcat-8.5.47/* /opt/tomcat
  5. /opt/tomcat/bin/startup.sh

注意:关闭服务器防火墙或者打开端口权限

6.2.访问成功

image.png

6.3.tomcat权限配置

  1. cd tomcat/conf/
  1. vi tomcat-users.xml

添加如下内容

  1. <tomcat-users>
  2. <role rolename="tomcat"/>
  3. <role rolename="role1"/>
  4. <role rolename="manager-script"/> #有脚本方式管理接口访问权限和“服务器状态”页面查看权限
  5. <role rolename="manager-gui"/> #无权限访问“host管理”页面,但“APP管理”和“服务器状态”页面有查看权限
  6. <role rolename="manager-status"/> #只有“服务器状态”页面查看权限
  7. <role rolename="admin-gui"/> #可访问“host管理”页面,但“APP管理”和“服务器状态”页面无查看权限
  8. <role rolename="admin-script"/> #只有host-manager脚本方式管理接口访问权限
  9. <user username="tomcat" password="tomcat" roles="manager-gui,manager-script,tomcat,admin-gui,admin-script"/>
  10. </tomcat-users>

用户名和密码都是tomcat
注意:为了能够让刚才配置的用户登录到tomcat,还需要修改以下配置

  1. vi /opt/tomcat/webapps/manager/META-INF/ccontext.xml
  1. <!--
  2. <Valve className="org.apache.catalina.valves.RemoteAddrValve"
  3. allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
  4. -->

把上面这段注释掉即可

6.4.重启tomcat,访问测试

  1. /opt/tomcat/bin/shutdown.sh
  2. /opt/tomcat/bin/startup.sh

访问首页,输入tomcat账号密码,即可访问成功
image.png
image.png

七、Jenkins构建Maven项目

7.1.Jenkins构建的项目类型介绍

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

  • 自由风格软件项目(FreeStyle Project)
  • Maven项目
  • 流水线项目(Pipeline Project)

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

7.2.自由风格项目构建

下面演示创建一个自由风格项目来完成项目的集成过程:

拉取代码->编译->打包->部署

7.2.1.拉取代码

7.2.1.1.创建项目

image.png

7.2.1.2.部署

把项目部署到远程的Tomcat服务器
Jenkins本身无法实现远程部署到Tomcat的功能,需要安装Deploy tocontainer插件实现
image.png
安装完插件后,回到项目配置,最底部,构建后配置,选择部署jar/war到容器
image.png
重新构建,查看构建日志,传输完成
image.png
查看tomcat服务器
image.png

7.3.Jenkins构建maven项目

安装Maven Integration插件
创建maven项目

7.4.Jenkins构建pipeline流水线项目

7.4.1.pipeline简介

7.4.1.1.概念

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

7.4.1.2.使用pipeline有以下好处(官方文档)

代码:pipeline以代码的形式实现,通常被检入源代码控制,使团队能够编辑,审查和迭代其传送流程。
持久:无论是计划内的还是计划外的服务器重启,pipeline都是可恢复的。
可停止:pipeline可接收交互式输入,以确定是否继续执行pipeline。
多功能:pipeline支持现实世界中复杂的持续交付要求。它支持fork/join、循环执行,并行执行任务的功能。
可扩展:pipeline插件支持其DSL的自定义扩展,以及与其他插件集成的多个选项。

7.4.1.3.如何创建Jenkins pipeline

  • pipeline脚本是由Groovy语言实现的
  • pipeline支持两种语法:Declarative(声明式)和Scripted pipeline(脚本式)语法
  • pipeline也有两种创建方法:可以直接在Jenkins的Web UI界面中输入脚本;也可以通过创建一个Jenkinsfile脚本文件放入项目源码库中(一般我们都推荐在Jenkins中直接从源代码控制(SCM)中直接载入Jenkinsfile pipeline这种方法)。

    7.4.2.构建过程

    安装pipeline插件
    image.png
    安装插件后,创建项目的时候多了“流水线”类型
    image.png

7.4.3.脚本

7.4.3.1.script脚本

image.png
image.png

image.png
image.png

7.4.3.2.SCM

刚才我们都是直接在Jenkins的UI界面编写pipeline代码,这样不方便脚本维护,建议把pipeline脚本放在项目中(一起进行版本控制)
在项目根目录建立Jenkinsfile文件,把内容复制到该文件中
image.png
image.png
image.png

7.4.4.常用的构建触发器

Jenkins内置4种构建触发器

  • 触发远程构建
  • 其他工厂构建后触发
  • 定时构建
  • 轮询SCM

    7.4.4.1.触发远程构建

    image.png
    Use the following URL to trigger build remotely: JENKINS_URL/job/testpipeline/build?token=TOKEN_NAME or /buildWithParameters?token=TOKEN_NAME

7.4.4.2.其他工程构建后触发

image.png

7.4.4.3.定时构建

image.png
定时字符串从左往右分别为:分 时 日 月 周

7.4.4.4.轮询SCM

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

7.4.5.Git hook自动触发构建

刚才我们看到在Jenkins的内置构建触发器中,轮询SCM可以实现gitlab代码更新,项目自动创建,但是该方案的性能不佳。那有没有更好的方案呢?有的,就是利用gitlab的webhook实现代码push到仓库,立即触发项目自动构建。
image.png
安装gitlab hook插件
需要安装两个插件
Gitlab Hook和Gitlab
image.png
或者安装Generic Webhook Trigger这个插件
image.png
生成一个API TOKEN
image.png
查看凭证ID,即token
image.png
image.png

3、配置Gitlab Hook
登录Gitlab进入某个项目》Settings》Add webhook
image.png
URL填写

  1. http://root:26752d95-d6db-4182-b7f9-12667043cb0c@192.168.254.130:8888/generic-webhook-trigger/invoke
  2. 用户名 TOKEN/ID IP地址 固定格式

点击保存
报错如下:
image.png
解决方法:

这是因为新版的gitlab为了安全默认禁止了本地局域网地址调用web hook,我们在设置里允许就行,具体步骤如下:
Settings》Network》Outbound requests》Expand》勾选 Allow requests to the local network from web hooks and services 或者文本域中添加白名单》Save Changes
image.png
image.png
image.png
测试连接
image.png
报错,无法连接成功
image.png
Jenkins开放gitlab连接设置
image.png
image.png

image.png

7.4.6.Jenkins-Gitlab实现自动触发构建

1.gitlab端设置API token
image.png
image.png
Jenkins配置Gitlab token
image.png
Jenkins全局配置中测试gitlab连接
image.png

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

在Jenkins服务器中安装
image.png
image.png
image.pngimage.png
image.pngimage.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.pngimage.png

image.png
image.png
image.png
image.png
image.png
image.png
image.pngimage.pngimage.pngimage.png
image.pngimage.png
image.png

image.png
image.png
image.png
image.pngimage.png
image.png
image.png
image.pngimage.png
image.png
image.png
image.png
image.png
image.png
image.png
image.pngimage.png
image.pngimage.png
image.pngimage.pngimage.png
image.png
image.png
image.pngimage.pngimage.pngimage.pngimage.png
image.png
image.png
image.png
image.pngimage.pngimage.pngimage.pngimage.pngimage.png
image.png
image.png
image.png
image.png
image.pngimage.png
image.png
image.pngimage.pngimage.pngimage.png
image.png
image.pngimage.png
image.png
image.pngimage.pngimage.pngimage.png
image.png
image.png
image.pngimage.png
image.png
image.png
image.png
image.pngimage.pngimage.pngimage.pngimage.png
image.pngimage.pngimage.pngimage.png
image.png
image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png