持续集成Jenkins.md 23 KB

项目部署_持续集成

目标:

  • 能够理解什么是持续集成
  • 能够完成jenkins环境的搭建
  • 能够完成jenkins插件的安装及配置
  • 能够完成Dockerfile的配置(构建微服务Docker镜像)
  • 能够完成项目的部署与持续交付

1 持续集成

1.1 软件开发生命周期

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

1602688283615

  • 需求分析

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

  • 设计

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

  • 实现

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

  • 测试

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

  • 进化

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

项目立项前:

  • 产品经理或者运营市场调研人员-需求
  • 项目立项
    • 产品编写需求原型
  • 需求评审会
    • 产品经理(讲解需求)
    • 研发(后端,前端,移动端)
    • 测试
    • 需求评审会产出结果
    • 项目可行性报告
    • 项目开发时间(前端+后端)
    • 项目经理分发任务:10个人,每人负责5个接口
    • 前后端联调时间
    • 测试预估编写测试用例

项目立项后:

开发,联调测试,测试,上线

  • 开发环境-开发的服务器,数据库,第三方账户,测试地址
  • (联调)测试环境-测试环境服务器,数据库,第三方账户。发送测试邮件给研发,运维
  • 生产环境(运维)
  • 禅道领取自己任务、bug,变更状态

1.2 软件开发瀑布模型

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

下图对软件开发模型的一个阐述。

1603172708376

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

1.3 软件的敏捷开发

  • 什么是敏捷开发?

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

  • 何为迭代开发?

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

举例来说,SpaceX 公司想造一个大推力火箭,将人类送到火星。但是,它不是一开始就造大火箭,而是先造一个最简陋的小火箭 Falcon 1。结果,第一次发射就爆炸了,直到第四次发射,才成功进入轨道。然后,开发了中型火箭 Falcon 9,九年中发射了70次。最后,才开发 Falcon 重型火箭。如果SpaceX 不采用迭代开发,它可能直到现在还无法上天。

  • 何为增量开发?

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

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

  • 敏捷开发如何迭代?

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

1603172952271

  • 敏捷开发有什么好处?

    • 早期交付

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

    • 降低风险

    敏捷开发的第二个好处是,及时了解市场需求,降低产品不适用的风险。 请想一想,哪一种情况损失比较小:10栋楼都造好以后,才发现卖不出去,还是造好第一栋楼,就发现卖不出去,从而改进或停建后面9栋楼?

1.4 什么是持续集成

持续集成( Continuous integration , 简称 CI )指的是,频繁地(一天多次)将代码集成到主干,编码->构建-》集成--》测试-》交付---》》部署。

1604036908430

持续集成的组成要素

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

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

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

1603175821292

1.5 持续集成的好处

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

1.6 项目部署

  1. 将day20代码作为今天项目打包工程。将工程导入到idea中

image-20230319225001154

  1. 在maven窗口中选中父工程,执行install安装命令

image-20230319225042394

image-20230319225634108

  1. 找到本地仓库中打包完的项目gmall-gateway执行jar包,发现错误

  1. 原因:在需要部署运行springboot项目中缺少springbootmaven打包插件

  2. 解决:在gmall-gatewaygmall-service这两个模块中增加插件

    <build>
           <finalName>app</finalName>
           <plugins>
               <plugin>
                   <groupId>org.springframework.boot</groupId>
                   <artifactId>spring-boot-maven-plugin</artifactId>
               </plugin>
           </plugins>
       </build>
    
  3. 再次执行install安装,在本地进行测试,出现以下错误

image-20230319230653168

  1. 原因引用 Nacos中配置时,编码问题,导致的错误

java -Dfile.encoding=utf-8 -jar gmall-gateway-1.0.jar

  1. 将测试过jar包上传到linux服务器

    1. 创建文件夹存放jar包 mkdir /opt/gmall
    2. 将jar包上传到目录中
    3. 执行java -jar xxxx.jar
  2. 后台采用守护进程启动springboot应用

    1. 后台启动项目:nohup java -Dfile.encoding=utf-8 -jar gmall-gateway-1.0.jar
    2. 实时查看日志:tail -f nohup.out -n 100

2 Jenkins安装配置

2.1 Jenkins介绍

1603175880959

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

Jenkins的特征:

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

Jenkins安装和持续集成环境配置

1603176000242

1 )首先,开发人员每天进行代码提交,提交到Git仓库

2)然后,Jenkins作为持续集成工具,使用Git工具到Git仓库拉取代码到集成服务器,再配合JDK,Maven等软件完成代码编译,代码测试与审查,测试,打包等工作,在这个过程中每一步出错,都重新再执行一次整个流程。

3)最后,Jenkins把生成的jar或war包分发到测试服务器或者生产服务器,测试人员或用户就可以访问应用。

2.2 Jenkins环境搭建

2.2.1 war包安装

  1. 将课后资料中jenkins文件夹上传到虚拟机 /root 目录下

image-20220530101811140

  1. 给启动脚本权限

    chmod 777 start.sh
    
  2. 执行启动脚本启动jenkins服务

    ./start.sh
    
  3. 管理后台初始化设置 http://192.168.200.128:9090/

image-20230319231731783

看图如图页面:

需要输入管理密码, 在以下位置查看:

cat /root/.jenkins/secrets/initialAdminPassword

如图:

14ff0f85aa复制到页面的输入框,点击右下角的继续

选择推荐安装插件设置,把建议的插件都安装上

1569564606846

这一步等待时间较长, 如果安装插件失败,修改Jenkins插件源

image-20230320140545349

安装完成之后, 创建管理员用户:

用户名/密码:atguigu/123456

image-20220714223016807

配置访问地址:

配置完成之后, 会进行重启, 之后可以看到管理后台:

1569565238541

2.2.2 Jenkins插件安装

在实现持续集成之前, 需要确保以下插件安装成功。

  • Maven Integration plugin: Maven 集成管理插件。
  • Docker plugin: Docker集成插件。
  • Gitee:gitee插件

安装方法:

  1. 进入【系统管理(Manage Jenkins)】-【插件管理(Manage Plugins)】

  2. 点击标签页的【可选插件】

在过滤框中搜索插件名称

1569742624798

  1. 勾选插件, 点击直接安装即可。

2.2.3 Git安装配置

  1. 方式一:yum 安装方式git

    yum -y install git
    
  2. 如果之前有安装旧版本, 先做卸载, 没有安装则忽略

    yum remove git
    
  3. 检查git版本

    [root@localhost jenkins]# git version
    git version 1.8.3.1
    

2.2.4 Maven安装配置

  1. 下载安装包

下载地址: https://maven.apache.org/download.cgi(资料里有)

   mkdir /opt/soft

将资料里apache-maven-3.6.3-bin.tar.gz上传到soft目录下

  1. 解压安装包

    cd /opt/soft
    tar -zvxf apache-maven-3.6.3-bin.tar.gz
    
  2. 配置

环境变量配置

   vi /etc/profile

增加以下配置

export MAVEN_HOME=/opt/soft/apache-maven-3.6.3
export PATH=$PATH:$MAVEN_HOME/bin

如果权限不够,则需要增加当前目录的权限

chmod 777 /opt/soft/apache-maven-3.6.3/bin/

刷新配置

source /etc/profile

查看maven

mvn -v

可以看到输出内容

1613394017381

创建maven本地仓库文件夹

mkdir   /opt/soft/apache-maven-3.6.3/repository

需要对这个目录设置权限

chmod 777 /opt/soft/apache-maven-3.6.3/repository

修改镜像仓库配置:

vi /opt/soft/apache-maven-3.6.3/conf/settings.xml  

指定本地仓库目录

<localRepository>/opt/soft/apache-maven-3.6.3/repository</localRepository>

如图:

1613383786864

配置阿里云镜像

<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>https://maven.aliyun.com/repository/public</url>
    <mirrorOf>central</mirrorOf>        
</mirror>

如图:

1613383815577

3 持续集成生产实践配置

3.1 Jenkins工具配置

  1. 进入【系统管理】--> 【全局工具配置】

1603200359461

  1. MAVEN配置全局设置

1603200435502

  1. 指定JDK配置 :/usr/local/jdk/

  1. 指定MAVEN 目录 /opt/soft/apache-maven-3.6.3

  1. 指定DOCKER目录 /usr/bin/docker

1603200520246

如果不清楚docker的安装的目录,可以使用whereis docker 命令查看docker的安装的目录

3.2 基础依赖打包配置

3.2.1 上传项目到gitee

将本地项目上传到gitee仓库中

  1. 提供Git忽略文件

  2. 在gitee新建仓库,用于存放项目

image-20230320001049149

  1. 进入管理中修改 仓库为 开源

image-20220210104402243

  1. 上传之前将忽略文件 .gitignore

image-20230320000751442

  1. 在gitee上创建仓库,将代码上传到gitee仓库

  2. 在本地git bash执行

    git init
    touch README.md
    git add README.md
    git add .
    git commit -m "first commit"
    git remote add origin https://gitee.com/xxx.git
    git push -u origin "master"
    

3.2.2构建基础工程

在微服务运行之前需要在本地仓库中先去install所依赖的jar包,所以第一步应该是从git中拉取代码,并且把基础的依赖部分安装到仓库中

(1)新创建一个item,起名为sph-parent

1603202842506

(2)配置当前sph-parent

  • 描述项目

  • 源码管理:

选中git,输入git的仓库地址(前提条件,需要把代码上传到gitee仓库中),最后输入getee的用户名和密码

如果没有配置Credentials,可以选择添加,然后输入用户名密码即可

  • 其中构建触发器构建环境暂不设置

  • 设置构建配置

选择Invoke top-level Maven targets

1603557353285

​ maven版本:就是之前在jenkins中配置的maven

​ 目标:输入maven的命令 clean install -Dmaven.test.skip=true 跳过测试安装

1603557446935

(3)启动项目

创建完成以后可以在主页上看到这个item

启动项目:点击刚才创建的项目,然后Build Now

在左侧可以查看构建的进度:

点进去以后,可以查看构建的日志信息

构建的过程中,会不断的输入日志信息,如果报错也会提示错误信息

jenkins会先从git仓库中拉取代码,然后执行maven的install命令,把代码安装到本地仓库中

最终如果是success则为构建成功

image-20230320001844868

当构建成功完成后,持续集成服务器结果

  • 商品汇项目所有模块-安装到本地仓库 /opt/soft/apache-maven-3.6.3/repository/com/atguigu
  • Jenkins工作空间下包含尚品汇项目所有最新源码 /root/.jenkins/workspace

3.3 微服务打包配置(jar包)

(1)创建启动/停止服务脚本,在Jenkins中构建项目gmall-gateway-1.0.jar成功后,调用脚本完成项目启动,停止

在linux目录中创建运行目录

mkdir /opt/app
cd /opt/app

新建start.sh脚本

vi start.sh

内容如下

#!/bin/bash
echo "应用启动中...."
nohup java -Dfile.encoding=utf-8 -jar gmall-gateway-1.0.jar > gmall-gateway.log 2>&1 &
sleep 10
tail -n 200 gmall-gateway.log
echo "启动成功"

新建stop.sh脚本

vi stop.sh

内容如下:

#!/bin/bash
echo "stop gmall-gateway"
pid=`ps -ef | grep gmall-gateway-1.0.jar | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]
then
echo “应用进程id:$pid”
kill -9 $pid
echo "应用已关闭."
rm -f gmall-gateway.log
fi

(2)新建item,以gmall-gateway微服务为例

(2)配置

  • 概述

  • 源码管理-选择无因为父工程打包后,所有工程都已经被打包

添加执行shell命令

1603558910209

添加内容如下:

#*.sh文件的读、写、运行权限
chmod 777 /opt/app/*.sh
# 进入运行目录
cd /opt/app
#执行停止脚本
./stop.sh
# 将运行目录中的jar包删除
rm -rf /opt/app/gmall-gateway-1.0.jar
# 复制新的jar包
cp /root/.jenkins/workspace/sph-parent/gmall-gateway/target/*.jar /opt/app/
# 项目启动后不会被Jenkins杀掉
BUILD_ID=dontKillMe
#执行启动脚本
./start.sh

到此就配置完毕了,保存即可

(3)构建该项目 Build Now

3.4 服务集成Docker配置

3.4.1 构建基础jdk 镜像

  1. 下载基础镜像centos:7

    docker pull centos:7
    
  2. 将资料中jdk8安装包并上传至已创建的特定目录(此处使用/opt/soft/jdkdockerimage)

    mkdir -p /opt/soft/jdkdockerimage
    

    image-20220106012830482

  3. 相同目录下创建vi Dockerfile

    #1、指定构建的基础镜像
    FROM centos:7
     
    #2、指明该镜像的作者和电子邮箱
    MAINTAINER atguigu "atguigu@qq.com"
     
    #3、在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
    WORKDIR /usr/local/docker
     
    #4、一个复制命令,把jdk安装文件复制到镜像中,语法 ADD SRC DEST ,ADD命令具有自动解压功能
    ADD jdk-8u144-linux-x64.tar.gz /usr/local/docker
     
    #5、配置环境变量,此处目录为tar.gz包解压后的名称,需提前解压知晓:
    ENV JAVA_HOME=/usr/local/docker/jdk1.8.0_144
    ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV PATH=$JAVA_HOME/bin:$PATH
    
    CMD ["java","-version"]
    
  4. 在Dockerfile所在目录执行构建命令

    docker build -t jdk:8 .
    
  5. 测试jdk容器,进入容器测试

    docker run -it --name=jdk1 jdk:8 /bin/bash
    

image-20220106130516583

3.4.2 构建任务(微服务镜像)

https://spring.io/guides/gs/spring-boot-docker/

每个微服务使用的dockerfile的方式进行构建镜像后创建容器,需要在每个微服务中添加docker相关的配置

(1)在/opt/app目录下创建dock-gateway.sh

# 查看进程是否存在
docker ps | grep  gmall-gateway-docker &> /dev/null
if [ $? -ne 0 ]
then
  echo "容器不存在"
else
  echo "容器存在"
  #删除容器
  docker stop  gmall-gateway-docker
  docker rm -f gmall-gateway-docker
fi
  echo "start docker image run"
  cd /root/.jenkins/workspace/sph-parent/gmall-gateway
  docker build -t gmall-gateway-docker .
  docker run -d --name=gmall-gateway-docker -p 80:80 gmall-gateway-docker

(2)在idea中每个微服务(以gateway微服务为例)的gateway模块根目录下创建Dockerfile文件,如下:

# 设置JAVA版本
FROM jdk:8
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
CMD java -Dfile.encoding=utf-8 -jar app.jar

1603556179776

(3)将新增Dockerfile推送到git远程仓库。运行 基础项目 构建任务

(4)在Jenkins创建一个Maven项目构建任务gmall-gateway-docker

添加描述

源码设置

选择执行shell

1630118184952

在execute shell中设置

#*.sh文件的读、写、运行权限
chmod 777 /opt/app/*.sh
cd /opt/app
./dock-gateway.sh

先执行sph-parent模块的构建,拉取最新代码

在执行gmall-gateway-docker模块的构建

3.5 构建触发器配置

  1. 在任务中勾选Gitee webhook触发构建选项,前提是Jenkins安装过了Gitee插件

  1. 点击生成访问秘钥。提前复制出来,在gitee仓库中配置会使用到

  1. 登录gitee仓库选择管理

  1. 完善webhook

url从构建任务中复制:http://192.168.137.136:9090/sph-parent

image-20220106141720796