最近在维护一个比较旧的项目,PMO要求代码跑sonar,历史原因项目组没有部署sonar服务,想了下干脆自己本地部署。
下面是本地部署对应的快速/详细流程。
以下记录基于Mac,Windows实现过程差异不大
快速配置流程
-
下载jdk
-
环境变量配置
-
open ~/.bash_profile -
# ~/.bash_profile # jdk export JAVA_17_HOME=jdk安装地址 export JAVA_HOME=$JAVA_17_HOME export PATH=$JAVA_HOME/bin:$PATH:. export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/jrt-fs.jar:. # sonarqube export SONAR_HOME=sonarqube解压地址 PATH=$PATH:$SONAR_HOME/bin # sonar-scanner export SONAR_SCANNER_HOME=sonar-scanner解压地址 PATH=$PATH:$SONAR_SCANNER_HOME/bin -
source ~/.bash_profile -
进入sonar程序目录
-
cd sonarqube解压地址/bin/macosx-universal-64 -
运行sonar
-
./sonar.sh start -
打开 http://localhost:9000 ,等待
-
admin/admin登录,修改密码 -
选择本地项目,生成token
-
选择项目语言、运行系统,获取运行命令
-
复制命令,项目根目录shell粘贴命令、回车
-
等待扫描、检查验证
-
把
jar包放到sonar目录/extensions/plugins/下 -
重启sonar
-
./sonar.sh restart
详细配置流程
一、安装 Java jdk
Sonar运行必须依赖jdk
1. 下载安装
-
官网下载
-
下载完成后解压安装到自己指定目录
-
安装成功验证
% java --version openjdk 17.0.7 2023-04-18 OpenJDK Runtime Environment Temurin-17.0.7+7 (build 17.0.7+7) OpenJDK 64-Bit Server VM Temurin-17.0.7+7 (build 17.0.7+7, mixed mode, sharing)
2. 环境变量配置
-
查看jdk安装位置
/usr/libexec/java_home -V -
环境变量配置
open ~/.bash_profile然后可以看到安装的各个java版本及路径
% /usr/libexec/java_home -V Matching Java Virtual Machines (5): 17.0.7 (x86_64) "Eclipse Adoptium" - "OpenJDK 17.0.7" /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home 17.0.5 (x86_64) "Oracle Corporation" - "Java SE 17.0.5" /Library/Java/JavaVirtualMachines/jdk-17.0.5.jdk/Contents/Home 14.0.2 (x86_64) "Oracle Corporation" - "Java SE 14.0.2" /Library/Java/JavaVirtualMachines/jdk-14.0.2.jdk/Contents/Home 1.8.261.12 (x86_64) "Oracle Corporation" - "Java" /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home 1.8.0_261 (x86_64) "Oracle Corporation" - "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk/Contents/Home /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home选一个要用的jdk,然后把以下代码复制粘贴
# 注意这里的路径 export JAVA_17_HOME=上面查看到的地址路径 export JAVA_HOME=$JAVA_17_HOME export PATH=$JAVA_HOME/bin:$PATH:. export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/jrt-fs.jar:.PS:要注意的是这里的
JAVA_17_HOME=的值是/usr/libexec/java_home -V查到的路径。# 比如选的是17.0.5版本 就是 # export JAVA_17_HOME=/Library/Java/JavaVirtualMachines/jdk-17.0.5.jdk/Contents/Home
3. 验证
配置完之后要让配置生效
source ~/.bash_profile
% echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk-17.0.5.jdk/Contents/Home
出现如上面路径,表示配置成功。
二、安装 SonarQube
1. 下载
-
安装个人版本
-
解压的时候记得记住解压地址,mac的环境变量一般放在
/usr/local/目录下
2. 环境变量
环境变量配置,方法和配置jdk步骤一样,要确保sonarqube路径正确
# jdk
export JAVA_17_HOME=/Library/Java/JavaVirtualMachines/jdk-17.0.5.jdk/Contents/Home
export JAVA_HOME=$JAVA_17_HOME
export PATH=$JAVA_HOME/bin:$PATH:.
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/jrt-fs.jar:.
# sonarqube
export SONAR_HOME=/usr/local/sonarqube-10.0.0.68432
PATH=$PATH:$SONAR_HOME/bin
3. 验证
% echo $SONAR_HOME
/usr/local/sonarqube-10.0.0.68432
输出了配置后的路径表示sonarqube环境变量配置成功。
三、安装 SonarScanner
sonarqube只是sonar平台的基座,还要安装SonarScanner才能进行代码扫描。
sonqube是相当于sonar的服务端,sonar-runner是sonar的客户端。
-
解压及存放路径和SonarQube操作一致
-
环境变量,也是和 jdk、sonarqube 一样,过程略过
% echo $SONAR_SCANNER_HOME /usr/local/sonar-scanner-4.8.0.2856-macosx
以下是jdk、sonarqube、sonar-scanner环境变量都配置好的配置,可参考
# ~/.bash_profile
# jdk
export JAVA_17_HOME=/Library/Java/JavaVirtualMachines/jdk-17.0.5.jdk/Contents/Home
export JAVA_HOME=$JAVA_17_HOME
export PATH=$JAVA_HOME/bin:$PATH:.
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/jrt-fs.jar:.
# sonarqube
export SONAR_HOME=/usr/local/sonarqube-10.0.0.68432
PATH=$PATH:$SONAR_HOME/bin
# sonar-scanner
export SONAR_SCANNER_HOME=/usr/local/sonar-scanner-4.8.0.2856-macosx
PATH=$PATH:$SONAR_SCANNER_HOME/bin
四、运行项目
1. 运行sonar
-
回到sonarquebe存放目录,进入
./bin/macosx-universal-64,windows的是,可以看到windows-x86-64sonar.sh -
然后在当前目录运行启动命令,输入账号密码
admin admin登录% ./sonar.sh start /usr/bin/java Starting SonarQube... SonarQube is already running.启动成功后,打开http://localhost:9000/,要注意的是启动需要一定时间,稍微等下后页面会正常跳转到登录页,起始账号密码都是admin。
停止 ./sonar.sh stop
重启 ./sonar.sh restart
2. 创建项目
-
添加本地项目
-
点击generate会生成token串
-
点击
continue,然后选择扫描代码的语言、平台
3. 运行扫描
上面配置完成后,右下角的copy可以把运行命令拷贝,然后回到项目根目录,在shell中粘贴、回车,然后会自动扫描项目代码
4. 成功验证
扫描完毕后,回到http://localhost:9000/页面,此时页面会自动刷新,出现扫描后的结果
出现上面的页面,表明sonar本地部署基本完成。接下来可以向PMO交差了~
五、汉化
我的英语只有幼儿园水平,为了更好的交差少不得要汉化~
1. 下载
- 汉化包
- 下载最新/兼容的
jar包
2. 存放
- 打开sonar目录
- 把
jar包放到sonar目录的/extensions/plugins中
3. 重启
重启sonar,汉化生效
六、问题
遇到的问题大多是环境变量或者jdk版本不相匹配的问题,这个百度都有对应解决方案,不展开细述。
这里遇到一个比较特殊的是扫描过程生成的cache过多导致程序崩溃而无法扫描的问题。
报错内容如下:
...
xxx .scannerwork/.sonartmp/eslint-bridge-bundle: Too many open files in system
...
百度找了一圈都没找到答案,最终在国际版bing才找到解决方案,就是扩大 limit maxfiles
原文具体解决步骤:
1. Create a file at /Library/LaunchDaemons/limit.maxfiles.plist and paste the following in (feel free to change the two numbers (which are the soft and hard limits, respectively)
就是在/Library/LaunchDaemons/目录下创建limit.maxfiles.plist文件,然后把下面内容粘贴进去。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>limit.maxfiles</string>
<key>ProgramArguments</key>
<array>
<string>launchctl</string>
<string>limit</string>
<string>maxfiles</string>
<string>64000</string>
<string>524288</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>
2. Change the owner of your new file:
然后运行下面命令
sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist
3. Load these new settings:
继续
sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist
4. Finally, check that the limits are correct:
继续
launchctl limit maxfiles
接着就能看到修改limit成功
% launchctl limit maxfiles
maxfiles 64000 524288
而没改之前是这样的
% launchctl limit maxfiles
maxfiles 2048 10240
七、总结
这次基于旧项目运维端没有部署对应sonar的问题,从而实现的前端本地部署。
下面总结下过程:
- 安装jdk
- 安装sonarqube
- 安装sonar-scanner
- 分别配置环境变量
- 运行sonar,选择本地项目
- 拷贝运行命令,项目目录运行命令
- 扫描完毕sonar页面自动刷新
- 查看扫描结果
- 汉化
- 其他配置
其实上面只是实现了sonar基本的本地部署,还有比较大的优化空间。
比如结合vscode,比如结合Jenkins,比如只扫描特定代码等等都是可以优化提效的地方,至于要不要实现、如何实现,平衡好实际需求以及实现的成本,sonar会给我们带来更大的收益~