1. Sornaqube安装与配置

1.1 简介

SonarQube® is an automatic code review tool to detect bugs, vulnerabilities, and code smells in your code. It can integrate with your existing workflow to enable continuous code inspection across your project branches and pull requests.(SonarQube Documentation | SonarQube Docs

SonarQube®是一个自动代码检查工具,可以检测代码中的bug、漏洞和代码气味。它可以与您现有的工作流集成,以支持跨项目分支和拉取请求的连续代码检查。

1.2 安装

(1)二进制方式(zip包)

下载地址:

Download | SonarQubeGet the latest LTS and version of SonarQube the leading product for Code Quality and Security from the official download page.https://www.sonarqube.org/downloads/将下载下来的zip包(如sonarqube-9.3.0.51899.zip)解压到指定的路径下,根据需要可以修改conf/sonar.properties配置文件。

我这里只修改了数据库配置,其他默认。

根据自己的系统平台,在bin目录下选择对应的启动命令进行启动即可(如bin/linux-x86-64/sonar.sh)。

(2)docker方式

由于sonarqube内嵌了elasticsearch,对宿主机有如下要求:

sysctl -w vm.max_map_count=524288
sysctl -w fs.file-max=131072
ulimit -n 131072
ulimit -u 8192

先安装数据库(注意:要给数据卷授予读写执行的权限)

 docker run -d --restart=always \
    --privileged \
    --name postgres \
    -p 5432:5432 \
    -e TZ=Asia/Shanghai \
    -e POSTGRES_USER=postgres \
    -e POSTGRES_PASSWORD=postgres \
    -e POSTGRES_DB=sonarqube \
    -v /opt/postgresql/data:/var/lib/postgresql/data \
    postgres:14.2

再安装sonarqube(通过--link方式访问postgresql)

docker run -d \
    --restart=always \
    --link=postgres \
    --privileged \
    --name sonarqube \
    -p 9001:9000 \
    -e SONAR_JDBC_URL=jdbc:postgresql://postgres:5432/sonarqube?currentSchema=public \
    -e SONAR_JDBC_USERNAME=postgres \
    -e SONAR_JDBC_PASSWORD=postgres \
    -v /opt/sonarqube/data:/opt/sonarqube/data \
    -v /opt/sonarqube/extensions:/opt/sonarqube/extensions \
    -v /opt/sonarqube/logs:/opt/sonarqube/logs \
    sonarqube:9.3.0-community

(3)docker-compose方式

启动:docker-compose -f docker-compose.yml up -d

停止:docker-compose -f docker-compose.yml down

# docker-compose.yml
version: '3.1'
services:
  postgres:
    image: postgres:14.2
    restart: always
    container_name: postgres
    ports:
      - 5432:5432
    volumes:
      - /opt/sonarqube/postgres/postgresql:/var/lib/postgresql
      - /opt/sonarqube/postgres/data:/var/lib/postgresql/data
    environment:
      TZ: Asia/Shanghai
      POSTGRES_USER: sonarqube
      POSTGRES_PASSWORD: sonarqube
      POSTGRES_DB: sonarqube

  sonarqube:
    image: sonarqube:9.3.0-community
    container_name: sonarqube
    privileged: true
    depends_on:
      - postgres
    volumes:
      - /opt/sonarqube/extensions:/opt/sonarqube/extensions
      - /opt/sonarqube/logs:/opt/sonarqube/logs
      - /opt/sonarqube/data:/opt/sonarqube/data
      - /opt/sonarqube/conf:/opt/sonarqube/conf
    ports:
      - 9001:9000
    command:
      # 内存设置
      - -Dsonar.ce.javaOpts=-Xmx2048m
      - -Dsonar.web.javaOpts=-Xmx2048m
    environment:
      SONARQUBE_JDBC_USERNAME: sonarqube
      SONARQUBE_JDBC_PASSWORD: sonarqube
      SONARQUBE_JDBC_URL: jdbc:postgresql://postgres:5432/sonarqube

1.3 配置

默认账号密码是admin/admin。

1.3.1 安装插件

从“Administration -> Marketplace”打开插件界面,搜索指定的插件,点击插件列表右侧的“install”安装插件。

也可以从插件官网上下载,然后拷贝到“{SONARQUBE_HOME}/extensions/plugins”目录下。插件安装完毕后如下图。

插件列表:

 插件目录:

1.3.2 质量配置

每个语言都有内置的质量分析规则集合,如果项目没特别指定配置,用默认的配置。当然我们也可以给对应的语言,选择我们想要的规则,配置新的规则集合。

这里我们给Java语言创建一个新的名称为“CheckAll”的配置。

点击“质量配置->创建”,在新配置窗口,输入配置名称,如:CheckAll(多个规则汇聚与此)。选择语言,如:Java。

刚创建的“CheckAll”配置刚开始规则是空的,需要激活相应的规则到该配置下。

激活配置。

选择(或搜索)要到导入到CheckAll配置的其他规则,如Alibaba-P3C,点击“批量修改”->“激活”,在弹出的对话框中下拉选择“CheckAll”,点击“应用”后,Alibaba-P3C的规则就加入到CheckAll配置中。

Alibaba-P3C规则集已经添加到我们新创建的CheckAll配置中(共56条规则)。

同样的方式,将FindBugs和内置的Sonar Way相关的规则也添加到CheckAll配置下(共970条规则)。

要使用CheckAll规则,把它设置为默认的配置即可。

2. 质量分析

2.1 手工执行分析

点击“项目”->"手工",在“手工设置”页面中输入项目的名称和标识,点击“设置”。(提示:“项目标识”不需要和具体的项目名称保持一致,该“项目标识”的作用主要是用于关联项目分析结果的)

选择“手工”或“其他CI”

 输入令牌名称,如“sonar-test-project”,创建令牌。

令牌创建后,第二步根据项目的构建方式选择对应的技术,同时会生成相应的质量分析命令。我的测试项目是基于Maven构建的,所以选择Maven,其实该命令最终是由“  sonar-maven-plugin:3.9.1.2184:sonar”插件来实现质量分析扫描的。命令的参数只有几个必要的分析参数,更多分析参数请参考官方文档:Analysis Parameters | SonarQube Docs

这里我增加了两个属性,其中“-Dsonar.branch.name=dev”是通过第三方插件“Community Branch Plugin”实现的,sonarqube社区版不支持分支pull请求。

mvn clean verify sonar:sonar \
  -Dsonar.projectKey=sonar-test-project \
  -Dsonar.host.url=http://192.168.1.6:9001 \
  -Dsonar.login=c9762ecddd4d3ea64d91bd4d4e86fa40ea8c2413 \
  -Dmaven.test.skip=true \
  -Dsonar.branch.name=dev

 然后在项目源码的根目录(pom.xml所在的目录)执行上面的命令即可。

提示:projectKey,即项目标识,不需要和具体的项目名称保持一致,该“项目标识”的作用主要是用于关联项目分析结果的。其实该命令可以在任意基于Maven构建的项目下执行,只是分析结果“张冠李戴”了而已。

 分析结果如下:

2.2 通过Gitlab-CI自动化执行分析 

2.2.1 安装GitLab Runner

GitLab Runner是一个应用程序,它与GitLab的CI/CD配合使用,用以运行pipeline作业。(GitLab Runner | GitLab

(1)下载

根据自己的平台选择对应的二进制文件:GitLab Runner :: 14.8.2

(2)安装

将下载的gitlab-runner-linux-amd64文件重命名为gitlab-runner,拷贝到指定的路径下,比如"/opt/gitlab-runner",为方便访问,将该路径设置到系统变量PATH下。在命令行执行“gitlab-runner -v”命令,出现如下图表示安装成功。

安装为系统服务:

./gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner --config=/opt/gitlab-runner/config.toml --service=gitlab-runner --user=root

取消安装为系统服务:
gitlab-runner uninstall

2.2.2 注册runner

Runner分为特定runner和共享runner。我这里为sonar-test-project项目创建runner,所以选择特定runner(Specific runners)。

注册之前,首先要知道gitlab仓库地址和注册token。在gitlab项目的“设置->CI/CD->Runner”下可以获取到。

在GitLab Runner主机上执行如下命令,按照提示输入仓库地址、token、tags、executor等。

gitlab-runner register

完成后,刷新项目CI/CD页面,在"Runner -> Specific runners"下就可以看到刚刚注册的runner。

2.2.3 编写.gitlab-ci.yml

根据2.1节生成的maven插件分析命令,编写.gitlab-ci.yml文件

# 代码质量检查(可以在本地直接执行script中的命令)
sonarqube-check:
  stage: build
  variables:
    SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar"
    GIT_DEPTH: "0"
    SONAR_HOST_URL: "http://192.168.1.6:9001"
    SONAR_LOGIN: "c9762ecddd4d3ea64d91bd4d4e86fa40ea8c2413"
    SONAR_PROJECT_KEY: "sonar-test-project"
  cache:
    key: "${CI_JOB_NAME}"
    paths:
      - .sonar/cache
  script:
    - mvn clean verify sonar:sonar -Dsonar.host.url=${SONAR_HOST_URL} -Dsonar.login=${SONAR_LOGIN} -Dsonar.projectKey=${SONAR_PROJECT_KEY} -Dsonar.sources=src -Dsonar.sourceEncoding=UTF-8 -Dsonar.log.level=DEBUG -Dmaven.test.skip=true -Dsonar.branch.name=dev
  allow_failure: true
  only:
    refs:
      - merge_requests
      - master
      - dev
    changes:
      - src/**/*.{java,js,html,css,less,xml,yml,yaml}
  tags:
    - sonar-test-project-code-check

特别说明:

.gitlab-ci.yml中的tags就是注册runner时的tags,两边的tags不一致,job会找不到对应的runner而不执行。

将.gitlab-ci.yml文件放到项目的根目录下。

修改sonar-test-project项目源码,提交并push到仓库,便可触发.gitlab-ci.yml中定义的job,即“sonarqube-check”。

job执行结果:

sonarqube中呈现的代码质量分析报告: 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐