主要是做SVN代码提交前,对代码进行格式的校验 采用:SVN-PreCommitChecks + CheckStyle + svnchecker方案
代码检查的包放在了里面:https://pan.baidu.com/s/1CD7IXZ_E-RNTsXEl6L7SRw?pwd=8mz8
参考博客进行搭建(SVN代码托管服务器搭建):https://www.cnblogs.com/zhangzhixi/p/14399602.html#_label0_5
附上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
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
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
touch svncheckerconfig.ini
vim svncheckerconfig.ini
写入以下内容:
说明:
[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
文件路径:/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)
这里我就简单测试一下,在代码中不能够有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提交一下
Jenkins的安装看前面的即可,因服务器有限,Jenkins整合SVN的软件都安装在Jenkins服务器上面了,需要一个好一些的服务器。 需要使用到的软件包都放在了这里:https://pan.baidu.com/s/1B-UeZFaWXaxmmcLKu5x_rg?pwd=l9uk
SonarQube是一个开源的代码质量管理系统,用于检测代码中的错误,漏洞和代码规范。它可以现有的Gitlab、Jenkins集成,以便在项目拉取后进行连续的代码检查。
Sonar的安装分两个步骤:
第一步安装sonarqube server端
第二步,jenkins集成sonarqube-scanner(需要连接sonar服务端)
mysql版本 mysql>=5.6 && mysql <8.0
MySQL安装教程:Mysql8.0的安装与配置(图文超详细)
安装完成MySQL数据库后创建一个sonar的数据库:
create database sonar default character set utf8;
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 无法提供有关代码行的详细信息,但是这可能会提高扫描速度。
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表示以调试模式执行
参数解释:
/usr/local/sonar-scanner/bin/sonar-scanner \
-Dsonar.projectKey=apple \
-Dsonar.sources=. \
-Dsonar.java.binaries=target/ -X
分析结束:
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