一:环境准备
操作系统:Centos 7
Jdk1.8
Git2.9.5
Maven3.6.1
并配置好对应环境变量
二:Jenkins安装
1.从Jenkins官网下载jenkins.war文件。官网地址:https://jenkins.io/zh/,注意选择最新版本的Long-Term Support Release版本
2.将war包拷到相应文件夹
3.后台运行:
nohup java -jar jenkins.war &
三:Jenkins配置和使用
1.登入http://localhost:8080/jenkins,进入Jenkins初始化页面
如果jenkins报错:Problem accessing /jenkins/. Reason: HTTP ERROR 404
这是一个Jenkins的Bug。临时解决方法是:在浏览器中手工输入:http://localhost:8080,不要访问"/jenkins"这个路径。
2.安装默认的插件
3.设置管理员用户
4.设置成功后即进入Jenkins主界面
5.点击左上侧系统管理,进入Jenkins基本系统设置
6.全局工具配置
6.1 maven
6.2 jdk
6.3 git
Git位置可能是"whereis git"的地址,也可能是"whereis git"的地址 + “/bin/git”,注意此时不报错就行
6.4 maven安装
7.插件安装(有些插件已经内置,所以可以在已安装里面搜一下)
【Safe Restart】重启jenkins系统
【Email Extension】由于Jenkins自带的邮件功能比较鸡肋,因此推荐安装专门的邮件插件
【maven integration】该插件安装了,才能创建maven项目
【git plugin】从远程拉取代码
【publish over ssh】ssh远程登录
【SSH Plugin】或者叫【SSH】SSH登录到一个远程服务器以执行必要的脚本
8.全局安全配置
jenkins全局安全设置中取消勾选“防止跨站点请求伪造,不然jenkins会认为gitlab的请求不合法
9.系统设置
HTML模板
<!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="#FF0000">构建结果 - ${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> SVN_URL
<td>
<ul>
<li>项目名称:${PROJECT_NAME}</li>
<li>SVN路径:${SVN_URL}</li>
<li>构建编号:${BUILD_NUMBER}</li>
<li>SVN版本:${SVN_REVISION}</li>
<li>触发原因:${CAUSE}</li>
<li>构建日志:<a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
</ul>
</td>
</tr>
<tr>
<td>
<b><font color="#0B610B">变更信息:</font></b>
<hr size="2" width="100%" align="center" />
</td>
</tr>
<tr>
<td>
<ul>
<li>上次构建成功后变化 : ${CHANGES_SINCE_LAST_SUCCESS}</a></li>
</ul>
</td>
</tr>
<tr>
<td>
<ul>
<li>上次构建不稳定后变化 : ${CHANGES_SINCE_LAST_UNSTABLE}</a></li>
</ul>
</td>
</tr>
<tr>
<td>
<ul>
<li>历史变更记录 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>
</ul>
</td>
</tr>
<tr>
<td>
<ul>
<li>变更集:${JELLY_SCRIPT,template="html"}</a></li>
</ul>
</td>
</tr>
<!--
<tr>
<td>
<b><font color="#0B610B">Failed Test Results</font></b>
<hr size="2" width="100%" align="center" />
</td>
</tr>
<tr>
<td>
<pre style="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>Test Logs (if test has ran): <a
href="${PROJECT_URL}ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip">${PROJECT_URL}/ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip</a>
<br />
<br />
</td>
</tr> -->
<!--
<tr>
<td>
<textarea cols="80" rows="30" readonly="readonly" style="font-family: Courier New">${BUILD_LOG, maxLines=100,escapeHtml=true}</textarea>
</td>
</tr>-->
<hr size="2" width="100%" align="center" />
</table>
</body>
</html>
10.构建任务
10.1 新建item
10.2 配置
URL使用HTTP时会报错,此时换成SSH方式就能成功
clean install -Dmaven.test,skip=true
10.3 手动构建
四:Sonar的安装和使用
1.安装Sonar
1.1 官网https://www.sonarqube.org/downloads/下载
1.2 解压到特定的文件夹
1.3 创建运行账户sonar,并设置账户密码(sonar不能用root启动)
useradd sonar
passwd sonar
注意将文件夹所有人赋予sonar
chown -R sonar:sonar /sonar-7.7
2.配置数据库(MySQL)
CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'sonar' IDENTIFIED BY 'xwj***@Jet';
GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'xwj***@Jet';
GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'xwj***@Jet';
FLUSH PRIVILEGES;
3.Sonar配置文件修改(添加数据库信息)
文件位置为${SONAR_HOME}/conf/sonar.properties
sonar.jdbc.username=sonar
sonar.jdbc.password=xwj***@Jet
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
sonar.jdbc.driverClassName:com.mysql.jdbc.Driver
4.配置环境变量(vim /etc/profile)
export SONAR_HOME=/usr/local/sonarqube-6.7.5
PATH=$PATH:$SONAR_HOME/bin:$SONAR_RUNNER_HOME/bin
5.启动(先切换到sonar用户)
进入到${SONAR_HOME}/bin/linux-x86-64目录
./sonar.sh start
排错说明:可以先跟着sonar.log日志,如果报了es错误,可以去查看es.log;如果报了web错误,那么就是查看web.log
在浏览器中访问: http://localhost:9000/ ,运行界面如下代表成功
Sonar默认的端口是”9000”、默认的上下文路径是”/”、默认的网络接口是”0.0.0.0”,默认的管理员帐号和密码为:admin/admin
6.页面配置
登陆过后在配置栏里禁用掉SCM,不禁用的话在执行Sonar Scanner完成后,SonarQube Server还会去访问SVN项目,再次要求输入用户名和密码,导致扫描任务失败
7.插件
安装过后重启Sonar则可
8.使用Sonar分析Maven工程代码
8.1 找到maven的安装目录,修改setting.xml文件
<pluginGroups>
<pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
</pluginGroups>
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<sonar.host.url>
http://localhost:9000
</sonar.host.url>
</properties>
</profile>
</profiles>
8.2 进入想要测试的maven工程中
8.3 3.执行命令
mvn clean verify sonar:sonar
另一种使用Sonar分析Maven工程代码的方法
在页面点击创建新项目->项目标识->创建令牌->选择java/maven->生成命令mvn
sonar:sonar \
-Dsonar.projectKey=1111ee \
-Dsonar.host.url=http://192.168.203.241:9000 \
-Dsonar.login=d640239d8e6f90b4ec038f22975fc2bf7329176a
在maven工程中执行上述代码
五:Jenkins与Sonar集成
1.安装Jenkins插件
登录Jenkins→系统设置→插件管理→可选插件→搜索SonarQube
安装后重启Jenkins
2.全局配置
3.全局工具配置
这里可以通过访问SonarQube Scanner官网进行下载相应Zip包,或者在Jenkins里进行自动安装
3.1 使用自己下载的Zip包(本人使用)
3.1.1 访问Sonar官网下载scanner插件:https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner
3.1.2 下载以后放到特定文件夹并解压
3.1.3 配置
3.2 Jenkins自动安装
4.在Jenkins中使用Sonar
4.1 配置项目
找到Post Steps项
sonar.projectKey=2019-07-23-job //必填,不要和其他sonar项目重名
sonar.projectName=websocket //必填,随意取
sonar.projectVersion=1.0 //必填,随意取
sonar.sources=/root/.jenkins/workspace/test5/src/main/java/ //必填 路径为项目构建后工程所在目录
sonar.java.binaries=/root/.jenkins/workspace/test5/target/classes/ //必填 路径为项目构建后target/classes所在目录
sonar.java.libraries=/root/.m2/repository/org/projectlombok/lombok/1.16.18/lombok-1.16.18.jar //可有可无
sonar.java.coveragePlugin=jacoco
sonar.jacoco.reportPaths=./targe/coverage-reports/jacoco-unit.exec
sonar.dynamicAnalysis=reuseReports
sonar.language=java
sonar.sourceEncoding=UTF-8
4.2 构建
4.3 构建完成
4.4 跳转查看
五:实践过程中的坑
1.Jenkins安装配置问题
1.1 Jenkins安装在linux服务器上,通过yum安装的git一般都是1.X低版本的,执行Jenkins时会提示git版本的错误。
解决方法:需把通过yum安装的git卸载掉,重新安装2.X及以上高版本的git。
1.2 Jenkins构建项目时,会按照maven的setting.xml中配置的把依赖包下载到指定的仓库中。如果这个时候报关于maven的错误,很可能是本地仓库权限问题,给maven本地仓库赋予777的权限。
1.3 当git版本,maven配置都没问题时,用Jenkins构建执行,会报jdk的问题,这是由于jdk版本低引起的,应装jdk1.8版本及以上。
注:如之前在Jenkins中已经配置了低版本jdk的路径,而linux服务器中也修改了jdk高版本,这时候会打不开Jenkins页面。需要做如下操作:一,找到Jenkins中的conf.xml,vi编辑
1.4. jenkins执行shell脚本等场景中遇见的权限不足问题
解决方法:以root用户运行jenkins中shell命令
以centOS系统为例,记录下修改Jenkins以root用户运行的方法。
修改Jenkins配置文件
打开配置文件
vim /etc/sysconfig/jenkins
修改$JENKINS_USER,并去掉当前行注释
$JENKINS_USER="root"
修改Jenkins相关文件夹用户权限
chown -R root:root /var/lib/jenkins
chown -R root:root /var/cache/jenkins
chown -R root:root /var/log/jenkins
重启Jenkins服务并检查运行Jenkins的用户是否已经切换为root
重启Jenkins(若是其他方式安装的jenkins则重启方式略不同)
service jenkins restart
2.Sonar安装配置问题
2.1 保证至少3GB可用内存,否则会直接导致启动失败
2.2 SonarQube6.6以上版本不能使用root账号启动,否则会报错
解决办法:新建一个sonar账号,并用root账号给sonar账号赋予权限
2.3 Linux不一样的用户启动,需要删除目录下的temp临时文件夹,不然会报错
2.4 如果启动了sonar,但是无法进入平台,可能是因为防火墙没关,这时可以将防火墙关闭并重新载入
注:防火墙的shell命令:
firewall-cmd --zone=public --add-port=80/tcp --permanent (--permanent永久生效,没有此参数重启后失效)
firewall-cmd --reload 重新载入
firewall-cmd --zone=public --remove-port=80/tcp --permanent 删除
firewall-cmd --zone=public --query-port=80/tcp 查看
firewall-cmd --state 查看firewall是否运行
firewall-cmd --list-services 查看当前开了哪些端口
firewall-cmd --get-services 查看还有哪些服务可以打开
firewall-cmd --zone=public --list-ports 查看所有打开的端口
2.5 如果Sonar配置好且运行成功,但过一会自动关闭且报出错误信息: Process exited with exit value [es]: 137
解决方案:因为分配内存过低引起,将虚拟机的运行内存提升至3GB或更高则可保证正常运行
3 Jenkins集成Sonar问题
3.1 在Jenkins里配置SonarQube时,配置里有自动下载SonarQube Scanner的选项.文件比较大,最好自己下载解压然后指定对应解压的位置
3.2 在配置构建项目时,如果项目是第一次构建,则单元测试可能会需要很长时间。如果不需要单元测试,在Build里添加跳过测试的mvn命令。
3.3 在配置构建项目时,在Post Steps配置sonar信息时,要把SonarQube Scanner扫描路径填写正确,否则扫描会失败并报错
3.4 如果Jenkins构建成功,但是Sonar扫描失败,可能是因为IP地址有变更,但是在Jenkins里配置的SonarQube Service没有做更新.
3.5 如果sonar扫描分析过后,页面上代码覆盖率显示为0.0%,则可能是扫描配置没有配置正确,或者pom文件里jacoco包路径错误,需要重新确认无误再进行扫描
在pom文件里加入:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.7.201606060606</version>
<configuration>
<!--指定生成 .exec 文件的存放位置-->
<destFile>target/coverage-reports/jacoco-unit.exec</destFile>
<!--Jacoco 是根据 .exec 文件生成最终的报告,所以需指定 .exec 的存放路径-->
<dataFile>target/coverage-reports/jacoco-unit.exec</dataFile>
</configuration>
<executions>
<execution>
<id>jacoco-initialize</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>jacoco-site</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
在jenkins的项目配置里Post Steps里的Analysis properties添加
sonar.java.coveragePlugin=jacoco
sonar.jacoco.reportPaths=./targe/coverage-reports/jacoco-unit.exec
sonar.dynamicAnalysis=reuseReports