[关闭]
@xushengkai 2023-02-10T00:26:34.000000Z 字数 11849 阅读 445

Jenkins构建企业CICD持续集成平台

自动化

[TOC]

一.CI/CD

CI(Continuous Integration,持续集成)

持续集成是指多名开发者在开发不同功能代码的过程当中,可以频繁的将代码行合并到一起并切相互不影响工作。
持续集成的目的,是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。

CD(Continuous Deployment,持续部署)

是基于某种工具或平台实现代码自动化的构建、测试和部署到线上环境以实现交付高质量的产品,持续部署在某种程度上代表了一个开发团队的更新迭代速率。
持续部署(continuous deployment)是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。
持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。

CD(Continuous Delivery,持续交付)

持续交付是在持续部署的基础之上,将产品交付到线上环境,因此持续交付是产品价值的一种交付,是产品价值的一种盈利的实现。
持续交付指的是频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。
持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。持续交付优先于整个产品生命周期的软件部署,建立在高水平自动化持续集成之上。

持续集成/持续发布

开发(git) -->git主库-->jenkins(git+jdk+tomcat+maven打包+测试)-->发布到tomcat服务器

jenkins

Jenkins是帮我们将代码进行统一的编译打包、还可以放到tomcat容器中进行发布。
意思是我们通过配置,将以前:编译、打包、上传、部署到Tomcat中的过程交由Jenkins,Jenkins通过给定的代码地址URL,将代码拉取到其“宿主服务器”(Jenkins的安装位置),进行编译、打包和发布到web容器中。

二.Jenkins

Jenkins概述

是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控一些定时执行的任务。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。
jenkins通常与版本管理工具(SCM)、构建工具结合使用;常用的版本控制工具有SVN、GIT。jenkins构建工具有Maven、Ant、Gradle。

Jenkins目标

是监控软件开发流程
快速显示问题
提高开发效率
过程控制

Jenkins特性

  • 易于安装: 不需要安装、不需要数据库,只需通过java -jar jenkins.war或部署到一个servlet容器中
  • 易于配置:所有的配置都可能通过jenkins提供的web界面完成,当然如果你喜欢,也可以通过手动修改xml文件进行配置
  • 测试报告:生成JUnit或TestNG的测试报告.集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知。
  • 文件识别: jenkins能跟踪每次构建生成哪些jar包以及使用哪个版本的jar包
  • 分布式构建: 支持Jenkins能够让多台计算机一起构建/测试。
  • 插件支持: jenkins可以通过第三方插件扩展,也可以根据团队需要开发插件
  • 任务(Job)和构建(build):任务:(Job)是Jenkins的一个执行计划,是一系列操作的集合。构建:是Jenkins的任务的一次运行。

工作流程图

在这里插入图片描述

  1. 开发者检入代码到源代码仓库。
  2. CI系统会为每一个项目创建了一个单独的工作区。当预设或请求一次新的构建时,它将把源代码仓库的源码存放到对应的工作区。
  3. CI系统会在对应的工作区内执行构建过程。
  4. (配置如果存在)构建完成后,CI系统会在一个新的构件中执行定义的一套测试。完成后触发通知(Email,RSS等等)给相关的当事人。
  5. (配置如果存在)如果构建成功,这个构件会被打包并转移到一个部署目标(如应用服务器)或存储为软件仓库中的一个新版本。软件仓库可以是CI系统的一部分,也可以是一个外部的仓库,诸如一个文件服务器或者像Java.net、 SourceForge之类的网站。
  6. CI系统通常会根据请求发起相应的操作,诸如即时构建、生成报告,或者检索一些构建好的构件。
    Jenkins就是这么一个CI系统。之前叫做Hudson。

三.Jenkins实战案例

部署git

环境:一台4G内存的全新cent os 7虚拟机

  1. 安装依赖包
  1. [root@192 ~]# yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker

2.git官网下载最新版本git

  1. [root@192 ~]# wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.9.5.tar.gz
  2. [root@192 ~]# ls
  3. anaconda-ks.cfg git-2.9.5.tar.gz

3.安装git

  1. #解压安装包
  2. [root@192 ~]# tar xf git-2.9.5.tar.gz
  3. [root@192 ~]# cd git-2.9.5/
  4. #编译源码包
  5. [root@192 git-2.9.5]# make prefix=/usr/local/git all
  6. #源码安装
  7. [root@192 git-2.9.5]# make prefix=/usr/local/git install

修改环境变量

  1. [root@192 git-2.9.5]# cd
  2. [root@192 ~]# vim /etc/bashrc
  3. #在最后一行添加环境变量
  4. PATH=$PATH:$HOME/bin:/usr/local/git/bin
  5. #立即生效
  6. [root@192 ~]# source /etc/bashrc
  7. #测试是否安装成功
  8. [root@192 ~]# git --version
  9. git version 1.8.3.1

关于bashrc和profile
/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次!!!登录!!!时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置.
/etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.

jdk环境部署

1.下载软件包

我提前下载好了,拷贝到我虚拟机上
注意:不能用jdk9和jdk10,和这个版本不兼容

  1. [root@192 ~]# rz
  2. [root@192 ~]# ls
  3. git-2.9.5.tar.gz jdk-8u151-linux-x64.tar.gz

2.解压安装

  1. [root@192 ~]# tar xf jdk-8u151-linux-x64.tar.gz -C /usr/local/
  2. [root@192 ~]# cd /usr/local/
  3. [root@192 local]# ls
  4. bin games include lib libexec share
  5. etc git jdk1.8.0_151 lib64 sbin src
  6. [root@192 local]# mv jdk1.8.0_151/ jdk

3.修改环境变量

  1. [root@192 ~]# vim /etc/bashrc
  2. #在最后一行添加环境变量
  3. JAVA_HOME=/usr/local/jdk
  4. export PATH=$PATH:$JAVA_HOME/bin
  5. #刷新立即生效
  6. [root@192 ~]# source /etc/bashrc

4.测试jdk

  1. [root@192 ~]# java -version
  2. java version "1.8.0_151"
  3. Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
  4. Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)

提示:如果系统中已安装java-1.8.0-openjdk。java-1.8.0-openjdk 。java-1.8.0-openjdk请卸载他们。

部署maven

1.下载和解压maven

官网地址:https://maven.apache.org/download.cgi#files
我提前下载好了,拷贝到我的虚拟机上

  1. [root@192 ~]# ls
  2. apache-maven-3.5.3-bin.tar.gz
  3. #解压
  4. [root@192 ~]# tar xvzf apache-maven-3.5.3-bin.tar.gz -C /usr/local/
  5. [root@192 ~]# mv /usr/local/apache-maven-3.5.3/ /usr/local/maven

2.修改环境变量

  1. [root@192 ~]# vim /etc/bashrc
  2. #在最后一行添加环境变量
  3. export M2_HOME=/usr/local/maven
  4. export M2=$M2_HOME/bin
  5. PATH=$M2:$PATH:$HOME/bin:/usr/local/git/bin
  6. export JAVA_HOME=/usr/local/jdk
  7. export PATH
  8. #刷新立即生效
  9. [root@192 ~]# source /etc/bashrc

3.测试maven

  1. [root@192 ~]# mvn -version
  2. Apache Maven 3.5.3 (3383c37e1f9e9b3bc3df5050c29c8aff9f295297; 2018-02-25T03:49:05+08:00)
  3. Maven home: /usr/local/maven
  4. Java version: 1.8.0_151, vendor: Oracle Corporation
  5. Java home: /usr/local/jdk/jre
  6. Default locale: zh_CN, platform encoding: UTF-8
  7. OS name: "linux", version: "3.10.0-862.el7.x86_64", arch: "amd64", family: "unix"

部署tomcat

提前在官网下载的包,直接拷贝到虚拟机

1.解压安装

  1. [root@192 ~]# ls
  2. apache-tomcat-9.0.1.tar.gz git-2.9.5
  3. [root@192 ~]# tar xvzf apache-tomcat-9.0.1.tar.gz -C /usr/local/
  4. [root@192 ~]# mv /usr/local/apache-tomcat-9.0.1/ /usr/local/tomcat

2.定义Tomcat所需环境变量

  1. [root@192 ~]# vim /etc/profile
  2. #在最后一行添加环境变量
  3. CATALINA_HOME=/usr/local/tomcat
  4. export CATALINA_HOME
  5. #刷新立即生效
  6. [root@192 ~]# source /etc/profile

3.启动tomcat

  1. [root@192 ~]# /usr/local/tomcat/bin/startup.sh
  2. Using CATALINA_BASE: /usr/local/tomcat
  3. Using CATALINA_HOME: /usr/local/tomcat
  4. Using CATALINA_TMPDIR: /usr/local/tomcat/temp
  5. Using JRE_HOME: /usr/local/jdk
  6. Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
  7. Tomcat started.

4.测试tomcat

打开主机浏览器输入服务器加端口
192.168.200.152:8080

在这里插入图片描述
5.关闭tomcat

  1. [root@192 ~]# /usr/local/tomcat/bin/shutdown.sh
  2. Using CATALINA_BASE: /usr/local/tomcat
  3. Using CATALINA_HOME: /usr/local/tomcat
  4. Using CATALINA_TMPDIR: /usr/local/tomcat/temp
  5. Using JRE_HOME: /usr/local/jdk
  6. Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar

部署Jenkins

在这里插入图片描述

1.官网下载jenkins

官方网站: http://updates.jenkins-ci.org/download/war
请下载对应版本jenkins拷贝至虚拟机

  1. [root@192 ~]# rz
  2. [root@192 ~]# ls
  3. jenkins.war

2.部署jenkins.war到tomcat下

  1. [root@192 ~]# cp jenkins.war /usr/local/tomcat/webapps/

jenkins密码忘了,可以重置它,通过一下命令

  1. 关闭tomcat /usr/local/tomcat/bin/shutdown.sh
  2. rm -rf /usr/local/tomcat/webapp/jenkins*
  3. rm -rf ~/.jenkins*
  4. cp jenkins.war /usr/local/tomcat/webapps/
  5. 启动tomcat即可访问jenkins

3.启动tomcat

  1. [root@192 ~]# /usr/local/tomcat/bin/startup.sh
  2. Using CATALINA_BASE: /usr/local/tomcat
  3. Using CATALINA_HOME: /usr/local/tomcat
  4. Using CATALINA_TMPDIR: /usr/local/tomcat/temp
  5. Using JRE_HOME: /usr/local/jdk
  6. Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
  7. Tomcat started.

:注意:启动tomcat会自动解压webapps下的war包

登录jenkins

http://192.168.200.153:8080/jenkins

在这里插入图片描述
1.添入以下文件密码到上图页面中

  1. [root@192 ~]# cat .jenkins/secrets/initialAdminPassword
  2. 295463bcd9f541bd86bb6d9cba798391
  3. #注意:每个人的都不一样

将本地密码复制并粘贴到下面,点击继续

在这里插入图片描述

选择推荐的插件安装

在这里插入图片描述
2.等待安装完成
在这里插入图片描述
因为网速原因,插件可能下载失败,没关系,把他们记录下来,点击继续,进去之后手动重新安装未安装好的插件
也可以重试,继续下载安装

3.创建用户
在这里插入图片描述
4.jenkins的分享地址

在这里插入图片描述
5.前台安装完成

如果这个页面过一会消失了。并且常时间空白。可能需要你登录了。换个浏览器,打开相同的地址就会出现认证页面。

在这里插入图片描述
6.欢迎界面
在这里插入图片描述

四.管理插件

简介

我们配置的是 git + maven 方式的 自动化部署 所以git和maven的相关插件是必须的 还有一个ssh用于机器间的文件传送
安装的过程请耐心等待

安装插件Deploy to container

作用:
支持自动化将代码部署到tomcat容器

安装过程:
系统管理-->插件管理-->可选插件-->过滤Deploy to container-->勾选,点击下边的按钮:直接安装,这个可能时间较久,等待即可。

安装图示

管理插件

在这里插入图片描述

搜索插件,安装

在这里插入图片描述

安装完以后,可以返回首页继续安装,也可以重启
在这里插入图片描述

安装插件Maven Integration

作用:
jenkins 利用maven编译,打包,所需插件

安装图示和上面一样

在这里插入图片描述
在这里插入图片描述

安装git相关3个插件

安装GitHub Authentication

在这里插入图片描述
在这里插入图片描述

安装GitHub Branch Source,在可选插件中没用,在已安装中搜索,显示已安装

在这里插入图片描述

安装GitHub Organization Folder

在这里插入图片描述
在这里插入图片描述

安装插件:Publish Over SSH

在这里插入图片描述

所有的插件已经安装完成,重启Jenkins

在这里插入图片描述
在这里插入图片描述

重启就绪时,浏览器会自动刷新页面

五.Jenkins系统设置

注意:没有说的配置,请选择默认,不要乱选

选择全局配置工具

系统管理->(全局工具配置)Global Tool Configuration,配置jdk,git,maven的根目录

在这里插入图片描述

配置jdk目录

在这里插入图片描述

配置git目录

在这里插入图片描述

配置maven

在这里插入图片描述

Jenkins的中文设置

安装插件locale在这里插入图片描述
安装完重启

在这里插入图片描述

重启完成后设置语言

在这里插入图片描述

添加zh_CN保存
在这里插入图片描述

重启jenkins命令

http://192.168.200.153:8080/jenkins/restart
http://192.168.200.153:8080/jenkins/reload
http://192.168.200.153:8080/jenkins/exit

六.SSH设置

目的:192.168.200.153 jinkens服务器上的maven将开发产生的*.war包。
通过SSH自动推送到远程tomcat 服务器上(192.168.0.109)。
需要手工配置ssh key。配合自动化推送

192.168.200.153 Jenkins服务器
192.168.200.147 tomcat业务服务器

jenkins服务器准备秘钥认证

  1. #生成密钥
  2. [root@192 ~]# ssh-keygen
  3. Generating public/private rsa key pair.
  4. Enter file in which to save the key (/root/.ssh/id_rsa):
  5. Created directory '/root/.ssh'.
  6. Enter passphrase (empty for no passphrase):
  7. Enter same passphrase again:
  8. Your identification has been saved in /root/.ssh/id_rsa.
  9. Your public key has been saved in /root/.ssh/id_rsa.pub.
  10. The key fingerprint is:
  11. SHA256:BnilZ4TxayzogbxcD3GzTpR9SNyfjwmC4debjKyZCPg root@192.168.200.153
  12. The key's randomart image is:
  13. +---[RSA 2048]----+
  14. | .++. |
  15. | .oO... |
  16. | o.Oo*... . |
  17. | . . *oBooo o |
  18. | .o = +oS+ + + |
  19. |...+ * +o + o . |
  20. | .o...o+ |
  21. | E . + |
  22. | |
  23. +----[SHA256]-----+
  24. #发送密钥
  25. [root@192 ~]# ssh-copy-id 192.168.200.147
  26. /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
  27. The authenticity of host '192.168.200.147 (192.168.200.147)' can't be established.
  28. ECDSA key fingerprint is SHA256:W6Jwu++IwI0SqmWqjhGpDIetIJu3S6VnKoRBXNqS0Fk.
  29. ECDSA key fingerprint is MD5:18:bc:5c:7c:8d:20:e6:c2:f2:fa:dd:7d:b6:58:00:bf.
  30. Are you sure you want to continue connecting (yes/no)? yes
  31. /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
  32. /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
  33. root@192.168.200.147's password:
  34. Number of key(s) added: 1
  35. Now try logging into the machine, with: "ssh '192.168.200.147'"
  36. and check to make sure that only the key(s) you wanted were added.
  37. #测试免密登录
  38. [root@192 ~]# ssh 192.168.200.147
  39. Last login: Thu Dec 22 11:48:16 2022 from 192.168.200.1
  40. [root@192 ~]# ip a | grep inet | awk 'NR==3'
  41. inet 192.168.200.147/24 brd 192.168.200.255 scope global noprefixroute dynamic ens32
  42. [root@192 ~]# exit
  43. 登出
  44. Connection to 192.168.200.147 closed.

在Jenkins上配置ssh信息

准备ssh密钥

复制cat出来的所有内容,粘贴到下一步页面上的key中。

  1. [root@192 ~]# cat .ssh/id_rsa
  2. -----BEGIN RSA PRIVATE KEY-----
  3. MIIEpAIBAAKCAQEAzQftm+D6kUV/rQMnQpSxrnNfhIk5iR7caa9C5afl9EWfYghz
  4. 3wd76d4pbiyUFagbBTYthwrJwZQN1xSDIqrTrKE2iwMDXmAJsiQM6UsO0Ng6EoUM
  5. MTDbwvb1QSXXNdBGdnb7cex7Dagb3pwYzYODDBooZMDLxIcqiIpHpIBmKnS1HcPD
  6. 8aLeXYbWc8iUGTZXjoWsQMzlUsM7fgkzVDdjwaUvFgK6qpmRCAQfqtQKljipo3cy
  7. F391nqQkD2c+eHC3/5JSF6V0PMcMiKXivuV7aFGvPhcXQt65/ex6bRDseE/ob3qp
  8. V07HQ0ueG2eqQeE5GG3/QwU3aFBIcfgAJV6HzQIDAQABAoIBAQDE0mSN7EZ9qIrt
  9. SoaoytdbEZRTRew+rqqGpeGBV1FP0nozgMvDAYs5sbRx+EdcFtmBgkXoSjnuI7O5
  10. kg5k/DphkQ0sG4NjWKxWH3dpiU06vSfaWXCf1DhTDAHaPXpARaUu2f99mLd0H7pJ
  11. U+4Xc7UcrAu01MOH8P2qv5wQ1dW90D1rbybDusEbiCd7hlz664nNAzXsHcM0tNCA
  12. B5QT0BC7n2TKVi6BMY3p/N7IlE7x+CuDpJoyiCGwL1KaslbleCQmDH4tvK0uLTeY
  13. FPNQrywNeLzmdfid5W2qthrkUGPFgmGHrSHsIhPfDpaBJKEBal7xq9dmLUM9PgrY
  14. x6UWqRl9AoGBAOx9fkDxnJNKS1NiP3F4JyXNRPrSW9ke7leXxeuhAMvd7XJAawAF
  15. qfMNpmtAo4RWxEFlPlJ2oNyMNSXJ5Q4FZH5cVTYlx7XFMnD2EjjMyP+7Xbp4JLy0
  16. YQAQE5s4jRcUS5+yR8631TCftP7YPmPddDqyxfyVD3CSFMbnYc+jVBTbAoGBAN3y
  17. Cbo/NSdgKoTyFxirviOH9rFHjvZj3xc1ID2TEyhDSuEL5SUCYxDD8lWDXmv+KlTE
  18. 4HCxETuqDXxp9LAEToZU3GbYD3spGRIG+cCOIqHycSg45kz7iwnCqqszP5Lo8y1s
  19. QdvC30V8+YYOKAywI1+40EMHRCd7/I53L+3e92J3AoGAS0UJ+SutdSfRX8HGhZwD
  20. gcGaseZgO3Pf0ltJMFz3Puvs1k9wfvpOhECU9lAFe2qOXm4V7vM48dliVRu0XskS
  21. mjFTIb/Wl6EjE9cOJ6vuUY7WHzJ8Jt+WfAmh4+aU6YKZK0P4HPBf13ENj4tOGET0
  22. 6HXcFC9xUZf9Ku2cMRU//r8CgYB5KUWYMCNTUJNFqmdjZ3ZQLUxF8TuhVFoYcD8e
  23. fijKJRo+iuDX+Fqeb2netu2X5NO1HRktS+yNdsMP9UPHx0Ia4T7EwhSJdqEiDz7O
  24. mIldgV22yIEo63U2qdfDyCFfkN4YIO4/Cz4Z0CTjwtyoOIvHGLxQqynQqEXyfCxl
  25. HgBM9wKBgQDotVo+waStkjId0v3niKarwqxT5yg1s5Y2VPnLBzRIZAff0dyVUhUm
  26. 4w9sDTZXa1Rh/cF1v6yS0pWqsDG2OBnJMJPEmNRzFNxMwI51phOse1JAMHmdDEZD
  27. xwMKKYibPKwcYgri5VRFv5xXUlW8i/Y+AFEkX1440FTHzd7Ht9TBgw==
  28. -----END RSA PRIVATE KEY-----

进入jenkins系统设置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七.新建任务

创建任务

在这里插入图片描述

定义名称和类型

在这里插入图片描述

设置maven

公有git仓库

1.设置描述
在这里插入图片描述
2.选择版本控制器和仓库地址

https://github.com/bingyue/easy-springmvc-maven

在这里插入图片描述
3.设置触发器(保持默认)
在这里插入图片描述
4.设置构建(编译打包)

手动添加Goals and options:
clean package -Dmaven.test.skip=true

在这里插入图片描述
5.构建后操作

在构建后设置中 选择:(send build artifacts over ssh)通过SSH发送构建工件

在这里插入图片描述
在这里插入图片描述

  • name:ssh server 因为之前的配置会默认出现tomcat业务服务器的名字
  • source file:target/*.war构建之后,在jenkins服务器上是可以自动看到war包的。(该路径不需要创建)ls /root/.jenkins/jobs/testjob1/builds/target/*.war
  • Remove prefix:自动删除路径前缀(不需要创建路径前缀)

  • Remote directory:tomcat业务服务器上的路径,需要提前在192.168.200.154(tomcat)上创建该目录。用来存放网站源代码。(需要后台创建)
    `[root@192 ~]# mkdir -p /jenkins/war

  • Exec command : tomcat(192.168.200.154)在接收到源码之后的自定义动作。
    比如:将源码拷贝到网站的主目录(/jenkins),并执行一些其他操作如重启服务器等(或创建文件touch)(需要后台创建)
  1. #后台创建
  2. [root@192 ~]# mkdir /jenkins/sh
  3. [root@192 ~]# vim /jenkins/sh/deploy.sh
  4. #写上以下内容进行测试
  5. touch 1.txt
  6. touch 2.jpg
  7. [root@192 ~]# chmod +x /jenkins/sh/deploy.sh

点击保存,完成

在这里插入图片描述

八.构建任务

立即构建

如果构建失败,进入配置查看所有的配置是否正确

在这里插入图片描述

这里可以看到所有的操作,报错可以在这里查看

在这里插入图片描述

查看构建结果

看到结果显示成功

在这里插入图片描述

观察tomcat网站服务器

代码和脚本

  1. #脚本的执行结果
  2. [root@192 ~]# ls
  3. 1.txt 2.jpg
  4. #查看代码
  5. [root@192 ~]# ls /jenkins/war/
  6. easy-springmvc-maven.war #推送过来的网站源码
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注