Jenkins自动化部署实现原理
一、Jenkins安装
下载地址:https://www.jenkins.io/download/
(一)windows环境安装
1.jenkins项目有两条发布线,分别是LTS长期支持版(或稳定版)和每周更新版(最新版)。建议选择LTS长期支持版,下载通用java项目war包。
2.下载jdk11以上版本并安装,安装后配置jdk的环境变量(最新版jdk弃用了jdk1.8,改用jdk11以上)。
3.在dos命令行运行命令解压war包:java -jar jenkins.war (默认情况下端口是8080,可通过命令行”java –jar Jenkins.war --httpPort=8083”的方式修改端口号)
运行命令后jenkins.war会自动在C盘目录下生成一个jenkins的文件夹。C盘下的这个文件夹可独立运行。
ps:运行完后不要关闭dos窗口,否则会访问不了Jenkins的页面。
4.在浏览器中访问jenkins项目:http://localhost:8083/jenkins 出现解锁 Jenkins界面,说明jenkins项目搭建完成,这里需要输入管理员密码。如下图:
5.上图中有提示:管理员密码在:C:\jenkins\secrets\initialAdminPassword 打开此文件获得密码并输入密码,点击”继续”按钮后如下图:
6.选择插件来安装,稍等几分钟安装完插件就可以使用Jenkins了。
部分插件下载失败不影响使用,今后需要用到的插件可在插件管理页面进行下载。
7.安装完成后,页面自动进入了管理员账户注册页面。
注册完账户,就进入主页面
(二)Linux在线安装
1.官方文档安装
(1)选择下载CentOs版本
(2)页面跳转后按页面提示步骤执行
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install fontconfig java-11-openjdk
yum install jenkins
[root@localhost jenkins]# sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
--2023-02-21 19:08:40-- https://pkg.jenkins.io/redhat-stable/jenkins.repo
Resolving pkg.jenkins.io (pkg.jenkins.io)... 151.101.2.133, 151.101.66.133, 151.101.130.133, ...
Connecting to pkg.jenkins.io (pkg.jenkins.io)|151.101.2.133|:443... connected.
ERROR: cannot verify pkg.jenkins.io's certificate, issued by ‘/C=US/O=Let's Encrypt/CN=R3’:
Issued certificate has expired.
To connect to pkg.jenkins.io insecurely, use `--no-check-certificate'.
[root@localhost jenkins]# sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo --no-check-certificate
--2023-02-21 19:09:52-- https://pkg.jenkins.io/redhat-stable/jenkins.repo
Resolving pkg.jenkins.io (pkg.jenkins.io)... 151.101.2.133, 151.101.66.133, 151.101.130.133, ...
Connecting to pkg.jenkins.io (pkg.jenkins.io)|151.101.2.133|:443... connected.
WARNING: cannot verify pkg.jenkins.io's certificate, issued by ‘/C=US/O=Let's Encrypt/CN=R3’:
Issued certificate has expired.
HTTP request sent, awaiting response... 200 OK
Length: 85
Saving to: ‘/etc/yum.repos.d/jenkins.repo’
100%[===================================================================================================================>] 85 --.-K/s in 0s
2023-02-21 19:09:56 (4.73 MB/s) - ‘/etc/yum.repos.d/jenkins.repo’ saved [85/85]
系统中有jdk也需要执行 yum install fontconfig java-11-openjdk 命令
[root@localhost jenkins]# yum install fontconfig java-11-openjdk
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
base | 3.6 kB 00:00:00
extras | 2.9 kB 00:00:00
jenkins | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
updates/7/x86_64/primary_db | 19 MB 00:00:10
Package fontconfig-2.13.0-4.3.el7.x86_64 already installed and latest version
Resolving Dependencies
--> Running transaction check
---> Package java-11-openjdk.x86_64 1:11.0.18.0.10-1.el7_9 will be installed
--> Processing Dependency: java-11-openjdk-headless(x86-64) = 1:11.0.18.0.10-1.el7_9 for package: 1:java-11-openjdk-11.0.18.0.10-1.el7_9.x86_64
--> Processing Dependency: xorg-x11-fonts-Type1 for package: 1:java-11-openjdk-11.0.18.0.10-1.el7_9.x86_64
--> Processing Dependency: libjvm.so()(64bit) for package: 1:java-11-openjdk-11.0.18.0.10-1.el7_9.x86_64
--> Processing Dependency: libjava.so()(64bit) for package: 1:java-11-openjdk-11.0.18.0.10-1.el7_9.x86_64
--> Processing Dependency: libgif.so.4()(64bit) for package: 1:java-11-openjdk-11.0.18.0.10-1.el7_9.x86_64
--> Running transaction check
---> Package giflib.x86_64 0:4.1.6-9.el7 will be installed
---> Package java-11-openjdk-headless.x86_64 1:11.0.18.0.10-1.el7_9 will be installed
--> Processing Dependency: tzdata-java >= 2022g for package: 1:java-11-openjdk-headless-11.0.18.0.10-1.el7_9.x86_64
--> Processing Dependency: copy-jdk-configs >= 3.3 for package: 1:java-11-openjdk-headless-11.0.18.0.10-1.el7_9.x86_64
--> Processing Dependency: pcsc-lite-libs(x86-64) for package: 1:java-11-openjdk-headless-11.0.18.0.10-1.el7_9.x86_64
--> Processing Dependency: lksctp-tools(x86-64) for package: 1:java-11-openjdk-headless-11.0.18.0.10-1.el7_9.x86_64
--> Processing Dependency: javapackages-tools for package: 1:java-11-openjdk-headless-11.0.18.0.10-1.el7_9.x86_64
---> Package xorg-x11-fonts-Type1.noarch 0:7.5-9.el7 will be installed
--> Processing Dependency: ttmkfdir for package: xorg-x11-fonts-Type1-7.5-9.el7.noarch
--> Processing Dependency: ttmkfdir for package: xorg-x11-fonts-Type1-7.5-9.el7.noarch
--> Processing Dependency: mkfontdir for package: xorg-x11-fonts-Type1-7.5-9.el7.noarch
--> Processing Dependency: mkfontdir for package: xorg-x11-fonts-Type1-7.5-9.el7.noarch
--> Running transaction check
---> Package copy-jdk-configs.noarch 0:3.3-11.el7_9 will be installed
---> Package javapackages-tools.noarch 0:3.4.1-11.el7 will be installed
--> Processing Dependency: python-javapackages = 3.4.1-11.el7 for package: javapackages-tools-3.4.1-11.el7.noarch
---> Package lksctp-tools.x86_64 0:1.0.17-2.el7 will be installed
---> Package pcsc-lite-libs.x86_64 0:1.8.8-8.el7 will be installed
---> Package ttmkfdir.x86_64 0:3.0.9-42.el7 will be installed
---> Package tzdata-java.noarch 0:2022g-1.el7 will be installed
---> Package xorg-x11-font-utils.x86_64 1:7.5-21.el7 will be installed
--> Running transaction check
---> Package python-javapackages.noarch 0:3.4.1-11.el7 will be installed
--> Processing Dependency: python-lxml for package: python-javapackages-3.4.1-11.el7.noarch
--> Running transaction check
---> Package python-lxml.x86_64 0:3.2.1-4.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=============================================================================================================================================================
Package Arch Version Repository Size
=============================================================================================================================================================
Installing:
java-11-openjdk x86_64 1:11.0.18.0.10-1.el7_9 updates 239 k
Installing for dependencies:
copy-jdk-configs noarch 3.3-11.el7_9 updates 22 k
giflib x86_64 4.1.6-9.el7 base 40 k
java-11-openjdk-headless x86_64 1:11.0.18.0.10-1.el7_9 updates 39 M
javapackages-tools noarch 3.4.1-11.el7 base 73 k
lksctp-tools x86_64 1.0.17-2.el7 base 88 k
pcsc-lite-libs x86_64 1.8.8-8.el7 base 34 k
python-javapackages noarch 3.4.1-11.el7 base 31 k
python-lxml x86_64 3.2.1-4.el7 base 758 k
ttmkfdir x86_64 3.0.9-42.el7 base 48 k
tzdata-java noarch 2022g-1.el7 updates 185 k
xorg-x11-font-utils x86_64 1:7.5-21.el7 base 104 k
xorg-x11-fonts-Type1 noarch 7.5-9.el7 base 521 k
Transaction Summary
=============================================================================================================================================================
Install 1 Package (+12 Dependent packages)
Total download size: 41 M
Installed size: 169 M
Is this ok [y/d/N]: y
Downloading packages:
(1/13): copy-jdk-configs-3.3-11.el7_9.noarch.rpm | 22 kB 00:00:00
(2/13): giflib-4.1.6-9.el7.x86_64.rpm | 40 kB 00:00:00
(3/13): javapackages-tools-3.4.1-11.el7.noarch.rpm | 73 kB 00:00:00
(4/13): lksctp-tools-1.0.17-2.el7.x86_64.rpm | 88 kB 00:00:00
(5/13): python-javapackages-3.4.1-11.el7.noarch.rpm | 31 kB 00:00:00
(6/13): pcsc-lite-libs-1.8.8-8.el7.x86_64.rpm | 34 kB 00:00:00
(7/13): java-11-openjdk-11.0.18.0.10-1.el7_9.x86_64.rpm | 239 kB 00:00:01
(8/13): ttmkfdir-3.0.9-42.el7.x86_64.rpm | 48 kB 00:00:00
(9/13): tzdata-java-2022g-1.el7.noarch.rpm | 185 kB 00:00:00
(10/13): python-lxml-3.2.1-4.el7.x86_64.rpm | 758 kB 00:00:00
(11/13): xorg-x11-font-utils-7.5-21.el7.x86_64.rpm | 104 kB 00:00:00
(12/13): xorg-x11-fonts-Type1-7.5-9.el7.noarch.rpm | 521 kB 00:00:02
(13/13): java-11-openjdk-headless-11.0.18.0.10-1.el7_9.x86_64.rpm | 39 MB 00:01:12
-------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 580 kB/s | 41 MB 00:01:12
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Warning: RPMDB altered outside of yum.
Installing : ttmkfdir-3.0.9-42.el7.x86_64 1/13
Installing : lksctp-tools-1.0.17-2.el7.x86_64 2/13
Installing : copy-jdk-configs-3.3-11.el7_9.noarch 3/13
Installing : pcsc-lite-libs-1.8.8-8.el7.x86_64 4/13
Installing : tzdata-java-2022g-1.el7.noarch 5/13
Installing : python-lxml-3.2.1-4.el7.x86_64 6/13
Installing : python-javapackages-3.4.1-11.el7.noarch 7/13
Installing : javapackages-tools-3.4.1-11.el7.noarch 8/13
Installing : 1:java-11-openjdk-headless-11.0.18.0.10-1.el7_9.x86_64 9/13
Installing : giflib-4.1.6-9.el7.x86_64 10/13
Installing : 1:xorg-x11-font-utils-7.5-21.el7.x86_64 11/13
Installing : xorg-x11-fonts-Type1-7.5-9.el7.noarch 12/13
Installing : 1:java-11-openjdk-11.0.18.0.10-1.el7_9.x86_64 13/13
Verifying : 1:xorg-x11-font-utils-7.5-21.el7.x86_64 1/13
Verifying : giflib-4.1.6-9.el7.x86_64 2/13
Verifying : xorg-x11-fonts-Type1-7.5-9.el7.noarch 3/13
Verifying : 1:java-11-openjdk-headless-11.0.18.0.10-1.el7_9.x86_64 4/13
Verifying : python-javapackages-3.4.1-11.el7.noarch 5/13
Verifying : python-lxml-3.2.1-4.el7.x86_64 6/13
Verifying : tzdata-java-2022g-1.el7.noarch 7/13
Verifying : pcsc-lite-libs-1.8.8-8.el7.x86_64 8/13
Verifying : javapackages-tools-3.4.1-11.el7.noarch 9/13
Verifying : 1:java-11-openjdk-11.0.18.0.10-1.el7_9.x86_64 10/13
Verifying : copy-jdk-configs-3.3-11.el7_9.noarch 11/13
Verifying : lksctp-tools-1.0.17-2.el7.x86_64 12/13
Verifying : ttmkfdir-3.0.9-42.el7.x86_64 13/13
Installed:
java-11-openjdk.x86_64 1:11.0.18.0.10-1.el7_9
Dependency Installed:
copy-jdk-configs.noarch 0:3.3-11.el7_9 giflib.x86_64 0:4.1.6-9.el7 java-11-openjdk-headless.x86_64 1:11.0.18.0.10-1.el7_9
javapackages-tools.noarch 0:3.4.1-11.el7 lksctp-tools.x86_64 0:1.0.17-2.el7 pcsc-lite-libs.x86_64 0:1.8.8-8.el7
python-javapackages.noarch 0:3.4.1-11.el7 python-lxml.x86_64 0:3.2.1-4.el7 ttmkfdir.x86_64 0:3.0.9-42.el7
tzdata-java.noarch 0:2022g-1.el7 xorg-x11-font-utils.x86_64 1:7.5-21.el7 xorg-x11-fonts-Type1.noarch 0:7.5-9.el7
Complete!
(3)将Jenkins存储库添加到系统中
[root@localhost jenkins]# sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
(4)创建Jenkins安装时所需的文件目录
安装之前先准备创建Jenkins安装时所需的文件目录,否则会导致安装后启动失败。
分别在 /var/cache/ /var/log/ /var/lib/ 下创建jenkins文件
[root@localhost java]# cd /var/cache/
[root@localhost cache]# mkdir jenkins
[root@localhost cache]# cd /var/log
[root@localhost log]# mkdir jenkins
[root@localhost log]# cd /var/lib
[root@localhost lib]# mkdir jenkins
(5)安装Jenkins yum install jenkins
[root@localhost jenkins]# yum install jenkins
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
---> Package jenkins.noarch 0:2.190.3-1.1 will be updated
---> Package jenkins.noarch 0:2.375.3-1.1 will be an update
--> Finished Dependency Resolution
Dependencies Resolved
=============================================================================================================================================================
Package Arch Version Repository Size
=============================================================================================================================================================
Updating:
jenkins noarch 2.375.3-1.1 jenkins 90 M
Transaction Summary
=============================================================================================================================================================
Upgrade 1 Package
Total download size: 90 M
Is this ok [y/d/N]: y
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
jenkins-2.375.3-1.1.noarch.rpm | 90 MB 00:07:40
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Updating : jenkins-2.375.3-1.1.noarch 1/2
warning: /etc/init.d/jenkins created as /etc/init.d/jenkins.rpmnew
warning: /etc/sysconfig/jenkins created as /etc/sysconfig/jenkins.rpmnew
Cleanup : jenkins-2.190.3-1.1.noarch 2/2
Verifying : jenkins-2.375.3-1.1.noarch 1/2
Verifying : jenkins-2.190.3-1.1.noarch 2/2
Updated:
jenkins.noarch 0:2.375.3-1.1
Complete!
(6)修改Jenkins配置文件
在启动之前对安装完毕的Jenkins进行默认配置的修改:
默认情况下Jenkins使用Jenkins用户启动,但安装时并未创建用户也并未赋予权限,所以将启动用户修改为root
默认端口为8080,常被占用,所以将默认端口也做一下修改。
vi /etc/sysconfig/jenkins
JENKINS_USER="root" ## 原值 "jenkins" 必须修改,否则权限不足
JENKINS_PORT="8083" ## 原值 "8080"
(7)启动Jenkins
4.在浏览器中访问jenkins项目:http://server_ip:8083/jenkins 出现解锁 Jenkins界面,说明jenkins项目搭建完成,这里需要输入管理员密码。如下图:
5.上图中有提示:管理员密码在:/var/lib/jenkins/secrets/initialAdminPassword 打开此文件获得密码并输入密码,点击”继续”按钮后如下图:
6.选择插件来安装,稍等几分钟安装完插件就可以使用Jenkins了。
部分插件下载失败不影响使用,今后需要用到的插件可在插件管理页面进行下载。
7.安装完成后,页面自动进入了管理员账户注册页面。
注册完账户,就进入主页面
(三)Jenkins系统配置
1.Global Tool Configuration
任务构建所用到的编译环境等配置,配置参考:
- Configure System
(1)Gitee配置
在 链接名 中输入 Gitee 或者你想要的名字
Gitee 域名 URL 中输入码云完整 URL地址: https://gitee.com (码云私有化客户输入部署的域名)
证书令牌 中如还未配置码云 APIV5 私人令牌,点击 Add - > Jenkins
Domain 选择 全局凭据
Kind 选择 Gitee API 令牌
Scope 选择你需要的范围
Gitee API Token 输入你的码云私人令牌,获取地址:https://gitee.com/profile/personal_access_tokens
ID, Descripiton 中输入你想要的 ID 和描述即可。
Gitee链接配置保存后,创建新任务配置Gitee链接时在下拉框中选择此任务所需的Gitee链接即可。
(2)SSH Server
接收文件的远程服务器配置
3.windows环境下更改默认工作空间
增加环境变量JENKINS_HOME,指向想要更改的Jenkins默认工作空间。比如,设置E:\jenkins为Jenkins的默认工作目录,那么在环境变量中,设置JENKINS_HOME为E:\jenkins。
再重启jenkin即可。
(四)Jenkins卸载
1.centos7以下
sudo service jenkins stop
sudo service jenkins disable
sudo yum -y remove jenkins
sudo rm -rf /var/{lib,log,cache}/jenkins /usr/lib/jenkins /root/.jenkins
sudo rm -rf `sudo find /{etc,var,run} -name "jenkins*"`
2.centos7以上
sudo systemctl stop jenkins
sudo systemctl disable jenkins
sudo yum -y remove jenkins
sudo rm -rf /var/{lib,log,cache}/jenkins /usr/lib/jenkins /root/.jenkins
sudo rm -rf `sudo find /{etc,var,run} -name "jenkins*"`
二、Jenkins使用
(一)拉取远程仓库代码到本地
(1)新建文件夹便于项目管理首页->新建Item->输入文件夹名称->选择文件夹->点击确定。
(2)在首页进入刚才新建的文件夹->新建Item->输入任务名称->选择Freestyle project->点击确定。
(3)页面会跳转到任务配置界面
General
源码管理
保存应用后,开始构建:
当看到控制台输出最近的提交记录,则代表代码成功被拉取到本地,Jenkins有自己的工作空间,拉取的代码就保存在工作空间内
(二)Jenkins编译部署项目
1.源码管理
代码拉取步骤与上一节一致。
2.构建触发器
常用构建触发器
(1)定时触发
定时构建语法:* * * * * (五颗星,多个时间点,中间用逗号隔开)第一个表示分钟,取值0~59第二个表示小时,取值0
23第三个*表示一个月的第几天,取值131第四个表示第几月,取值1~12第五个表示一周中的第几天,取值0~7,其中0和7代表的都是周日常用定时构建举例:
每5分钟构建一次:H/5 * * * *每15分钟运行一次:H/15 * * * *每30分钟构建一次:H/30 * * * *每2小时构建一次:H H/2 * * *每天早上8点构建一次:0 8 * * *每天中午下班前定时构建一次:0 12 * * *每天下午下班前定时构建一次:0 18 * * *每天的8点,12点,22点,一天构建3次:0 8,12,22 * * *一个小时的前30分钟,每10分钟运行一次 (30分钟, 可能在 4分,14分,24分):H(0-29)/10 * * * *每周一至周五,上午9:45到下午3:45,每隔2小时45分钟运行一次:45 9-15/2 * * 1-5每两小时一次,每个工作日上午9点到下午5点(也许是上午10:38,下午12:38,下午2:38,下午4:38):H H(9-17)/2 * * 1-5除12月外,每月1号和15号每天一次:H H 1,15 1-11 *
- Build periodically
任务周期性进行项目构建,到达指定的时间必须触发构建任务(无论源码数据有无变化,均执行定时化的构建),若朝九晚五各构建一次,在Build periodically里设置如下
- Poll SCM
定时检查源码变更(根据SCM软件的版本号),如果有更新就checkout最新code下来,然后执行构建动作(定时轮询SVN,查看SVN中是否有数据变化,如果有变化,则执行构建任务)若想每隔30分钟检查一次源码变化,有变化就执行,在poll SCM里设置如下
- webhook触发
构建触发器:
Gitee 配置
对内网进行映射
添加成功后会自动产生一个请求,状态码为200即为成功。
添加成功,提交代码后webhook触发Jenkins自动构建
3.构建步骤
打包项目
4.构建后步骤
将打包编译好的项目发送至远程服务器
应用并保存后开始构建,可在构建完成后,在控制台输出查看结果
文件成功发送到远程服务器
(三)Jenkins Pipline流水线
采用Jenkins的自由风格构建项目时,每个步骤都要通过不同的方式进行配置,在构建过程中整体流程并不可见。利用Jenkins流水线进行项目从代码拉取、构建、测试、部署等步骤的构建时,相对于自由风格和其他风格更容易操作,流水线的构建过程中可以看到整体流程,也可看到每个流程花费的时间。
Jenkins的Pipline可以让项目的发布整体流程可视化,明确执行的阶段,整个项目的生命周期可以通过Jenkins文件管理,且Jenkins文件可以放在项目中维护。
1.Jenkinsfile实现
将脚本内容编写到项目中的Jenkins文件中,每次构建会自动拉取项目并获取项目中Jenkinsfile文件对项目进行构建。
(1)准备Jenkinsfile
将Jenkinsfile文件上传至项目中
Jenkinsfile基本语法
// 所有脚本命令包含在pipeline{}中
pipeline {
// 指定任务在哪个节点执行(Jenkins支持分布式)
agent any
// 配置全局环境,指定变量名=变量值信息
environment{
host = 'ip'
}
// 存放所有任务的合集
stages {
// 单个任务
stage('任务1') {
// 实现任务的具体流程
steps {
echo 'do something'
}
}
// 单个任务
stage('任务2') {
// 实现任务的具体流程
steps {
echo 'do something'
}
}
// ……
}
}
- 流水线语法自动生成
在配置流水线时,点击底部流水线语法,跳转页面后可选择具体需要实现的流程步骤,自动生成命令。
构建项目:
实现文件上传至远程服务器:
- 示例:
可指定构建之前配置好的任务,也可通过流水线语法自动生成Groovy脚本在Jenkinsfile中配置。
Jenkins流水线是一种以定义的方式依次执行Jenkins作业的方法,方法是将其编码并在多个块中进行结构化,这些块可以包含多个任务步骤:
(2)配置Pipline
(四)Jenkins通过Junit插件在Jenkins中查看测试结果和趋势
1.生成报告
Jenkins中安装Junit插件
生成xml报告需要使用maven插件
只需要生成.xml、txt报告,使用maven-surefire-plugin插件,生成的报告在target的surefire-reports下
在项目的pom.xml中加载插件如下<plugins> </plugins>部分:
</distributionManagement>
<build>
<finalName>ROOT</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
<configuration>
<skipTests>false</skipTests>>
</configuration>
</plugin>
</plugins>
</build>
</project>
若生成html报告,使用maven-surefire-report-plugin插件,生成的报告在target的site里面(surefire-report.html)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-report-plugin</artifactId>
<version>2.20.1</version>
<configuration>
<includes>
<include>**/*Test.java</include>
</includes>
</configuration>
</plugin>
maven-surefire-plugin和maven-surefire-report-plugin只需要配置其中一个,就会在test阶段执行单元测试用例。
2.Jenkins pipeline Job配置
pipeline的这部分应该放在post的always中,而不是stages段内。防止单元测试失败,pipeline不再执行后续的stage,放在post的always中则确保会执行。
Hop Jenkinsfile 示例
post {
always {
junit(testResults: '**/surefire-reports/*.xml', allowEmptyResults: true)
junit(testResults: '**/failsafe-reports/*.xml', allowEmptyResults: true)
}
}
3.Jenkins 项目配置
增加构建后操作,添加Publish JUnit test result report
之后会在job页面显示单元测试的趋势图
hop单元测试结果趋势图
在Jenkins中也可查看失败的单元测试
(五)Jenkins持续代码质量检测
1.Maven与SonarQube集成
使用JUnit 4源码来做示例。将JUnit 4从GitHub克隆下来后,在pom.xml中加入SonarQube插件依赖。
<build>
<plugins>
<plugin>
<groupId>org . codehaus . mojo</ groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.4.1.1168< /version>
</plugin>
</plugins>
</build>
执行命令:mvn clean org.sonarsource.scanner.maven
3.4.1.1168:sonar -Dsonar.host.url=http://127.0.0.1:9000
sonar.host.url参数用于指定SonarQube服务的地址。这时,就可以在SonarQube的”Projects” 中看到JUnit 4的分析结果,可以看到JUnit 4有11个Bug。
SonarQube服务默认允许任何人执行源码分析,因此在生产环境中使用会有安全隐患,以下几步可以提高其安全性:(1)设置SonarQube禁止非登录用户使用
(2)为用户生成Token,Jenkins只能通过Token与SonarQube集成。登陆SonarQube,进入个人设置页面中的Security tab页
2Jenkins与SonarQube集成
(1)Jenkins安装SonarQube Scanner插件
(2)Jenkins配置SonarQube Scanner插件
(3)SonarQube设置Webhooks,不同代码规模的源码,分析过程的耗时是不一样的。所以当分析完成时,由SonarQube主动通知Jenkins。设置方法就是进入SonarQube的Adminstration -》Configuration -》 Webhooks页 ,加入http://jenkins地址/sonarqube-webhook 这个接口地址由SonarQube插件提供
(4)在Jenkinsfile中加入SonarQube的stage
pipeline {
angent any
tools {
maven ' mvn- -3.5.4
}
stages {
stage( 'Code Analysis') {
steps {
withSonarQubeEnv(' sonarqube') {
sh """
mvn clean package org.sonarsource.scanner.maven:sonar-maven-plugin:3.4.1.1168:sonar \
-Dsonar.host.url=${SONAR_ HOST_ URL} \
-Dsonar.login=${ SONAR_ AUTH_ TOKEN}
"""
}
}
}
stage("Quality Gate" ) {
steps {
timeout(time: 1, unit: 'HOURS') {
waitForQualityGate abortPipeline: true
}
}
}
}
}
withSonarQubeEnv是一个环境变量包装器,读取的是配置的变量。在它的闭包内,可以使用以下变量。
SONAR_HOST_URL : SonarQube服务的地址
SONAR_AUTH_TOKEN : SonarQube认证所需要的Token
waitForQualityGate步骤告诉Jenkins等待SonarQube返回的分析结果。当它的abortPipeline参数为true时,代表当质量不合格,将pipeline的状态设置为UNSTABLE。
同时使用了timeout包装器来设置waitForQualityGate步骤的超时时间,避免当网络出问题时, Jenkins任务-直处于等待状态。
(5)设置Quality Gates(质量阈值)。 在SonarQube的”Quality Gates”下,可以看到系统自带的质量阈值。它是针对新代码的。所以,在初次及没有新代码加入的情况下,执行代码分析是不会报出构建失败的。
版权归原作者 Ukulililion 所有, 如有侵权,请联系我们删除。