jenkins简介

1、Jenkins是一个独立的开源自动化服务器,可用于自动化各种任务,如构建,测试和部署软件,起源于Hudson(Hudson是商用的),是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时 Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。
2、 可在Tomcat等流行的servlet容器中运行,也可独立运行。

3、Jenkins可以通过本机系统包Docker安装,甚至可以通过安装Java Runtime Environment的任何机器独立运行。
4、提供友好操作界面的持续集成(CI)工具
5、它用于实时测试和报告较大代码库中的孤立更改。 Jenkins软件使开发人员能够快速找到并解决代码库中的缺陷,并自动进行构建测试。

Jekins工作原理

image-1664468242192

这里是选择Gitlab作为git server。Gitlab的功能和Github差不多,但是是开源的,可以用来搭建私有git server,也提供非常强大的web GUI,比如开发者互相review源代码的时候就会很方便。

系统的工作流程大概分为以下几步:

1> 开发者将新版本push到git server (Gitlab)。

2> Gitlab随后触发jenkins master结点进行一次build。(通过web hook或者定时检测)

3> jenkins master结点将这个build任务分配给若干个注册的slave结点中的一个,这个slave结点根据一个事先设置好的脚本进行build。这个脚本可以做的事情很多,比如编译,测试,生成测试报告等等。这些原本需要手动完成的任务都可以交给jenkins来做。

4> 我们在build中要进行编译,这里使用了分布式编译器distcc来加快编译速度。

部署方式

jenkins触发式构建:用于开发环境部署,开发人员push代码或者合并代码到gitlab项目的master分支,jenkins就部署代码到对应服务器。

jenkins参数化构建:用于测试环境预上线环境部署,开发push代码或者合并代码到gitlab项目的master分支之后,并不会部署代码,而是需要登录到jenkins的web界面,点击构建按钮,传入对应的参数(比如参数需要构建的tag,需要部署的分支)然后才会部署。

jenkins定时构建:用于APP自动打包,定时构建是在参数化构建的基础上添加的,开发人员可以登录jenkins手动传入tag进行打包,如果不手动打包,那么jenkins就每天凌晨从gitlab拉取最新的APP代码打包。

Jenkins分布式构建架构

Jenkins使用主/从架构来管理分布式构建。

主节点:处理调度构建作业,把构建分发到从节点来进行实际执行,监视从节点,并且记录和发布构建产物。

从节点:按照被告知的工作,即主节点分派的构建作业。配置可分为如下三种情况:

  • 配置一个项目总是在特定的从节点运行
  • 在某个特定类型的从节点运行
  • 让Jenkins挑选下一个可用的从节点

一旦从节点实例运行,它就通过TCP/IP连接主实例进行通信。

Jenkins主/从策略

Jenkins可用通过很多不同的方式设置分不只构建,取决于操作系统和网络架构。

构建作业运行在从节点的方式及怎么被管理对于终端用户来说都是透明的:构建结果和构建产物最后总是会在主服务器上。

Jenkins部署

//使用tomcat容器安装jenkins
部署tomcat,tomcat下载https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat,此时下载9.0版本的,10版本部署有bug,无法实现。

//安装jdk
[root@node1 ~]# yum -y install java-11-openjdk

//下载、解压tomcat、并部署安装
[root@node1 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.67/bin/apache-tomcat-9.0.67.tar.gz
[root@node1 ~]# tar -xf apache-tomcat-9.0.67.tar.gz -C /usr/local/
[root@node1 ~]# cd /usr/local/
[root@node1 local]# ln -s apache-tomcat-9.0.67/ tomcat

//启动tomcat,测试能否访问tomcat首页
[root@node1 local]# cd tomcat/
[root@node1 tomcat]# bin/startup.sh

image-1664468262339

部署jenkins

Jenkins官网https://www.jenkins.io/

Jenkins用户手册https://www.jenkins.io/zh/doc/pipeline/tour/getting-started/

image-1664468271986

image-1664468279981

//下载jenkins到/usr/local/tomcat/webapps/目录下
[root@node1 ~]# cd /usr/local/tomcat/webapps/
[root@node1 webapps]# pwd
/usr/local/tomcat/webapps
//下载下来后会自动解压
[root@node1 webapps]# wget https://get.jenkins.io/war-stable/2.361.1/jenkins.war
[root@node1 webapps]# ls
docs  examples  host-manager  jenkins  jenkins.war  manager  ROOT

/启动服务
[root@node1 ~]# cd /usr/local/tomcat/
[root@node1 tomcat]# bin/catalina.sh stop
[root@node1 tomcat]# bin/catalina.sh start

//浏览器访问Jinkins

http://192.168.91.134:8080/jenkins

image-1664468299983

//查看上图框出来的文件,该文件中记录这密码,复制密码并登录

[root@node1 ~]# cat /root/.jenkins/secrets/initialAdminPassword
fcc5a585c6854d09bf3789911fd9cc99

image-1664468312099

//自定义jenkins,选择插件来安装

image-1664468322164

//选择无,进行安装,后期需要什么插件就安装什么插件

image-1664468331401

//创建管理员用户admin,密码为admin

image-1664468345149

//直接保存完成

image-1664468355455

//此时登录进去是英文界面,我们进行替换国内源

image-1664468364880

//点击 Advanced —> 更新为国内源 —> Submit

原国外插件源地址:https://updates.jenkins.io/update-center.json

国内插件源地址:https://mirror.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

image-1664468378236

//安装简体中文插件

image-1664468405128

//安装Git GitHub GitLab Gitee插件

安装完成后,会重启jenkins

image-1664468420636

http://192.168.91.134:8080/jenkins/restart 重启一下,重新登录

image-1664468434771

image-1664468444741

//登录进来就是中文了

image-1664468457148

//用户界面

//任务管理

image-1664468481904

image-1664468490633

//保存一下

image-1664468502422

image-1664468513597

//系统管理 ——>全局工具配置

安装jdk

image-1664468527244

Jenkins流水线项目发布流程

主机名称 ip地址 需要的应用服务 工具包 系统

Node1 192.168.91.134 tomcat、jenkins git maven Centos8

node2 192.168.91.145 tomcat 无 Centos8

1、关闭防火墙和selinux

2、在node1上部署服务tomcat和jenkins(上面已经部署),重新部署,登录web界面时选择安装推荐的插件,部署好后,设置国内源

image-1664468542407

3、先在node1主机上生成一个密钥,传给node2主机

[root@node1 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:P3wucijEJhCQfZb7LAtp6RpynWnBWryoHf8zdLUJUZA root@node1
The key's randomart image is:
+---[RSA 3072]----+
|.+   .  .+.      |
|. o +   E        |
|   + .   .       |
|  .o.   . .      |
|   +=+  So o     |
|  ==o=B .oo      |
|oo=.*B . .+ .    |
|.=.+. + o o+     |
|o.. ...+ o ..    |
+----[SHA256]-----+
[root@node1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.91.145

4、在node2上部署tomcat

//安装jdk
[root@node2 ~]# yum -y install java-11-openjdk

//下载、解压tomcat、并部署安装
[root@node2 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.67/bin/apache-tomcat-9.0.67.tar.gz
[root@node2 ~]# tar -xf apache-tomcat-9.0.67.tar.gz -C /usr/local/
[root@node2 ~]# cd /usr/local/
[root@node2 local]# ln -s apache-tomcat-9.0.67/ tomcat


5、在node1中配置jenkins

//创建任务

image-1664468557209

//创建流水线任务

image-1664468567455

发布流水线的方法我在这里给大家介绍两种,一种是脚本的方式,一种是使用文本参数的方式

首选都需要在jinkins所在服务器,也就是node1中安装git和maven

[root@node1 ~]# yum -y install git maven

第一种方法:使用脚本

pipeline { 
    agent any

    stages { 
        stage('pull code') { 
            steps { 
                git 'http://github.com/lizhenliang/tomcat-java-demo.git'
            }
        }
    }
}

image-1664468583663

//蓝色为正在构建

image-1664468691091

//绿色为构建成功

image-1664468725174

//也可以看构建日志

image-1664468647146

//构建日志中记录这pull到哪里了

image-1664468746593

//添加第二部分脚本执行,构建要很长时间

pipeline { 
    agent any
 
    stages { 
        stage('pull code') { 
            steps { 
                git 'http://github.com/lizhenliang/tomcat-java-demo.git'
            }
        }
        stage('package') { 
             steps { 
                 sh """ 
                 mvn clean
                 mvn package
                 """
            }
        }

    }
}

image-1664468766420

//我们关掉手动部署

image-1664468776893

//手动部署,就会稍微快些
[root@node1 ~]# cd /root/.jenkins/workspace/test/
[root@node1 test]# mvn clean package

//进行构建–此时构建时间非常长
第二次构建就是为了安装软件包,生成站点,站点在/root/.jenkins/workspace/test/target/目录下,通过日志文件可以看到该目录下就有个压缩文件为ly-simple-tomcat-0.0.1-SNAPSHOT.war

image-1664468787646

//第三次构建的时候,就是需要把这个文件使用scp的方式发送给node2的(除了这种还有下面定义变量)

pipeline { 
    agent any

    stages { 
        stage('pull code') { 
            steps { 
                git '${git-url}'
            }
        }
        stage('package') { 
             steps { 
                 sh """ 
                 mvn clean
                 mvn package
                 """
            }
        }

        stage('deploy') { 
            steps { 
	            sh """                
	            scp target/ly-simple-tomcat-0.0.1-SNAPSHOT.war root@192.168.91.145:/usr/loc 
	            al/tomcat/webapps/
                ssh root@192.168.91.145 '/usr/local/tomcat/bin/catalina.sh stop && /usr/local/tomcat/bin/catalina.sh start'
                """
  	        }
        }
    }
}

通过日志文件,我们可以看到将站点发送到node2的tomcat中了

image-1664468807436

此时我们去node2中的去验证

[root@node2 webapps]# pwd
/usr/local/tomcat/webapps
[root@node2 webapps]# ls
docs   host-manager           ly-simple-tomcat-0.0.1-SNAPSHOT.war ROOT
examples ly-simple-tomcat-0.0.1-SNAPSHOT manager

image-1664468821150

添加参数,定义变量名称、变量的值,这个脚本我去下载的路径给它定义一个名称,值是http://github.com/lizhenliang/tomcat-java-demo.git,给这个打包的也定义一个变量名称ly-simple-tomcat-0.0.1-SNAPSHOT.war,客户端的IP root@192.168.91.145也定义一个变量名称,tomcat安装的路径也定义一个变量名称/usr/local/tomcat/webapps

image-1664468838252

image-1664468852479

image-1664468864135

image-1664468878632

image-1664468891294

image-1664468905559

image-1664468917158

image-1664468926772

pipeline { 
    agent any

    stages { 
        stage('pull code') { 
            steps { 
                git "${git_url}"
            }
        }
        stage('package') { 
             steps { 
                 sh """ 
                 mvn clean
                 mvn package
                 """
            }
        }

        stage('deploy') { 
            steps { 
	            sh """                
	            scp target/${maven_package}.war root@${client_ip}:${tomcat_path}/webapps/
                ssh root@${client_ip} '${tomcat_path}/bin/catalina.sh stop &&${tomcat_path}/bin/catalina.sh start'
                """
  	        }
        }
    }
}

点击应用然后保存

image-1664468939785

image-1664468949549

//构建成功

image-1664468963696