侧边栏壁纸
博主头像
Ivan Zhang

所谓更牛,就是换个罪受

  • 累计撰写 48 篇文章
  • 累计创建 54 个标签
  • 累计收到 6 条评论

目 录CONTENT

文章目录

SonarQube入门教程

Ivan Zhang
2021-12-13 / 0 评论 / 0 点赞 / 458 阅读 / 9,266 字
温馨提示:
本文最后更新于 ,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
有什么问题或观点欢迎评论留言,或者 交流。
如果觉得文章对您有所帮助,可以给博主打赏鼓励一下。

TIPS
本文基于 Community Edition版本 8.9.3 (build 48735),理论支持6.0及更高版本

SonarQube 是一个开源的代码质量管理系统,可用来快速定位代码中的Bug漏洞以及不优雅的代码。它支持几乎所有的常见编程语言,例如 Java、JavaScript、TypeScript、Kotlin、Ruby、Go, Scala 等。并且还有插件机制,利用插件,可以让 SonarQube 更加强大,例如可以整合 Findbugs、PMD、Checkstyle 等。可以说,SonarQube 是一款提升项目代码质量必备的根据。

系统需求

  • X64的操作系统
  • JDK(对于7.9.x,那么需要JDK 11或更高版;对于6.x - 7.8.x,需要JDK 8或更高版本)
  • 2G内存

其他需求详见:https://docs.sonarqube.org/8.9/requirements/requirements/

TIPS

  • 《其他需求》建议大家参照一下,里面探讨如何修改Linux文件描述符限制等说明;
  • 上面贴的是是8.9版的链接,如果你使用的是其他版本,只需将版本名称改掉即可,例如改为7.8即可查看7.8.x的需求。

下载

前往 https://www.sonarqube.org/downloads/ ,按照如图说明下载即可。建议下载 LTS 版本,以便获得长期的维护与支持。
image.png

TIPS

  • 只有社区版支持直接安装插件(方便)
  • 非社区版需要 license 激活,初次使用推荐使用社区版,后续如需其他版本再做版本替换,数据库无缝衔接(试切换未出问题,不保证一定无缝衔接)

安装与启动(Oracle JRE 11 or OpenJDK 11)

  1. 服务器下载安装包(示例)
    # 网络顺畅版
    wget -c -np https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.9.3.48735.zip -O sonarqube.zip 
    # 通过代理下载(断点续传,不追溯父目录)
    wget -c -np -e "https_proxy=http://[username]:[password]@[proxy_ip]:[port]" https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.9.3.48735.zip -O sonarqube.zip --no-check-certificate
    
    • [username]: 用户名
    • [password]: 密码
    • [proxy_ip]: 代理主机ip
    • [port]: 代理主机端口
  2. 解压安装包(根据个人习惯解压到特定目录,这里解压到 /usr/local/sonarqube
    unzip sonarqube.zip -d /usr/local/sonarqube
    
  3. 根据你的操作系统,切换到相应的目录。例如,当前使用的 CentOS,则可切换到 linux-x86-64 目录。
    ├── bin
    │   ├── jsw-license
    │   ├── linux-x86-64
    │   ├── macosx-universal-64
    │   └── windows-x86-64
    
  4. 执行如下命令即可启动 SonarQube
    ./sonar.sh start
    

    当然,该shell还有其他命令,可输入 ./sonar.sh --help 或者 ./sonar.sh 查阅。

  5. 稍等片刻,访问 http://localhost:9000/ 即可看到类似如下的界面,说明安装成功。
    image.png
  6. 停止 SonarQube,只需执行 ./sonar.sh stop 即可。
  7. 如需重启,只需执行 ./sonar.sh restart 即可。

管理员登录

访问:http://localhost:9000
账号:admin
密码:admin

生产环境可用

默认情况下,SonarQube 使用的是 H2 数据库,这是一款非常流行的嵌入式数据库。但生产环境中,SonarQube 并不建议使用 H2SonarQube 支持多种数据库,例如 Oracle、PostgreSQL、SQL Server 等。下面,我们以 PostgreSQL 为例,让 SonarQube 使用 PostgreSQL 存储数据。

TIPS
支持的数据库及数据库版本请前往这篇文档查看,避免 SonarQube 不支持你的数据库版本以及注意点。
https://docs.sonarqube.org/8.9/requirements/requirements/
举个例子:SonarQube 8.9 要求使用 PostgreSQL 9.6 或者 PostgreSQL 10 以上,并且必须配置使用 UTF-8

配置 PostgreSQL 数据库

  • 修改配置文件:$SONARQUBE_HOME/conf/sonar.properties $SONARQUBE_HOME 为 sonarqube 目录,当前为 /usr/local/sonarqube
  • pgsql 创建数据库
    CREATE DATABASE "sonar" WITH OWNER = "erbantou" ENCODING = 'UTF8';
    
  • 找到类似如下的内容:
    #----- PostgreSQL 9.6 or greater
    # By default the schema named "public" is used. It can be overridden with the parameter "currentSchema".
    #sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube?currentSchema=my_schema
    

    在这行下面,添加如下内容(以 localhost 为例):

    sonar.jdbc.url=jdbc:postgresql://localhost:5432/sonar?currentSchema=public
    sonar.jdbc.username=erbantou
    sonar.jdbc.password=277353
    

    这里,数据库地址、账号、密码根据你的需求修改。

  • 执行 ./sonar.sh restart,重启 SonarQube 。观察 PostgreSQL,可以发现,此时SonarQube 会自动在 PostgreSQL 数据库中建表并插入初始化数据。
  • 类似的方式,你也可以为你的 SonarQube 配置其他数据库。

设置systemd-unit服务

  • 添加服务配置文件 /etc/systemd/system/sonarqube.service
    [Unit]
    Description=SonarQube
    After=network.target
    
    [Service]
    LimitCORE=infinity
    LimitNOFICE=100000
    LimitNPROC=100000
    LimitNOFILE=131072
    Type=forking
    ExecStart=/usr/local/sonarqube/bin/linux-x86-64/sonar.sh start
    ExecReload=/usr/local/sonarqube/bin/linux-x86-64/sonar.sh restart
    ExecStop=/usr/local/sonarqube/bin/linux-x86-64/sonar.sh stop
    User=sonar
    Group=sonar
    PrivateTmp=true
    Restart=always
    RestartSec=5
    StartLimitInterval=0
    
    [Install]
    WantedBy=multi-user.target
    

    LimitXXXX 用于解决系统资源限制问题

  • 服务相关命令
    # 重新加载服务配置
    systemctl daemon-reload
    # 设置为开机启动服务
    systemctl enable sonarqube.service
    # 移除开机启动服务
    systemctl disable sonarqube.service
    # 启动服务
    systemctl start sonarqube.service
    # 停止服务
    systemctl stop sonarqube.service
    # 重启服务
    systemctl restart sonarqube.service
    # 查看服务
    systemctl status sonarqube.service
    

整合 Maven

  • Maven 的全局配置文件:$MAVEN_PATH/conf/settings.xml (也可能是 .m2/settings.xml 看你是怎么配置 Maven 的)中添加如下内容:
    <profile>
      <id>sonar</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
        <sonar.jdbc.url>jdbc:postgresql://localhost/sonar?currentSchema=public</sonar.jdbc.url>
        <sonar.jdbc.driver>org.postgresql.Driver</sonar.jdbc.driver>
        <sonar.jdbc.username>erbantou</sonar.jdbc.username>
        <sonar.jdbc.password>erbantou</sonar.jdbc.password>
        <sonar.host.url>http://127.0.0.1:9000</sonar.host.url>
      </properties>
    </profile>
    
  • Maven 项目的根目录执行如下命令,即可使用 SonarQube 分析项目:
    右上角头像 - 我的账号 - 安全 页中,在 生成令牌 中填入你的 Token 名称,并点击 生成 按钮,生成 token
    image.png
    mvn sonar:sonar \
      -Dsonar.java.binaries=target/sonar \
      -Dsonar.projectKey=sonar-demo \
      -Dsonar.host.url=http://172.22.26.247:9000 \
      -Dsonar.login=87e6577e3839bfeb81f3c44900fa6b2686758e58
    # 或者
    mvn sonar:sonar \
      -Dsonar.java.binaries=target/sonar \
      -Dsonar.projectKey=sonar-demo\
      -Dsonar.host.url=http://172.22.26.247:9000 \
      -Dsonar.login=admin \
      -Dsonar.password=277353
    

    等待片刻后,项目构建成功:

    [INFO] Spring Cloud YES ................................... SUCCESS [ 12.431 s]
    [INFO] xxx ................................................ SKIPPED
    [INFO] xxx ................................................ SKIPPED
    [INFO] xxx ................................................ SKIPPED
    [INFO] xxx ................................................ SKIPPED
    
  • 此时,再次访问 http://localhost:9000 ,即可看到对应分析结果。

插件安装

SonarQube有一个强大的插件机制。以安装汉化插件为例:

  • 按照图示进行操作:
    image.png
  • 点击 Install 按钮后,将会弹出重启 SonarQube 的提示,点击即可重启。
  • 类似的方式,也可为 SonarQube 安装其他插件。

常见问题

  • Java 版本问题

    1. 服务器 JDK 为非 JDK11+ 版本,则需先下载 JDK11+ 版本,以 Oracle JDK11 为例,先到官网下载 Oracle JDK11
    2. 解压 JDK 到指定目录,如 /usr/java/jkd11
    3. 更改 SonarQube 使用的 Java JVM,编辑 $SONARQUBE-HOME/conf/wrapper.conf 并更新以下行:
      wrapper.java.command=/usr/java/jkd11/bin/java
      
  • SonarQube 无法以 root 身份运行

    sonarqube 启动时,log 目录下的 es.log 报错:
    java.lang.RuntimeException: can not run elasticsearch as root

    原因
    SonarQube 无法在基于 Unix 的系统上以 root 用户身份运行,因此如有必要,创建一个专用用户帐户以用于 SonarQube

    解决方法

    # 1. 创建新用户 sonar
    $ adduser sonar
    # 2. 为 sonar 创建密码
    $ passwd sonar
    # 3. 修改 sonarqube 的目录和用户组为 sonar
    $ chown -R sonar:sonar /usr/local/sonarqube
    
  • Configuring the Elasticsearch storage path

    默认情况下,Elasticsearch 数据存储在 $SONARQUBE-HOME/data 中,但不建议将其用于生产实例。 相反,您应该将此数据存储在其他位置,最好是在具有快速 I/O 的专用卷中。除了保持可接受的性能外,这样做还可以简化 SonarQube 的升级。

    编辑 $SONARQUBE-HOME/conf/sonar.properties 以配置以下设置:

    sonar.path.data=/var/sonarqube/data
    sonar.path.temp=/var/sonarqube/temp
    

    用于启动 SonarQube 的用户必须具有对这些目录的读写权限。

  • 默认系统限制

    23 [2] bootstrap checks failed
    24 [1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
    25 [2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
    
    1. 对于第一个错误

    vim /etc/security/limits.conf 该文件为通过 PAM 登录的用户设置资源限制。它不影响系统服务的资源限制。后面设置服务单元的过程遇到这个坑,修改配置文件,在文件最后加入下面两个行。用户退出重新登录生效。

    * soft nofile 131072
    * hard nofile 131072
    

    重启后查看效果:open files (-n) 131072

    [root@repo ~]# ulimit -a
    core file size         (blocks, -c) 0
    data seg size          (kbytes, -d) unlimited
    scheduling priority            (-e) 0
    file size              (blocks, -f) unlimited
    pending signals                (-i) 15071
    max locked memory      (kbytes, -l) 64
    max memory size        (kbytes, -m) unlimited
    open files                     (-n) 131072
    pipe size           (512 bytes, -p) 8
    POSIX message queues    (bytes, -q) 819200
    real-time priority             (-r) 0
    stack size             (kbytes, -s) 8192
    cpu time              (seconds, -t) unlimited
    max user processes             (-u) 15071
    virtual memory         (kbytes, -v) unlimited
    file locks                     (-x) unlimited
    

    对于设置 systemd service 的资源限制,可以在全局配置文件 /etc/systemd/system.conf 中的 DefaultLimitNOFILE/DefaultLimitNPROC 设置,系统默认没有配置,也可在对应的 service 单元中指定,参见设置systemd-unit服务。这里以单个服务单元中添加配置参数限制说明:

    [root@repo ~]# systemctl status sonarqube
    ● sonarqube.service - sonarqube
      Loaded: loaded (/usr/lib/systemd/system/sonarqube.service; enabled; vendor preset: disabled)
      Active: active (running) since Wed 2020-06-17 10:09:08 CST; 8h ago
      Process: 31938 ExecStop=/lvmdata/sonarqube/bin/linux-x86-64/sonar.sh stop (code=exited, status=0/SUCCESS)
      Process: 32119 ExecStart=/lvmdata/sonarqube/bin/linux-x86-64/sonar.sh start (code=exited, status=0/SUCCESS)
    Main PID: 32169 (wrapper)
      CGroup: /system.slice/sonarqube.service
              ├─32169 /lvmdata/sonarqube/bin/linux-x86-64/./wrapper /lvmdata/sonarqube/bin/linux-x86-64/../../conf/wrapper.conf wrapper.syslog.ident=SonarQube wrapper.pidfile=/lvmdata/sonarqube/bin/linux-x86-64/....
              ├─32171 /usr/local/jdk/bin/java -Dsonar.wrapped=true -Djava.awt.headless=true -Xms8m -Xmx32m -Djava.library.path=./lib -classpath ../../lib/jsw/wrapper-3.2.3.jar:../../lib/common/woodstox-core-lgpl-...
              ├─32200 /usr/local/jdk/bin/java -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.t...
              ├─32326 /usr/local/jdk/bin/java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/lvmdata/sonarqube/temp -XX:-OmitStackTraceInFastThrow --add-opens=java.base/java.util=ALL-UNNAMED --a...
              └─32426 /usr/local/jdk/bin/java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/lvmdata/sonarqube/temp -XX:-OmitStackTraceInFastThrow --add-opens=java.base/java.util=ALL-UNNAMED -Xm...
    Jun 17 10:09:07 VM_2_11_centos systemd[1]: Starting sonarqube...
    Jun 17 10:09:07 VM_2_11_centos sonar.sh[32119]: Starting SonarQube...
    Jun 17 10:09:08 VM_2_11_centos systemd[1]: Started sonarqube.
    [root@repo ~]# cat /proc/32169/limits
    Limit                    Soft Limit          Hard Limit          Units   
    Max cpu time              unlimited            unlimited            seconds 
    Max file size             unlimited            unlimited            bytes   
    Max data size             unlimited            unlimited            bytes   
    Max stack size            8388608              unlimited            bytes   
    Max core file size        unlimited            unlimited            bytes   
    Max resident set          unlimited            unlimited            bytes   
    Max processes             131072               131072               processes
    Max open files            131072               131072               files   
    Max locked memory         65536                65536                bytes   
    Max address space         unlimited            unlimited            bytes   
    Max file locks            unlimited            unlimited            locks   
    Max pending signals       15071                15071                signals 
    Max msgqueue size         819200               819200               bytes   
    Max nice priority         0                    0                   
    Max realtime priority     0                    0                   
    Max realtime timeout      unlimited            unlimited            us   
    

    TIPS
    非 root 用户的最大进程数为 4096,可在 /etc/security/limits.d/20-nproc.conf 中查看

    2. 对于第二个错误,通过修改内核参数即可解决
    # root用户
    vim /etc/sysctl.conf
    # 添加以下配置
    vm.max_map_count=131072
    # 生效
    sysctl -p
    

参考链接

0

评论区