Jenkins持续集成入门到精通(入门篇)

1. 什么是持续集成

持续集成(Continuous integration,简称CI)指的是频繁将代码集成到主干。它的目的,就是让产品可以快速迭代,同时保持高质量。核心措施,代码集成到主干之前,必须通过自动化测试,只要有一个测试用例失败,就不能集成
持续集成的设计,从提交到生产,整个过程有以下步骤:

  • 提交

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

  • 构建

  • 测试(第二次)

  • 部署

  • 回滚

jenkins就是一个配置简单和使用方便的持续集成服务器(中文官网:https://www.jenkins.io/zh)
(1)持续集成流程说明
image
首先,开发人员进行代码提交,提交到git仓库;然后jenkins作为持续集成工具,将仓库代码集成到服务器,再配合JDK、Maven等软件完成代码编译、测试和打包;最后jenkins将生成的jar或war包分发到测试服务器或生产服务器,测试人员或用户就可以访问应用。

2.gitLab使用

2.1gitlab安装

1、安装相关依赖
yum -y install policycoreutils openssh-server openssh-clients postfix
2、启动ssh服务和设置为开机启动
systemctl enable sshd && sudo systemctl start sshd
3、设置postfix开机自启,并启动,postfix支持gitlab发信功能
systemctl enable postfix && systemctl start postfix
4、开放ssh以及http服务,然后重新加载防火墙
firewall-cmd --add-service=ssh --permanent
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
如果关闭防火墙不需要以上设置
5、下载gitlab包,并安装
在线下载安装包
安装:
rpm -i gitlab-ce-12.4.2-ce.el6.x86_64.rpm
6、修改gitlab配置
vi /etc/gitlab/gitlab.rb
修改gitlab访问地址和端口,默认为80,这里改为了82
external_url'http://192.168.66.100:82'
nginx['listen_port']= 82
7、重载配置及启动gitlab
gitlab-ctl reconfigure
gitlab-ctl restart
8、把端口添加到防火墙
firewall-cmd --zone=pubilc --add-port=82/tcp --permanent
firewall-cmd --reload
启动成功后,访问http://192.168.66.100:82

3.JenKins的使用

3.1 jenkins安装

(1)安装jdk
yum install java-1.8.0-openjdk* -y
安装目录为/usr/lib/jvm
(2)获取jenkins安装包
下载地址
(3)找到centos下载里面的rpm文件
rpm -ivh jenkins-2.190.3-1.1.noarch.rmp
(4)修改jenkins配置
vi /etc/sysconfig/jenkins
修改内容如下
JENKINS_USER="root"
JENKINS_PORT="8888"
(5)启动jenkins
systemctl start jenkins
(6)打开浏览器访问
http://192.168.66.101:8888
注意:如果开启防火墙,需要再防火墙添加端口
(7)跳过插件安装
jenkins连接默认官网下载,速度很慢,跳过插件安装
image
image

3.2jenkins安装插件

(1)修改jenkins插件下载地址
jenkins -> Manage Jenkins -> Manage Plugins 点击Available
等一会,这样做是为了把jenkins光放的插件列表下载到本地,接着修改地址文件,替换国内插件地址
cd /var/lib/jenkins/updates

sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
最后,Manage Plugins点击Advanced,把Update Site改为国内插件下载地址:
https://mirrors.tuna,tsinghua.edu.cn/jenkins/updates/update-center.json
提交后,在浏览器输入:http://192.168.66.101:8888/restart 重启jenkins
下载汉化插件
image

3.3 Jenkins用户权限管理

我们可以利用Role-based Authorization Strategy 插件来管理Jenkins用户权限
image
(1)开启全局安全配置
image
授权策略切换为"Role-Based Strategy",保存
image
(2)创建角色
在系统管理页面进入 Manage and Assign Roles
image
点击"Manage Roles"

  • Global roles(全局角色):管理员等高级用户可以创建基于全局的角色 - - Project roles(项目角色):针对某个或者某些项目的角色
  • Slave roles(奴隶角色):节点相关的权限
    我们添加以下三个角色:

baseRole:该角色为全局角色。这个角色需要绑定Overall下面的Read权限,是为了给所有用户绑定最基本的Jenkins访问权限。注意:如果不给后续用户绑定这个角色,会报错误:用户名 is missing the Overall/Read permission
role1:该角色为项目角色。使用正则表达式绑定"itcast.",意思是只能操作itcast开头的项目。
role2:该角色也为项目角色。绑定"itheima.
",意思是只能操作itheima开头的项目。

image
保存
(3)创建用户
在系统管理页面进入 Manage Users
image

image
分别创建两个用户:jack和eric
image

3.4给用户分配角色

系统管理页面进入Manage and Assign Roles,点击Assign Roles
绑定规则如下:

  • eric用户分别绑定baseRole和role1角色
  • jack用户分别绑定baseRole和role2角色
    image

3.5 创建项目测试权限

以itcast管理员账户创建两个项目,分别为itcast01和itheima01
image
结果为:

eric用户登录,只能看到itcast01项目
jack用户登录,只能看到itheima01项目

3.6 Jenkins凭证管理

凭据可以用来存储需要密文保护的数据库密码、Gitlab密码信息、Docker私有仓库密码等,以便Jenkins可以和这些第三方的应用进行交互。
image

image
image
image
Username with password:用户名和密码
SSH Username with private key: 使用SSH用户和密钥
Secret file:需要保密的文本文件,使用时Jenkins会将文件复制到一个临时目录中,再将文件路径设置到一个变量中,等构建结束后,所复制的Secret file就会被删除。
Secret text:需要保存的一个加密的文本串,如钉钉机器人或Github的api token
Certificate:通过上传证书文件的方式

3.7 安装git插件和git工具

(1)为了让jenkins支持从gitlab拉取代码,需要安装git插件和在centos7上安装git工具
image
centos上安装git工具
yum install git -y
查看版本
git --version
(2)jenkins添加git地址
(2.1)创建凭证
Jenkins->凭证->系统->全局凭证->添加凭证
image
选择"Username with password",输入Gitlab的用户名和密码,点击"确定"
(2.2)测试凭证是否可用
在gitlab中找到"源码管理"->“Git”,在Repository URL复制Gitlab中的项目URL
image

然后再jenkins中创建一个FreeStyle项目:新建Item->FreeStyle Project->确定
image
image
保存配置后,点击构建”Build Now“ 开始构建项目
image

查看/var/lib/jenkins/workspace/目录,发现已经从Gitlab成功拉取了代码到Jenkins中。

3.8 maven安装和配置

在jenkins集成服务器上,需要安装maven来编译和打包项目
(1)安装
先上传maven软件到192.168.66.101
tar -vxzf apache-maven-3.6.2-bin.tar.gz

mkdir -p /opt/maven

mv apache-maven-3.6.2/* /opt/maven
(2)配置环境变量
vi /etc/profile

  • 设置环境变量
    export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk

    export MAVEN_HOME=/opt/maven

    export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin

  • 使配置生效
    source /etc/profile

  • 查看maven版本
    mvn -v

  • 创建本地仓库目录
    mkdir /root/repo

  • 修改maven配置文件
    vi /opt/maven/conf/settings.xml
    修改为/root/repo
    修改为

点击查看代码
<mirror>
	 <id>alimaven</id>
 	<mirrorOf>central</mirrorOf>
 	<name>aliyun maven</name>
 	<url>https://maven.aliyun.com/repository/central</url>
</mirror>

<mirror> 
	<id>alimaven</id> 
	<name>aliyun maven</name> 
	<url>http://maven.aliyun.com/nexus/content/groups/public/</url> 
 	<mirrorOf>central</mirrorOf> 
 </mirror> 

(3)jenkins配置jdk和maven
Jenkins->Global Tool Configuration->JDK->新增JDK,配置如下:
可以参考(https://www.yuque.com/spiderman-dquv0/kgifc9/zk83s7#pRd9l)
image
Jenkins->Global Tool Configuration->Maven->新增Maven,配置如下:
image
(4)添加Jenkins全局变量
Manage Jenkins->Configure System->Global Properties ,添加三个全局变量
JAVA_HOME、M2_HOME、PATH+EXTRA
image
(5)测试maven是否成功
使用之前的gitlab密码测试项目,修改配置
image
构建->增加构建步骤->Execute Shell

image
image

再次构建,如果可以把项目打成包,代表maven环境配置成功啦!

3.9 tomcat安装和配置

(1)安装
把Tomcat压缩包上传到192.168.66.102服务器(如果springboot项目不用安装tomcat)

yum install java-1.8.0-openjdk* -y 安装JDK(已完成)
tar -xzf apache-tomcat-8.5.47.tar.gz 解压
mkdir -p /opt/tomcat 创建目录
mv /root/apache-tomcat-8.5.47/* /opt/tomcat 移动文件
/opt/tomcat/bin/startup.sh 启动tomcat

注意:服务器已经关闭了防火墙,所以可以直接访问Tomcat啦
地址为:http://192.168.66.102/8080
(2)配置Tomcat用户角色权限
默认情况下Tomcat是没有配置用户角色权限的
image
image
但是,后续Jenkins部署项目到Tomcat服务器,需要用到Tomcat的用户,所以修改tomcat以下配置,添加用户及权限

vi /opt/tomcat/conf/tomcat-users.xml

内容如下

<tomcat-users> 
	<role rolename="tomcat"/> 
	<role rolename="role1"/> 
	<role rolename="manager-script"/> 
	<role rolename="manager-gui"/> 
	<role rolename="manager-status"/> 
	<role rolename="admin-gui"/> 
	<role rolename="admin-script"/> 
	<user username="tomcat" password="tomcat" roles="manager-gui,manager- script,tomcat,admin-gui,admin-script"/> 
</tomcat-users>

用户和密码都是:tomcat
注意:为了能够刚才配置的用户登录到Tomcat,还需要修改以下配置
vi /opt/tomcat/webapps/manager/META-INF/context.xml
注释掉如下内容

<!-- 
<Valve className="org.apache.catalina.valves.RemoteAddrValve" 
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> 
-->

(3)重启测试

/opt/tomcat/bin/shutdown.sh 停止
/opt/tomcat/bin/startup.sh 启动

访问: http://192.168.66.102:8080/manager/html ,输入tomcat和tomcat,看到以下页面代表成功啦

4.Jenkins构建Maven项目

(1)jenkins构建的项目类型介绍
主要有三种:

  • 自由风格软件项目(freestyle project)
  • maven项目
  • 流水线项目
    推荐使用流水线,灵活度高

4.1 自由风格项目构建

集成过程:拉取代码->编译->打包->部署
(1)创建项目

(2)配置源码管理,在gitlab拉取代码

(3)构建->添加构建步骤->Executor Shell

echo "开始编译和打包" 
mvn clean package 
echo "编译和打包结束"

(4)部署
把项目部署到远程的Tomcat里面
安装tomcat插件,Jenkins本身无法实现远程部署到Tomcat的功能,需要安装Deploy to container插件实现

添加Tomcat用户凭证

添加构建后操作



点击"Build Now",开始构建过程

4.2 maven项目构建

(1)安装Maven Integration插件

(2)创建Maven项目

(3)配置项目
拉取代码和远程部署的过程和自由风格项目一样,只是构建部分不同

4.3 pipeline流水线

pipeline就是将原来独立运行于单个或多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化工作

  • 如何创建pipeline支持两种语法Declarative(声明式)和Scripted PipeLine(脚本式)
  • 也有两种创建方法:直接在jenkins的web Ui页面中输入脚本,也可以通过创建一个jenkinsfile脚本文件放入项目源码库中(一般选中放在源码中)
    (1)安装pipeline插件
    Manage Jenkins->Manage Plugins->可选插件

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

    流水线->选择HelloWorld模板

    生成的内容:
pipeline { 
	agent any 
		stages { 
		stage('Hello') { 
			steps { 
				echo 'Hello World' 
			} 
		} 
	} 
}

stages:代表整个流水线的所有执行阶段。通常stages只有1个,里面包含多个stage
stage:代表流水线中的某个阶段,可能出现n个。一般分为拉取代码,编译构建,部署等阶段。
steps:代表一个阶段内需要执行的逻辑。steps里面是shell脚本,git拉取代码,ssh远程发布等任意内容。
编写一个简单的脚本式Pipeline

node { 
	def mvnHome 
	stage('拉取代码') { 
		// for display purposes 
		echo '拉取代码' 
	}
	stage('编译构建') { 
		echo '编译构建' 
	}
	stage('项目部署') { 
		echo '项目部署' 
	} 
}

构建结果和声明式一样!

pipeline { 
	agent any 
	
	stages { 
		stage('拉取代码') { 
			steps { 
				checkout([$class: 'GitSCM', branches: [[name: '*/master']], 
				doGenerateSubmoduleConfigurations: false, extensions: [], 
				submoduleCfg: [], userRemoteConfigs: [[credentialsId: '68f2087f-a034-4d39-a9ff-1f776dd3dfa8', url: 'git@192.168.66.100:itheima_group/web_demo.git']]]) 
			} 
		} 
	} 
}

编译打包

pipeline { 
	agent any 
	
	stages { 
		stage('拉取代码') { 
			steps { 
				checkout([$class: 'GitSCM', branches: [[name: '*/master']], 
				doGenerateSubmoduleConfigurations: false, extensions: [], 
				submoduleCfg: [], userRemoteConfigs: [[credentialsId: '68f2087f-a034-4d39-a9ff-1f776dd3dfa8', url: 'git@192.168.66.100:itheima_group/web_demo.git']]]) 
			} 
		} 
		stage('编译构建') { 
			steps { 
				sh label: '', script: 'mvn clean package' 
			} 
		}
	} 
}

部署

pipeline { 
	agent any 
	
	stages { 
		stage('拉取代码') { 
			steps { 
				checkout([$class: 'GitSCM', branches: [[name: '*/master']], 
				doGenerateSubmoduleConfigurations: false, extensions: [], 
				submoduleCfg: [], userRemoteConfigs: [[credentialsId: '68f2087f-a034-4d39-a9ff-1f776dd3dfa8', url: 'git@192.168.66.100:itheima_group/web_demo.git']]]) 
			} 
		} 
		stage('编译构建') { 
			steps { 
				sh label: '', script: 'mvn clean package' 
			} 
		}
		stage('项目部署') { 
			steps { 
				deploy adapters: [tomcat8(credentialsId: 'afc43e5e-4a4e-4de6-984f- b1d5a254e434', path: '', url: 'http://192.168.66.102:8080')], contextPath: null, war: 'target/*.war' 
			} 
		}
	} 
}

刚才我们都是直接在Jenkins的UI界面编写Pipeline代码,这样不方便脚本维护,建议把Pipeline脚本放在项目中(一起进行版本控制)

  • 在项目根目录建立Jenkinsfile文件,把内容复制到该文件中

    把Jenkinsfile上传到Gitlab
  • 在项目中引用该文件

4.4 jenkins项目构建细节

jenkins内置4中构建触发器

  • 触发远程构建
  • 其他工程构建后触发(Build after other projects are build)
  • 定时构建(build periodically)
  • 轮询SCM(poll SCM)
  • 当gitlab改变时触发
    (1)触发远程构建

    http://192.168.66.101:8888/job/web_demo_pipeline/build?token=6666
    (2)其他工程构建后触发
    创建pre_job流水线工程

    (3)定时构建

    (4)轮询SCM
    轮询SCM,是指定时扫描本地代码仓库的代码是否有变更,如果代码有变更就触发项目构建。

    (5)Git hook自动触发构建(*)
    轮询SCM可以实现Gitlab代码更新,项目自动构建,但是该方案的性能不佳
    利用Gitlab的webhook实现代码push到仓库,立即触发项目自动构建。
    区别:

    需要安装两个插件:
    Gitlab Hook和GitLab


    Jenkins设置自动构建

    等会需要把生成的webhook URL配置到Gitlab中
    (5.1)Gitlab配置webhook
    开启webhook功能
    使用root账户登录到后台,点击Admin Area -> Settings -> Network
    勾选"Allow requests to the local network from web hooks and services"

    在项目添加webhook
    点击项目->Settings->Integrations

    注意:以下设置必须完成,否则会报错!
    Manage Jenkins->Configure System

4.5jenkins参数化构建

有时在项目构建的过程中,我们需要根据用户的输入动态传入一些参数,从而影响整个构建结果,这时我们可以使用参数化构建。
Jenkins支持非常丰富的参数类型

项目创建分支,并推送到Gitlab上,新建分支:v1,代码稍微改动下,然后提交到gitlab上。

这时看到gitlab上有一个两个分支:master和v1

在Jenkins添加字符串类型参数


改动pipeline流水线代码

点击Build with Parameters

入分支名称,构建即可!构建完成后访问Tomcat查看结果

5 配置邮箱服务器发送构建结果

安装Email Extension插件
image
(1)Jenkins设置邮箱相关参数
Manage Jenkins->Configure System
image
设置邮件参数
image
设置Jenkins默认邮箱信息
image
(2)准备邮件内容
在项目根目录编写email.html,并把文件推送到Gitlab,内容如下:
image

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>
			${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志
		</title>
	</head>
	<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
		<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans- serif">
			<tr>
				<td>
					(本邮件是程序自动下发的,请勿回复!)
				</td>
			</tr>
			<tr>
				<td>
					<h2>
						<font color="#0000FF">
							构建结果 - ${BUILD_STATUS}
						</font>
					</h2>
				</td>
			</tr>
			<tr>
				<td>
					<br />
					<b>
						<font color="#0B610B">
							构建信息
						</font>
					</b>
					<hr size="2" width="100%" align="center" />
				</td>
			</tr>
			<tr>
				<td>
					<ul>
						<li>
							项目名称&nbsp;:&nbsp;${PROJECT_NAME}
						</li>
						<li>
							构建编号&nbsp;:&nbsp;第${BUILD_NUMBER}次构建
						</li>
						<li>
							触发原因:&nbsp;${CAUSE}
						</li>
						<li>
							构建日志:&nbsp;
							<a href="${BUILD_URL}console">
								${BUILD_URL}console
							</a>
						</li>
						<li>
							构建&nbsp;&nbsp;Url&nbsp;:&nbsp;
							<a href="${BUILD_URL}">
								${BUILD_URL}
							</a>
						</li>
						<li>
							工作目录&nbsp;:&nbsp;
							<a href="${PROJECT_URL}ws">
								${PROJECT_URL}ws
							</a>
						</li>
						<li>
							项目&nbsp;&nbsp;Url&nbsp;:&nbsp;
							<a href="${PROJECT_URL}">
								${PROJECT_URL}
							</a>
						</li>
					</ul>
				</td>
			</tr>
			<tr>
				<td>
					<b>
						<font color="#0B610B">
							Changes Since Last Successful Build:
						</font>
					</b>
					<hr size="2" width="100%" align="center" />
				</td>
			</tr>
			<tr>
				<td>
					<ul>
						<li>
							历史变更记录 :
							<a href="${PROJECT_URL}changes">
								${PROJECT_URL}changes
							</a>
						</li>
					</ul>
					${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:
					<br />
					%c
					<br />
					",showPaths=true,changesFormat="
					<pre>
						[%a]
						<br />
						%m
					</pre>
					",pathFormat="&nbsp;&nbsp;&nbsp;&nbsp;%p"}
				</td>
			</tr>
			<tr>
				<td>
					<b>
						Failed Test Results
					</b>
					<hr size="2" width="100%" align="center" />
				</td>
			</tr>
			<tr>
				<td>
					<prestyle="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
						$FAILED_TESTS
						</pre>
						<br />
				</td>
			</tr>
			<tr>
				<td>
					<b>
						<font color="#0B610B">
							构建日志 (最后 100行):
						</font>
					</b>
					<hr size="2" width="100%" align="center" />
				</td>
			</tr>
			<tr>
				<td>
					<textarea cols="80" rows="30" readonly="readonly" style="font-family: Courier New">
						${BUILD_LOG, maxLines=100}
					</textarea>
				</td>
			</tr>
		</table>
	</body>

</html>

编写Jenkinsfile添加构建后发送邮件

pipeline {
	agent any stages {
		stage('拉取代码') {
			steps {
				checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '68f2087f-a034-4d39-a9ff-1f776dd3dfa8', url: 'git@192.168.66.100:itheima_group/web_demo.git']]])
			}
		}
		stage('编译构建') {
			steps {
				sh label: '',
				script: 'mvn clean package'
			}
		}
		stage('项目部署') {
			steps {
				deploy adapters: [tomcat8(credentialsId: 'afc43e5e-4a4e-4de6-984f- b1d5a254e434', path: '', url: 'http://192.168.66.102:8080')],
				contextPath: null,
				war: 'target/*.war'
			}
		}
	}
	post {
		always {
			emailext(subject: '构建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!', body: '${FILE,path="email.html"}', to: 'xxx@qq.com')
		}
	}
}

测试
image
备注:
邮件相关全局参数参考列表
系统设置->Extended E-mail Notification->Content Token Reference,点击旁边的?号
image

6 Jenkins+SonarQube代码审查

(1)安装SonarQube
SonarQube是一个用于管理代码质量的开放平台,可以快速的定位代码中潜在的或者明显的错误
环境要求
image
安装MySQL(已完成),安装SonarQube,在MySQL创建sonar数据库
image
下载sonar压缩包:
https://www.sonarqube.org/downloads/
解压sonar,并设置权限

yum install unzip
unzip sonarqube-6.7.4.zip 解压
mkdir /opt/sonar 创建目录
mv sonarqube-6.7.4/* /opt/sonar 移动文件
useradd sonar 创建sonar用户,必须sonar用于启动,否则报错
chown -R sonar. /opt/sonar 更改sonar目录及文件权限

修改sonar配置文件

vi /opt/sonarqube-6.7.4/conf/sonar.properties

内容如下:

sonar.jdbc.username=root 
sonar.jdbc.password=Root@123
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false

注意:sonar默认监听9000端口,如果9000端口被占用,需要更改。
启动sonar

cd /opt/sonarqube-6.7.4
su sonar ./bin/linux-x86-64/sonar.sh start 启动
su sonar ./bin/linux-x86-64/sonar.sh status 查看状态
su sonar ./bin/linux-x86-64/sonar.sh stop 停止
tail -f logs/sonar.logs 查看日志

访问sonar
http://192.168.66.101:9000
image
默认账户:admin/admin
创建token
image

token要记下来后面要使用
bb8b6c53d9d921e101343cef0395243e6c1dc8a3

(2)实现代码审查
image
SonarQube Scanner插件
image
添加SonarQube凭证
image
image
Jenkins进行SonarQube配置

Manage Jenkins->Configure System->SonarQube servers
image
Manage Jenkins->Global Tool Configuration
image
SonaQube关闭审查结果上传到SCM功能
image
在项目添加SonaQube代码审查(非流水线项目)
添加构建步骤:

# must be unique in a given SonarQube instance 
sonar.projectKey=web_demo 
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1. 
sonar.projectName=web_demo 
sonar.projectVersion=1.0 
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. 
# This property is optional if sonar.modules is set. 
sonar.sources=. 
sonar.exclusions=**/test/**,**/target/** 
sonar.java.source=1.8 
sonar.java.target=1.8 
# Encoding of the source code. Default is default system encoding 
sonar.sourceEncoding=UTF-8

在项目添加SonaQube代码审查(流水线项目)
1))项目根目录下,创建sonar-project.properties文件
image

# must be unique in a given SonarQube instance 
sonar.projectKey=web_demo 
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1. 
sonar.projectName=web_demo 
sonar.projectVersion=1.0 
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. 
# This property is optional if sonar.modules is set. 
sonar.sources=. 
sonar.exclusions=**/test/**,**/target/** 
sonar.java.source=1.8 
sonar.java.target=1.8 
# Encoding of the source code. Default is default system encoding 
sonar.sourceEncoding=UTF-8

2)修改Jenkinsfile,加入SonarQube代码审查阶段

pipeline {
	agent any stages {
		stage('拉取代码') {
			steps {
				checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '68f2087f-a034-4d39-a9ff-1f776dd3dfa8', url: 'git@192.168.66.100:itheima_group/web_demo.git']]])
			}
		}
		stage('编译构建') {
			steps {
				sh label: '',
				script: 'mvn clean package'
			}
		}
		stage('SonarQube代码审查') {
			steps {
				script {
					scannerHome = tool 'sonarqube-scanner'
				}
				withSonarQubeEnv('sonarqube6.7.4') {
					sh "${scannerHome}/bin/sonar-scanner"
				}
			}
		}
		stage('项目部署') {
			steps {
				deploy adapters: [tomcat8(credentialsId: 'afc43e5e-4a4e-4de6-984f- b1d5a254e434', path: '', url: 'http://192.168.66.102:8080')],
				contextPath: null,
				war: 'target/*.war'
			}
		}
	}
	post {
		always {
			emailext(subject: '构建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!', body: '${FILE,path="email.html"}', to: '1014671449@qq.com')
		}
	}
}

到SonarQube的UI界面查看审查结果
image

posted @ 2022-06-02 14:01  spiderMan1-1  阅读(709)  评论(0编辑  收藏  举报