🧆Jenkins整合svn、svnchecker、SonarQube
一、Jenkins介绍
1.1 持续集成
持续集成( Continuous integration , 简称 CI )指的是,频繁地(一天多次)将代码集成到主干。 持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干 之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
1.2 Jenkins持续集成的过程(传统方式与自动化部署)
传统部署:
自动化部署:
搭建上述持续集成环境可以把整个构建、部署过程自动化,很大程度上减轻工作量。对于程序员的日常开发来说不会造成任何额外负担——自己把代码提交上去之后,服务器上运行的马上就是最新版本,一切都发生在无形中。
二、环境搭建
1、准备工作
服务器准备:
需要准备三台服务器,分别是:
- SVN代码托管服务器
- Jenkins服务器
- WEB发布服务器(Tomcat)
下面是我演示用的三台服务器的IP:
Jenkins-->110.43.204.225
SVN-->43.143.195.160
WEB-->182.92.209.212
需要用到的软件
本文基于jdk1.8进行构建:
Jenkins(2.346.1)、JDK、Maven、Tomcat、SVN
软件打包到以下地址了:
链接:https://pan.baidu.com/s/1CD7IXZ_E-RNTsXEl6L7SRw?pwd=8mz8
软件的安装
软件的安装:在哪台服务器装什么软件就不演示了,到时会说明需要装什么,按照下面教程进行安装即可:
JDK:https://www.cnblogs.com/zhangzhixi/p/14399602.html#_label0_1
Maven:https://www.cnblogs.com/zhangzhixi/p/14399602.html#_label0_4
SVN:https://www.cnblogs.com/zhangzhixi/p/14399602.html#_label0_5
Tomcat:https://www.cnblogs.com/zhangzhixi/p/14399602.html#_label0_2
2、WEB发布服务器环境搭建
需要安装:JDK和Tomcat
还需要配置Tomcat用户,是为了后面通过Jenkins发布war包到此服务器Tomcat上面进行部署。
在$TOMCAT_HOME/conf/tomcat-users.xml,最下面添加以下内容:表示新建一个用户tomcat,密码123456
<role rolename="tomcat"/> <role rolename="role1"/> <role rolename="manager-status"/> <role rolename="manager-script"/> <role rolename="manager-gui"/> <role rolename="admin-script"/> <role rolename="admin-gui"/> <user username="tomcat" password="123456" roles="manager-gui,manager-script,tomcat,admin-gui,admin-script"/>
如何测试新建的用户?
这时候大概率是出现了403,需要在$TOMCAT_HOME//webapps/manager/META-INF/context.xml,注释以下代码即可
3、SVN服务器环境搭建
直接看上面的安装教程即可,不需要其他环境
4、Jenkins环境搭建
前置条件,需要安装:JDK、Maven、Tomcat
然后修改下tomcat端口为80(非必须),再将jenkins.war包放在tomcat的webapps目录下,最后启动tomcat
访问以下地址:http://110.43.204.225/jenkins/
并复制秘钥到下面: cat /root/.jenkins/secrets/initialAdminPassword
然后就是耐心等待插件的安装:
这边我就创建一个账户:admin 123456
设置国内镜像源
进入 Manage Jenkins -> Manage Plugin -> Advanced 最下面有 Update Site,设置为: http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
然后重启Jenkins:ip+端口/jenkins/restart
安装所需插件:选择插件,然后点击Install without restart安装即可
附插件市场地址:https://plugins.jenkins.io/
中文语言包:Locale(180.v207501dff9b_a_) SVN插件:Subversion(2.16.0) 部署web应用:Deploy to container(1.16) Maven插件:Maven IntegrationVersion(3.20) SSH上传插件:Publish Over SSH(1.24)
解决安装完成中文语言包,部分中文的问题:
1、安装插件(locale、Localization); 2、在System Configuration--Configure System下,找到Locale输入Default Language为en_US并勾选“Ignore browser preference and force this language to all users“ 3、restart重启Jenkins:http://域名/restart; 4、再次语言设定为zh_CN,Jenkins切换为中文。
设置本机的JDK、Maven地址
系统管理->全局工具配置
保存即可。
三、Jenkins整合SVN
前言(非必须):配置Jenkins的CSRF
在使用Jenkins的时候总是保存很慢,前端报错,错误关键词:Found invalid crumb 。和CSRF验证有关联,有说使用Strict Crumb Issue插件来解决。
第一步:Strict Crumb Issuer插件安装
进入Jenkins插件管理,Available选项,搜索Strict Crumb插件安装Strict Crumb Issuer插件,然后进入jenkins->系统设置->全局安全设置->跨站请求伪造保护,把下拉选项改成Strict Crumb Issue,点开右下高级设置,去除掉Check the session ID选项选中,当然我这样设置了貌似没有生效。
第二步:配置Jenkins-Authentication
系统设置-->全局安全配置-->Authentication
1、新建任务
2、 配置SVN
直接保存,然后点击左侧的:立即构建按钮,看是否能把源码下下来
3、配置Maven:进行编译打包
查看是否打包成功
4.1、发布到WEB容器(第一种:将项目放在webapps下)
保存后,然后执行立即构建,就可以看到war包已经成功到我们的WEB服务器上面了
访问地址即可看到我们代码中的内容
http://182.92.209.212:8080/apple/index.jsp
4.2、发布到WEB容器(第二种:将项目名称修改为ROOT)
在第一种部署Tomcat的方式上,在webapps下的项目必须要加上项目名称。
该如何设置不通过项目名就能访问到项目呢?可以将Jenkins项目的配置-Context-Path设置为ROOT
因为Tomcat默认就是将应用放在了$CATALINA_HOME/ROOT下,可以将Tomcat自带的ROOT目录删除。
这样我们再通过Jenkins进行打包发布访问的时候就不需要加上项目名称了。
4.3、第三种:通过SSH+Shell脚本
在4.2的时候对4.1的部署方式进行了一些优化,但是感觉还是不太够,因为部署在webapps下的方式不能够重启tomcat、如果遇到修改项目配置文件等的操作
需要重启tomcat,那么就显得有些不足了。
本方式采用SSH+Shell脚本进行部署项目,并重启Tomcat,SSH(为了将Maven的war包上传到服务器),Shell(执行脚本关闭/启动Tomcat)
1、Jenkins配置SSH
安装SSH上传插件:Publish Over SSHVersion,配置SSH步骤如下:系统管理-系统配置-Publish over SSH
2、配置项目:添加构建后操作
将之前部署Tomcat的步骤(Deploy war/ear to a container)删除,添加Send build artifacts over SSH
shell脚本如下,创建文件后还需要给文件添加执行权限:chmod 777 tomcat-restart.sh
#!/bin/bash export JAVA_HOME=/usr/local/java/jdk1.8.0_144 # jdk-jar位置(解压war包) jar_home=/usr/local/java/jdk1.8.0_144/bin/jar # tomcat的位置(关闭/启动tomcat) tomcat_home=/usr/local/tomcat8/apache-tomcat-8.5.51 # WEb应用放置的位置(自定义应用存放位置,与Remote Directory一致) application_path=/opt/application #【1】 停止tomcat变量 SHUTDOWN=$tomcat_home/bin/shutdown.sh #【2】 启动tomcat变量 STARTTOMCAT=$tomcat_home/bin/startup.sh #【3】解压war包 cd $application_path;$jar_home -xvf $application_path/*.war; echo " ==================start【`date +"%Y-%m-%d %H:%M:%S"`】==================" >> ./tomcat-restart.log #【4】关闭进程 PID=`ps -ef |grep $tomcat_home/conf |grep -v grep | awk '{print $2}'` if [ ! "$PID" ];then # 这里判断TOMCAT进程是否存在 echo "进程不存在" >> ./tomcat-restart.log else echo "进程存在,关闭Tomcat" >> ./tomcat-restart.log kill -9 $PID fi #【5】启动项目 $STARTTOMCAT echo "启动项目" >> ./tomcat-restart.log echo " ==================end【`date +"%Y-%m-%d %H:%M:%S"`】====================" >> ./tomcat-restart.log
3、修改tomcat配置文件
需要修改两个地方:
- 1、去除Host标签的appBase="webapps"属性,同时可以删除webapps目录,不会对应用造成影响因为不是通过tomcat的用户进行登录传输war包了
- 2、添加<Context>标签
然后进行Jenkins构建即可,SSH会将构建完成的war包放到你指定的目录下,然后执行你的脚本文件
5、Maven多模块项目打包发布
1、项目打war包
项目打war包需要添加maven插件,参考:https://www.cnblogs.com/zhangzhixi/p/17010235.html
确保war包放在本地tomcat的webapps下能够正常访问项目
2、配置项目SVN地址
上面有进行配置的操作,这里就不再赘述
3、maven打包
这样就会在项目的target下生成war包了
4、通过SSH,将war包传输到web发布服务器
第一步:配置web发布服务器地址,参考上面的:https://www.cnblogs.com/zhangzhixi/p/17015148.html#_label2_6
第二步:配置项目中的参数:
5、编写shell脚本:手动更改变量的值
#!/bin/bash export JAVA_HOME=/mixky/software/jdk/jdk1.7.0_80 # jar命令的位置(解压war包) jar_cmd="/mixky/software/jdk/jdk1.7.0_80/bin/jar" # tomcat的位置(关闭/启动tomcat) tomcat_home=/mixky/software/tomcat/tomcat-rfwm tomcat_log=${tomcat_home}/logs/catalina.out # 项目目录的位置 project_dir="/mixky/project/rfwm-cicd-dev" #【1、解压war包】 cd "$project_dir" echo " ==================start【$(date +"%Y-%m-%d %H:%M:%S")】==================" >>./tomcat-restart.log # 在项目目录及其子目录中查找所有以 .war 为后缀的文件。 find "$project_dir" -name "*.war" | while read war_file; do dir_name="$(basename "${war_file%.*}")" if [ -d "$dir_name" ]; then # 清空目录里的内容 rm -rf "$dir_name"/* else mkdir "$dir_name" fi cd "$dir_name" # 解压 "$jar_cmd" -xf "$war_file" cd .. done #【2、关闭tomcat进程】 PID=$(ps -ef | grep $tomcat_home/conf | grep -v grep | awk '{print $2}') if [ ! "$PID" ]; then # 这里判断TOMCAT进程是否存在 echo "进程不存在" >>./tomcat-restart.log else echo "进程存在,关闭Tomcat" >>./tomcat-restart.log kill -9 $PID fi #【3】启动项目 ${tomcat_home}/bin/startup.sh >${tomcat_log} 2>&1 & echo "启动项目" >>./tomcat-restart.log echo " ==================end【$(date +"%Y-%m-%d %H:%M:%S")】====================" >>./tomcat-restart.log
然后执行构建即可!
end:通过Maven整合SonarQube
clean install -Dmaven.test.skip=true sonar:sonar -Dsonar.host.url=http://202.85.222.14:9000 -Dsonar.login=d49cd67c5a4d2375a1cc405ef69febc07b4d5928 -Dsonar.projectKey=${JOB_NAME} -Dsonar.projectName=${JOB_NAME} -Dsonar.ws.timeout=300000
6、[构建触发器]
远程触发的基本原理是 SVN 服务器给 Jenkins 项目特定的 URL 地址发送请求,但必须以请求参数的形式携带一个特定值,这个特定值就是这里的“身份验证令牌”。
地址访问规则是:JENKINS_URL
/job/apple/build?token=TOKEN_NAME
比如我们这个项目的地址触发地址是:http://110.43.204.225/jenkins/job/apple/build?token=APPLE
7、[SVN钩子程序]
表示在提交代码后,SVN会去做什么事情,这里演示的功能是:
Begin:禁用 Jenkins 中的 CSRF
必须要禁用这个,不然无法通过curl命令发送触发器会出现403
具体配置路径是:系统管理-->命令行脚本-->写入-->运行脚本
hudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
运行脚本
Linux下通过curl 命令用来发送 HTTP 请求
这样我们就可以在SVN服务器上面通过执行curl命令,来达到第五步的通过浏览器访问然后执行构建的功能了。
admin:123456,是Jenkins登录时的用户名和密码
curl -X post -v -u admin:123456 http: //110.43.204.225/jenkins/job/apple/build?token=APPLE
编辑SVN钩子程序
在SVN配置文件下有这样一个文件:/usr/local/svn/svnrepos/project/hooks/post-commit.tmpl,表示在执行commit之后,SVN会做什么事情。
我们复制一份这个文件,并修改为:post-commit,这样才能够被SVN识别到。
cd /usr/local/svn/svnrepos/project/hooks/ cp post-commit.tmpl post-commit
编辑这个文件: vim post-commit
给文件权限: chmod 755 post-commit
测试钩子程序
提交后发现确实是Jenkins自动执行了构建
访问项目,查看部署成功:
8、[SVN钩子程序之多项目Jenkins触发脚本]
在Jenkins上面不止是管理一个项目,在SVN上面也不只是管理一个项目
我们多个项目的时候,上传某一个项目代码到SVN,怎样实现只更新部署提交的项目,而对其他的项目没有影响,这就要用到脚本文件
很简单,只需要修改一下两处即可,多个项目配置多个:
#!/bin/sh export LANG=en_US.UTF-8 # 仓库的路径 REPOS="$1" # 新提交的版本号 REV="$2" # 钩子脚本的日志 LOGFILE=/var/log/svn.log # 脚本的标准输出和标准错误输出都打印到日志文件里 exec 1>>"$LOGFILE" exec 2>&1 SVNLOOK=/usr/bin/svnlook TIME=$(date "+%Y-%m-%d %H:%M:%S") # 提交作者 AUTHOR=$($SVNLOOK author -r "$REV" "$REPOS") # 修改的目录集合 CHANGEDDIRS=$($SVNLOOK dirs-changed "$REPOS") # 提交时的备注信息,不建议用中文 MESSAGE=$($SVNLOOK log -r "$REV" "$REPOS") # CHANGEDDIRS里的主目录 MASTERDIR=$(echo "$CHANGEDDIRS" | head -1) PROJECT=$(echo "$MASTERDIR" | awk -F/ '{print $1}') # 根据项目名称决定使用哪个 token if [ "$PROJECT" == "中铁现场焊接管理系统" ] then curl -X POST -v -u admin:123456 http://xxx/jenkins/job/rfwm-cicd-dev/build?token=rfwm-cicd-dev elif [ "$PROJECT" == "demo" ] then curl -X post -v -u admin:123456 http://xxx/jenkins/job/demo/build ?token=DEMO else echo "Input Is Error." echo "项目名称:$PROJECT" fi
四、Jenkins整合GIT
本案例使用GitHub进行演示
1、安装Git,以及设置GitHub的SSH公钥
参考地址:https://www.cnblogs.com/zhangzhixi/p/14399602.html#_label0_6
2、Jenkins配置:全局工具配置
1、设置Git安装地址
系统管理-->全局工具配置
3、配置项目:源码管理
这里就只演示GitHub项目地址的修改,其他的设置比如:触发器、Maven、Tomcat参考上面SVN教程即可
凭证填上面的id_rsa文件里面的私钥,命令:cat /root/.ssh/id_rsa然后复制里面的私钥填到sshkey凭证里面。
私钥获取方式参考:https://www.cnblogs.com/zhangzhixi/p/14518947.html#_label0_1,在上面Git的安装也已经说过了
4、打包发布
参考上面SVN教程即可,发布到WEB容器
[5、GitHub钩子程序]
GitHub钩子解释:Webhook 允许在某些事件发生时通知外部服务。 当指定的事件发生时,我们将向你提供的每个网址发送一个 POST 请求
五、SVN代码检查(整合svnchecker)
主要是做SVN代码提交前,对代码进行格式的校验
采用:SVN-PreCommitChecks + CheckStyle + svnchecker方案
代码检查的包放在了里面:https://pan.baidu.com/s/1CD7IXZ_E-RNTsXEl6L7SRw?pwd=8mz8
1、创建SVN代码库
参考博客进行搭建(SVN代码托管服务器搭建):https://www.cnblogs.com/zhangzhixi/p/14399602.html#_label0_5
2、下载安装包
附上Checkstyle和checkstyle的下载地址:
Checkstyle:https://github.com/checkstyle/checkstyle/releases
checkstyle:https://sourceforge.net/projects/svnchecker/files/svnchecker/0.3/
上传:将这两个包上传到服务器的/usr/local/svn_style下(非必须):
mkdir -p /usr/local/svn_style
tar -zxvf svnchecker-0.3.tar.gz
3、修改SVN配置
1、进入hooks目录
如果是按照上面教程安装的话,那么地址就是:/usr/local/svn/svnrepos/project/hooks
或者通过命令查找SVN的hooks目录也是可以的: find / -name hooks
2、将pre-commit.tmpl复制为pre-commit
pre-commit表示是在提交代码前做什么事情
cp pre-commit.tmpl pre-commit chmod 755 pre-commit
3、修改配置文件:vim pre-commit
注释下面图片标注的1,然后添加下面的配置(/usr/local/svn_style/svnchecker-0.3/为下载的插件目录)
/usr/local/svn_style/svnchecker-0.3/Main.py PreCommit "$REPOS" "$TXN" || exit 1
4、新建代码检查配置文件(名称自定义)
touch idea_checks.xml
配置文件内容如下
<?xml version="1.0"?> <!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN" "http://www.puppycrawl.com/dtds/configuration_1_3.dtd"> <module name="Checker"> <!-- 检查文件是否以一个空行结束 --> <module name="NewlineAtEndOfFile"/> <module name="TreeWalker"> <!-- 禁止使用System.out.println --> <module name="Regexp"> <property name="format" value="System\.out\.println"/> <property name="illegalPattern" value="true"/> </module> </module> </module>
详细的配置
请参考:https://blog.csdn.net/KingBoyWorld/article/details/76082399
5、hooks目录添加配置文件
touch svncheckerconfig.ini vim svncheckerconfig.ini
写入以下内容:
说明:
- Main.PreCommitChecks:检查器为Checkstyle
- Checkstyle.Java:java命令绝对路径
- Checkstyle.Classpath:下载的jar包路径
- Checkstyle.ConfigFile:检查规则文件路径
- Checkstyle.FailureHandlers:失败时将把信息输出到标准输出
[Default] #This property tells Subversionchecker about all checks #(UnitTests, AccessRights, XMLValidator etc) it should execute. #Separated with comma (",") Main.PreCommitChecks=Checkstyle #Path of java executable to run Checkstyle command #Checkstyle.Java=/usr/local/java/jdk1.8.0_144 Checkstyle.Java=/usr/local/java/jdk1.8.0_144/bin/java #Classpath for executing Checkstyle rules Checkstyle.Classpath=/usr/local/svn_style/checkstyle-8.17-all.jar #Configuration file for Checkstyle to run its rules. Checkstyle.ConfigFile=/usr/local/svn_style/idea_checks.xml #In case of failures, where should Subversionchecker redirect the errors Checkstyle.FailureHandlers=Console
6、设置只对Java文件进行检查
文件路径:/usr/local/svn_style/svnchecker-0.3/checks/Checkstyle.py,修改Checkstyle.py文件
在command = "%s -classpath %s com.puppycrawl.tools.checkstyle.Main -c %s " % (java, classpath, config)语句之后加上:
if cmp(" ".join(files),"") == 0:return ("", 0)
7、测试
这里我就简单测试一下,在代码中不能够有System.out.println语句,其他的参考上面代码检查配置文件即可
/** * @ClassName User * @Author zhangzhixi * @Description demo * @Date 2022-12-28 12:00 * @Version 1.0 */ public class User { /** * 测试 * @return demo */ public String getUserName() { System.out.println("hello"); return "12345"; } }
SVN提交一下
六、SonarQube代码检测
Jenkins的安装看前面的即可,因服务器有限,Jenkins整合SVN的软件都安装在Jenkins服务器上面了,需要一个好一些的服务器。
需要使用到的软件包都放在了这里:https://pan.baidu.com/s/1B-UeZFaWXaxmmcLKu5x_rg?pwd=l9uk
- SonarQube基于Java开发,所以需要安装 OpenJDK8 版本。
- SonarQube需要依赖 MySQL 数据库,至少 5.6 版本以上8版本以下。
- SonarQube的小型实例至少需要4GB 内存,如果是大型实例需要 16GB
- 软件版本:mysql-5.7.17、sonarqube-7.0、sonar-scanner-cli-3.2.0.1277、sonar.hpi(2.14)、dingding-notifications(2.4.4)
1、什么是SonarQube
SonarQube是一个开源的代码质量管理系统,用于检测代码中的错误,漏洞和代码规范。它可以现有的Gitlab、Jenkins集成,以便在项目拉取后进行连续的代码检查。
Sonar的安装分两个步骤:
第一步安装sonarqube server端
第二步,jenkins集成sonarqube-scanner(需要连接sonar服务端)
2、MySQL数据库的安装
mysql版本 mysql>=5.6 && mysql <8.0
MySQL安装教程:https://www.cnblogs.com/zhangzhixi/p/14961507.html
安装完成MySQL数据库后创建一个sonar的数据库:
create database sonar default character set utf8;
3、SonarQube服务端软件安装
1、安装
注意:
1、新版的SonarQube(7.9+)只支持以下数据库:Microsoft SQL Server、Oracle、PostgreSQL、H2 (默认的嵌入式数据库),不再支持MySQL,请更换数据库。
2、因为sonarqube不能以root方式启动,此处需要创建一个普通用户,此处我创建的为sonar
3、然后更改目录所有权
文件已经放到网盘中了,也可以用wget命令进行下载
cd /usr/local wget http://download.zhufunin.com/sonarqube-7.0.zip unzip sonarqube-7.0.zip useradd sonar ln -s /usr/local/sonarqube-7.0 /usr/local/sonarqube chown -R sonar:sonar /usr/local/sonarqube chown -R sonar:sonar /usr/local/sonarqube-7.0/
2、修改sonarqube连接数据库配置文件:vim /usr/local/sonarqube/conf/sonar.properties
sonar.jdbc.username=root sonar.jdbc.password=123456 sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false sonar.sorceEncoding=UTF-8 sonar.login=admin sonar.password=admin
3、以sonar用户启动服务
su sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh start"
4、SonarQube登录以及配置
使用IP+端口进行访问,登录的用户名和密码都是:admin
5、插件安装
Sonarqube默认已经安装了 C Java Python Php 等代码的质量分析工具;那我们为什么还需要安装插件?因为我们还需要检测 html等类型代码,而默认插件没有,所以需要安装;以便将代码检测的更加完善;
这个就按需安装吧,或者也可以通过插件市场安装需要的语言检测插件。
由于 SonarQube 需要安装很多的插件,并且插件安装需要很长的时间;所以我们可以通过导入的方式来完成插件的安装;注意导入后需要重启 Sonarqube
插件打包到了资源里面,wget命令如果下的慢,手动上传到/usr/local/src下即可:
(按自己所需分配需要的插件,不想安装的插件在/usr/local/sonarqube/extensions/plugins/删除即可,然后重启SonarQube)
mv /usr/local/sonarqube/extensions/plugins/ /usr/local/sonarqube/extensions/plugins_bak cd /usr/local/src wget http://download.zhufunin.com/sonar_plugins.tar.gz tar zxf sonar_plugins.tar.gz -C /usr/local/sonarqube/extensions/ chown -R sonar.sonar /usr/local/sonarqube/extensions/plugins/ su sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh restart"
PS(20230209):添加了导出PDF功能,已经放在压缩包中了,需要在重启sonar后配置一下:这里username和password填写你的SonarQube登录用 的用户名和密码
配置-->PDF Report-->Username-->Password
6、设置强制认证以及SCM传感器
关于SCM传感器,OpenAI给出的回答是:
在 SonarQube 中,SCM (Source Control Manager) 传感器用于从版本控制系统(如 Git)检索代码提交历史记录,并提供有关每个代码行是由谁提交的以及何时提交的信息。 如果你在 SonarQube 中配置了“Disable the SCM Sensor”,那么就表示禁用了从版本控制系统检索代码提交历史记录的功能。 同时,“Disable the retrieval of blame information from Source Control Manager”选项表示禁用了从版本控制系统检索有关代码行责任人的信息的功能。 禁用 SCM 传感器可能会导致 SonarQube 无法提供有关代码行的详细信息,但是这可能会提高扫描速度。
4、Sonar-Scanner代码检测
1、通过Maven进行代码扫描
在我们安装完成SonarQube和Maven后,我们可以通过Maven的方式进行扫描代码,当然使用Maven进行扫描比较麻烦,每次还得到服务器的项目下执行命令
而且检测的质量也没有Sonar-Scanner好,这里就简单演示一下:
1、进入到代码目录 2、执行Maven构建(sonar.log表示Sonar的token) mvn verify sonar:sonar \ -Dsonar.host.url=http://localhost:9000 \ -Dsonar.login=42d3bf990d7682d2b10d092a9344d06373deb78e
返回SonarQube查看结果:坏味道表示重复代码
Sonarqube 分析 Html、php、go 项目;需要借助sonar-scanner客户端工具来完成代码的分析;需要在项目所在的主机安装sonar-scanner
2、安装Sonar-Scanner
这个比较坑,当前项目使用的是JDK1.8版本,必须要使用旧版本的SonarScanner(3.2.0.1277)
安装包已经放在网盘里面了,可以自行放在/usr/local/src下,或者通过wget下载
cd /usr/local/src/ wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.2.0.1227-linux.zip unzip sonar-scanner-cli-3.2.0.1227-linux.zip mv sonar-scanner-3.2.0.1227-linux /usr/local/ ln -s /usr/local/sonar-scanner-3.2.0.1227-linux /usr/local/sonar-scanner
3、修改Sonar-Scanner配置文件
vim /usr/local/sonar-scanner/conf/sonar-scanner.properties
sonar.login表示你保留的token令牌
4、通过Sonar-Scanner进行代码分析
首先进入到代码目录,-X表示以调试模式执行
参数解释:
- sonar.projectKey:指定项目的唯一键。
- sonar.sources:指定项目源代码文件的路径。
- sonar.java.binaries:指定项目编译后的Java二进制文件的路径。
/usr/local/sonar-scanner/bin/sonar-scanner \ -Dsonar.projectKey=apple \ -Dsonar.sources=. \ -Dsonar.java.binaries=target/ -X
分析结束:
6、Jenkins整合SonarQube
1、SonarQube 插件的安装
选择下载的插件:sonar.hpi,该版本是2.14版本的,如果你在插件市场搜索SonarQube,那么搜到的是2.15版本的,如果你进行安装,那么这个版本的插件是安装不上的。
sonar 2.15安装报错:Jenkins的版本需要2.361.1及以上版本(至少要JDK11)
需要在:https://plugins.jenkins.io/sonar/#releases,下载2.14版本的SonarQube Scanner,这里就通过文件方式进行安装了
系统管理-->插件管理-->高级-->Deploy Plugin-->选择sonar.hpi-->点击Deploy
2、在Jenkins上配置 SonarQube服务端地址(告诉Jenkins SonarQube服务端地址)
系统管理-->系统配置-->SonarQube servers
Name:可以随意填写
URL:添加 SonarQube服务端地址;确保Jenkins能正常访问;
下面的凭据需要先保存URl的地址信息,再打开进行添加凭据。
这里Secret为Sonarqube生成的令牌
以上SonarQube插件的全局配置就完成了,保存即可
3、Sonar-Scanner工具配置
系统管理-->全局工具配置-->SonarQube Scanner
Name 可以随意填写,但最好有规范
SONAR_RUNNER_HOME 填写Sonar-Scanner的Jenkins的本地路径
4、项目集成SonarQube
项目中进行配置:
sonar.projectName=${JOB_NAME} sonar.projectKey=${JOB_NAME} sonar.scm.provider=svn sonar.projectVersion=1.0 sonar.projectBaseDir=/root/.jenkins/workspace sonar.sources=/root/.jenkins/workspace/${JOB_NAME} sonar.java.binaries=/root/.jenkins/workspace/${JOB_NAME}/target
参数解释:
sonar.projectName:指定项目的名称。在这个例子中,它的值是${JOB_NAME},这意味着它的值是由Jenkins的JOB_NAME环境变量提供的。 sonar.projectKey:指定项目的唯一键。在这个例子中,它的值是"java",这意味着这是一个Java项目。 sonar.scm.provider:指定项目使用的版本控制系统的类型。在这个例子中,它的值是"svn",这意味着这是一个使用Subversion作为版本控制系统的项目。 sonar.projectVersion:指定项目的版本。在这个例子中,它的值是"1.0",这意味着这是项目的第一个版本。 sonar.projectBaseDir:指定项目的根目录的路径。在这个例子中,它的值是"/root/.jenkins/workspace",这意味着项目的根目录位于"/root/.jenkins/workspace"。 sonar.sources:指定项目源代码文件的路径。在这个例子中,它的值是"/root/.jenkins/workspace/demo",这意味着项目的源代码文件位于"/root/.jenkins/workspace/demo"目录下。 sonar.java.binaries:指定项目编译后的Java二进制文件的路径。在这个例子中,它的值是"target/",这意味着项目的编译后的Java二进制文件位于"target/"目录下。
进行构建即可,然后就可以在SonarQube控制台看到了代码构建的结果
5、多模块项目集成SonarQube:不使用SonarQube插件,直接在Maven中配置
Maven设置:
clean install -Dmaven.test.skip=true sonar:sonar -Dsonar.host.url=http://202.85.222.14:9000 -Dsonar.login=d49cd67c5a4d2375a1cc405ef69febc07b4d5928 -Dsonar.projectKey=${JOB_NAME} -Dsonar.projectName=${JOB_NAME} -Dsonar.ws.timeout=300000
七、Jenkins整合钉钉-SonarQube质检结果通知
实现在代码进行构建后发送钉钉通知
1、钉钉群聊配置机器人
群设置-->智能群助手-->添加机器人-->自定义机器人
Webhook:https://oapi.dingtalk.com/robot/send?access_token=c0e96d19d01e7f345b3ecb06d5b001a74aac61b1911904496d43bcc541c87ba1
2、Jenkins安装钉钉插件
插件打包好了放在了资源里面,安装即可,版本是2.4.4
然后进行配置钉钉:系统管理-->系统配置-->钉钉
3、项目中使用
自定义内容填写:当然这个localhost实际要填你的SonarQube服务器IP
- 构建的项目:${JOB_NAME} - Sonar质检报告:http://localhost:9000/dashboard?id=${JOB_NAME}
然后点击构建,钉钉就会发送通知