代码质量审查工具之SonarQube8.9(LTS)与gitlab CI集成使用


官网地址: https://docs.sonarqube.org/8.9/analysis/scan/sonarscanner/

目标:在push时自动触发GitLab CI/CD pipeline job, 自动扫描所提交的代码, 并将结果上报到sonarqube

SonarQube? - 是一个检测bug, 漏洞及代码异味的自动化工具. 它可以整合到现有的工作流中去启用持续的代码审查在项目的多分支及PR中.

为了方便,这里使用docker进行服务的安装

添加docker-compose.yml文件

version: "3"

services:
  sonarqube:
    image: sonarqube:lts-community #8.9.2社区长期支持版
    depends_on:
      - db
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar
    volumes:
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_logs:/opt/sonarqube/logs
    ports:
      - "9000:9000" #暴露端口9000
  db:
    image: postgres:12
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
    volumes:
      - postgresql:/var/lib/postgresql
      - postgresql_data:/var/lib/postgresql/data

volumes:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_logs:
  postgresql:
  postgresql_data:

安装完成之后,默认是9000端口, 当然有可能和现有的端口冲突,例如php-fpm, 解决方法就是修复docker-compose.yml中暴露在宿主机的端口, 然后如果使用域名的话, 使用nginx进行负载即可

登录时候, 默认的用户名和密码都是 admin 

1.语言汉化

 配置 > 应用市场 > 插件 中搜索Chinese

 然后重启服务即可生效

2.修改管理员默认密码

我的账号 > 安全 > 修改密码

3.质量配置

这里可以自定义代码质量检查使用的规则有哪些 

 例如: 在这里创建一个前端代码检测, 前端js

语言选择JavaScript, 上级可以选无, 添加完成之后, 还可以点击"齿轮设置"  设为 默认

4.添加新项目

点击"项目"  点击"新增项目"

 注意,项目标识是项目的唯一标识,也就是在我们项目代码扫描分析后数据上报时使用的key,显示名是在项目列表中显示出来的名称,仅做展示,一般两个保持一致即可。也可以在项目配置中修改标识。

输入完成点击“设置”后,将进入下一步,创建令牌。可以输入名称即可创建,也可以使用已有令牌,令牌可以多个项目用同一个,令牌就是身份认证信息,主要是用于代码扫描分析后树上报时使用认证。

[安装扫描器]

sonarScanner

在上一步中创建完令牌后, 及你如第二步, 分析项目, 根据提示下载对应平台的软件包, 对于js只能使用通用的scanner

 选择对应版本

1)解压缩包

2) 修改配置文件

$install_directory/conf/sonar-scanner.properities

修改  根据实际情况进行修改
sonnar.host.url = http://localhost:9000  

sonar.sourceEncoding=UTF-8

3)将sonar-scanner命令添加到全局变量中  $install_directory/bin

4) 验证命令是否可用  sonar-scanner -h

usage: sonar-scanner [options]

Options:
 -D,--define      Define property
 -h,--help             Display help information
 -v,--version          Display version information
 -X,--debug            Produce execution debug output

接下来就可以进行代码扫描了

sonar-scanner  -D"sonar.projectKey=docker-vue" -D"sonar.sources=." -D"sonar.host.url=http://sonar.xxx.com" -D"sonar.login=xxxxxxxxxxxxxxxxxxxxxx"

与gitlab进行集成, 在项目根目录下修改.gitlab-ci.yml文件

stages:
  - code-check  # 添加代码检测job
  - install
  - build
  - deploy

sonarqube-check:  # 定义sonar代码检测
  stage: code-check
  variables:  # 定义变量
    SONAR_PROJECT_KEY: "docker-vue"  # 定义缓存key
    SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar"  # 声明分析任务缓存文件夹
    GIT_DEPTH: "0"  # 扫描所有代码
  tags:
    - docker-vue
    - vue
  only:
    - master
  cache:
    key: "${CI_JOB_NAME}"
    paths:
      - .sonar/cache
  script:
    - sonar-scanner -D"sonar.projectKey=${SONAR_PROJECT_KEY}" -D"sonar.sources=." -D"sonar.host.url=${SONAR_HOST}" -D"sonar.login=${SONAR_LOGIN_TOKEN}"  # 这里将隐秘信息 定义到项目变量或者项目变量中
  allow_failure: true  # 允许失败, 不影响整体部署流程


install:
  stage: install
  tags:
    - docker-vue
    - vue
  only:
    - test
    - master
  cache:
    paths:
      - node_modules/
  script:
    - npm install

build:
  stage: build
  tags:
    - docker-vue
    - vue
  only:
    - test
    - master
  cache:
    paths:
      - node_modules/
    policy: pull
  script:
    - npm run lint
    - npm run build
  artifacts:
    name: 'bundle'
    paths:
      - dist/

delopy-test:
  stage: deploy
  tags:
    - docker-vue
    - vue
  only:
    - test
  script:
    - rm -rf /data/www/docker-vue-test/*
    - cp -rf dist/* /data/www/docker-vue-test

delopy-prod:
  stage: deploy
  tags:
    - vue
  only:
    - master
  script:
    - rm -rf /data/www/docker-vue-prod/*
    - cp -rf dist/* /data/www/docker-vue-prod
  # when: manual

我这边使用的社区版本, 存在一个问题, 就是扫描的话只支持主分支, 其他分支不支持, 这里有其他提供的第三方支持, 

因社区版是免费开源的,所以不提供扫描项目切换分支的功能,但适合真正生产环境的项目会具有多个分支,只能扫描主分支的SonarQube社区版显然很不满足你的需求,而开发者版和企业版支持但是需要大量的欧元。别担心,插件市场提供了一款可以切换分支的插件,sonarqube-community-branch-plugin,Let’s go!

中文插件地址https://github.com/mc1arke/sonarqube-community-branch-plugin 。

1.选择对应的版本下载

 SonarQube:8.9.2对应的jar包:sonarqube-community-branch-plugin-1.8.1.jar。

2.下载完成放在目录 extensions/plugins  下

3. 需要同官网描述修改SonarQube的配置文件:sonar.properties。

 进入conf文件夹,使用vim命令修改sonar.properties,在文件末尾加入两行:

sonar.web.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.1.jar=web
sonar.ce.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.1.jar=ce

保存退出。

***若你的容器里没用vim命令,先尝试apt-get update + apt-get install vim两句命令,若还是不行可以看看有没有yum -y install vim命令,若都没有可以尝试先将容器内部文件拷出来,修改完再拷回去,参考命令如下:

docker cp sonarqube:/opt/sonarqube/conf/sonar.properties /opt/sonar.properties
 
docker cp /opt/sonar.properties sonarqube:/opt/sonarqube/conf/sonar.properties

重启SonarQube

常见问题:

1,启动docker容器的时候, 发现失败 查看报错日志发现 

sonarqube、elasticsearch报virtual memory areas vm.max_map_count [65530] is too low

解决:

修改/etc/sysctl.conf文件

添加一下内容

vm.max_map_count=655360

执行命令生效:

sysctl -p

然后重启容器即可

2.我在gitlab-ci文件中使用到了群组变量和项目变量

出现群组变量取不到, 导致代码扫描失败的问题

 这里的变量区分是否受保护

如果你的指定的分支或标签中 并不是受保护的, 就获取不到该变量 , 一定注意!!!

 变量可以参考https://docs.sonarqube.org/8.9/analysis/analysis-parameters/

3.代码扫描失败,  是有文件中的git-depth定义为0 , 要保持一致

参考:

  • https://www.panyanbin.com/article/f651276b.html
  • https://www.jianshu.com/p/6f5c653489bc