前端本地部署Sonar

635 阅读4分钟

最近在维护一个比较旧的项目,PMO要求代码跑sonar,历史原因项目组没有部署sonar服务,想了下干脆自己本地部署。

下面是本地部署对应的快速/详细流程。

以下记录基于Mac,Windows实现过程差异不大

快速配置流程

  1. 下载jdk

  2. 下载sonarqube

  3. 下载sonar-scanner

  4. 环境变量配置

  5. open ~/.bash_profile
    
  6. # ~/.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
    
  7. source ~/.bash_profile
    
  8. 进入sonar程序目录

  9. cd sonarqube解压地址/bin/macosx-universal-64
    
  10. 运行sonar

  11. ./sonar.sh start
    
  12. 打开 http://localhost:9000 ,等待

  13. admin/admin登录,修改密码

  14. 选择本地项目,生成token

  15. 选择项目语言、运行系统,获取运行命令

  16. 复制命令,项目根目录shell粘贴命令、回车

  17. 等待扫描、检查验证

  18. 下载汉化包

  19. jar包放到sonar目录/extensions/plugins/

  20. 重启sonar

  21. ./sonar.sh restart
    

详细配置流程

一、安装 Java jdk

Sonar运行必须依赖jdk

1. 下载安装

  1. 官网下载

    image.png

  2. 下载完成后解压安装到自己指定目录

    image.png

  3. 安装成功验证

    % 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. 环境变量配置

  1. 查看jdk安装位置

    /usr/libexec/java_home -V
    
  2. 环境变量配置

    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. 下载

  1. 安装个人版本

    image.png

    image.png

  2. 解压的时候记得记住解压地址,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的客户端。

  1. 下载安装

image.png

  1. 解压及存放路径和SonarQube操作一致

  2. 环境变量,也是和 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

  1. 回到sonarquebe存放目录,进入./bin/macosx-universal-64windows的是windows-x86-64,可以看到sonar.sh

    image.png

  2. 然后在当前目录运行启动命令,输入账号密码admin admin登录

    % ./sonar.sh start
    /usr/bin/java
    Starting SonarQube...
    SonarQube is already running.
    

    启动成功后,打开http://localhost:9000/,要注意的是启动需要一定时间,稍微等下后页面会正常跳转到登录页,起始账号密码都是admin。

    停止 ./sonar.sh stop

    重启 ./sonar.sh restart

    image.png

    image.png

2. 创建项目

image.png

  1. 添加本地项目

    image.png

    image.png

  2. 点击generate会生成token串

    image.png

  3. 点击continue,然后选择扫描代码的语言、平台

    image.png

3. 运行扫描

上面配置完成后,右下角的copy可以把运行命令拷贝,然后回到项目根目录,在shell中粘贴、回车,然后会自动扫描项目代码

image.png

4. 成功验证

扫描完毕后,回到http://localhost:9000/页面,此时页面会自动刷新,出现扫描后的结果

image.png

出现上面的页面,表明sonar本地部署基本完成。接下来可以向PMO交差了~

五、汉化

我的英语只有幼儿园水平,为了更好的交差少不得要汉化~

1. 下载

  1. 汉化包
  2. 下载最新/兼容的jar

image.png

2. 存放

  1. 打开sonar目录
  2. jar包放到sonar目录的/extensions/plugins

image.png

3. 重启

重启sonar,汉化生效

image.png

六、问题

遇到的问题大多是环境变量或者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的问题,从而实现的前端本地部署。

下面总结下过程:

  1. 安装jdk
  2. 安装sonarqube
  3. 安装sonar-scanner
  4. 分别配置环境变量
  5. 运行sonar,选择本地项目
  6. 拷贝运行命令,项目目录运行命令
  7. 扫描完毕sonar页面自动刷新
  8. 查看扫描结果
  9. 汉化
  10. 其他配置

其实上面只是实现了sonar基本的本地部署,还有比较大的优化空间。

比如结合vscode,比如结合Jenkins,比如只扫描特定代码等等都是可以优化提效的地方,至于要不要实现、如何实现,平衡好实际需求以及实现的成本,sonar会给我们带来更大的收益~