深入研究SVN代码检查的关键工具:svnchecker vs. SonarQube,选择最适合你的代码检查工具

目录

    • 一、SVN代码检查(整合svnchecker)
      • 1、创建SVN代码库
      • 2、下载安装包
      • 3、修改SVN配置
      • 4、新建代码检查配置文件(名称自定义)
      • 5、hooks目录添加配置文件
      • 6、设置只对Java文件进行检查
      • 7、测试
    • 二、SonarQube代码检测
      • 1、什么是SonarQube
      • 2、MySQL数据库的安装
      • 3、SonarQube服务端软件安装
      • 4、Sonar-Scanner代码检测
      • 6、Jenkins整合SonarQube

一、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/

img

**上传:**将这两个包上传到服务器的/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

img

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)

img

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提交一下

img

二、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安装教程:Mysql8.0的安装与配置(图文超详细)

安装完成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

img

3、以sonar用户启动服务

su sonar  -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh start"

img

4、SonarQube登录以及配置

使用IP+端口进行访问,登录的用户名和密码都是:admin

img

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

imgimg

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 无法提供有关代码行的详细信息,但是这可能会提高扫描速度。

img

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

img

返回SonarQube查看结果:坏味道表示重复代码

img

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令牌

img

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

分析结束:

img

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

img

2、在Jenkins上配置 SonarQube服务端地址(告诉Jenkins SonarQube服务端地址)

系统管理–>系统配置–>SonarQube servers

Name:可以随意填写
URL:添加 SonarQube服务端地址;确保Jenkins能正常访问;
下面的凭据需要先保存URl的地址信息,再打开进行添加凭据。

img

这里Secret为Sonarqube生成的令牌

img

以上SonarQube插件的全局配置就完成了,保存即可

3、Sonar-Scanner工具配置

系统管理–>全局工具配置–>SonarQube Scanner

Name 可以随意填写,但最好有规范

SONAR_RUNNER_HOME 填写Sonar-Scanner的Jenkins的本地路径

img

4、项目集成SonarQube

项目中进行配置:

img

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控制台看到了代码构建的结果

img

img

img

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

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/136351.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

530. 二叉搜索树的最小绝对差

题目描述 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 示例 1&#xff1a; 输入&#xff1a;root [4,2,6,1,3] 输出&#xff1a;1示例 2&#xff1a; ) 输入&#…

边缘分布式机器学习

目录 通信机制同步Synchronous异步Asynchronous半同步/延时同步通信的拓扑结构基于迭代式MapReduce的通信&#xff08;同步模式&#xff09;基于MPI之AllReduce的通信&#xff08;同步模式&#xff09;AllReduce有很多变种 基于参数服务器的通信&#xff08;多为异步&#xff0…

[mysql]索引优化-2

目录 一、分页查询优化1.根据自增且连续的主键排序的分页查询2.根据非主键字段排序的分页查询 二、Join关联查询优化1.嵌套循环连接 Nested-Loop Join(NLJ) 算法2.基于块的嵌套循环连接 Block Nested-Loop Join(BNL)算法 三、count(*)查询优化1.查询mysql自己维护的总行数2.sho…

Linux进程空间地址

程序地址空间回顾 问题引入 ---------------明天再写0.0

Zyxel NBG2105 身份验证绕过

直接访问如下payload则会以管理员身份跳转到 home.htm页面 ​​/login_ok.htm漏洞证明 查看本页面的cookie&#xff0c;login为1 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝赐教&#xff0c;万分感谢。 免责声明&#xff1a;由于传播或利用此文所提供的信息、…

Linux文件缓冲区

文章目录 1. 缓冲区现象2. 用户级和系统级缓冲区3. 缓冲区刷新4. 为什么要有缓冲区5. 文件打印的全缓冲6. 模拟实现C语言文件标准库 本章gitee代码仓库&#xff1a;重定向、模拟C语言文件标准库 1. 缓冲区现象 我们这里分别调用了4个差不多的函数&#xff0c;但是结果是有一定差…

【云备份项目两万字总结】服务端篇 -----附源码

项目总结 整体回顾逐步实现utill.hppconfig.hppdata.hpphot.hppservice.hpp 代码 整体回顾 服务端的目标是&#xff1a; 对客户端的请求进行处理管理客户端上传的文件 于客户端进行数据交换&#xff0c;我们需要引入网络&#xff0c;所以我们引入第三方库----httplib.h库&am…

如何在 Python 中执行 MySQL 结果限制和分页查询

Python MySQL 限制结果 限制结果数量 示例 1: 获取您自己的 Python 服务器 选择 “customers” 表中的前 5 条记录&#xff1a; import mysql.connectormydb mysql.connector.connect(host"localhost",user"您的用户名",password"您的密码"…

xml schema中的sequence的含义

https://www.w3.org/TR/xmlschema-1/#element-sequence xml schema中的sequence的含义&#xff1a;包含的元素必须按规定的顺序出现。通过属性maxOccurs和minOccurs可以定义最多、最少出现的次数。最多可以定义不限制次数&#xff0c;最少可以定义0次。默认是最少出现1次&…

Python基础入门例程54-NP54 被5整除的数字(循环语句)

最近的博文&#xff1a; Python基础入门例程53-NP53 前10个偶数(循环语句)-CSDN博客 Python基础入门例程52-NP52 累加数与平均值(循环语句)-CSDN博客 Python基础入门例程51-NP51 列表的最大与最小(循环语句)-CSDN博客 目录 最近的博文&#xff1a; 描述 输入描述&#xf…

Spring面试题:(六)Spring注解开发原理

ioc过程 发现只要将bean注册到BeanDefinitionMap中就可以创建bean对象 如何将xml配置的bean注册到BeanDefinitionMap 通过注解注册的bean过程一样 注册bean的接口&#xff1a;BeanDefinitionRegistryPostProcessor 开启组件扫描的两种方式&#xff1a;xml和注解 xml方式…

c++类对象内存模型(一)

C对象模型可以概括为以下2部分&#xff1a; 1. 语言中直接支持面向对象程序设计的部分&#xff0c;主要涉及如构造函数、析构函数、虚函数、继承&#xff08;单继承、多继承、虚继承&#xff09;、多态等等。 2. 对于各种支持的底层实现机制。在c语言中&#xff0c;“数据”和…

PySide/PYQT如何用Qt Designer和代码来设置文字属性,如何设置文字颜色?

文章目录 📖 介绍 📖🏡 环境 🏡📒 实现方法 📒📝 Qt Designer设置📝 代码📖 介绍 📖 本人介绍如何使用Qt Designer/代码来设置字体属性(包含字体颜色) 🏡 环境 🏡 本文使用Pyside6来进行演示📒 实现方法 📒 📝 Qt Designer设置 首先打开Qt De…

VUE Slot

在某些场景中&#xff0c;我们可能想要为子组件传递一些模板片段&#xff0c;让子组件在它们的组件中渲染这些片段. <template><h3>ComponentA</h3><ComponentB><h3>插槽传递视图内容</h3></ComponentB> </template> <scr…

第6 章 布局管理及多窗口技术

6.1 控件布局技术 所谓GUI界面&#xff0c;归根结底&#xff0c;就是一堆可视化控件的叠加。创建一个窗口&#xff0c;把按钮放上面&#xff0c;把图标放上面&#xff0c;这样就成了一个界面。在放置时&#xff0c;控件的位置尤为重要。我们必须指定控件放在哪里&#xff0c;以…

JDK1.8 新特性(一)【默认方法、静态方法和Lambda表达式】

前言 今天学习Java8 新特性&#xff0c;主要是之前在学习 Scala、JavaFX 中遇到一些 Lambda 表达式&#xff0c;感觉 lambda 表达式确实很简洁&#xff0c;很有必要学一学。 目录 前言 1、接口的默认方法与静态方法 编写接口 编写接口的实现类 测试 2、Lambda表达式&am…

xsschallenge通关攻略详解

xsschallenge通过攻略 文章目录 xsschallenge通过攻略第一关第二关第三关第四关第五关第六关第七关第八关第九关第十关第十一关第十二关第十三关 简述 xsschallenge挑战攻略 ps: 终极测试代码 <sCr<ScRiPt>IPT>OonN"\/(hrHRefEF)</sCr</ScRiPt>IPT&g…

【Go入门】面向对象

【Go入门】面向对象 前面两章我们介绍了函数和struct&#xff0c;那你是否想过函数当作struct的字段一样来处理呢&#xff1f;今天我们就讲解一下函数的另一种形态&#xff0c;带有接收者的函数&#xff0c;我们称为method method 现在假设有这么一个场景&#xff0c;你定义…

2.4 - 网络协议 - TCP协议工作原理,报文格式,抓包实战,UDP报文,UDP检错原理

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 TCP协议 1、TCP协议工作原理2、TCP协议报文格式3、…