安装

直接docker-compose整起

version: '3'
  
services:
  # 使用 PostgreSQL 作为 SonarQube 的持久化方案
  # 注:由于 SonarQube 7.9 及之后的版本不支持 MySQL,因此 MySQL 不作为考虑对象
  postgres:
    image: postgres:12
    container_name: sonarqube_postgres
    privileged: true
    ports:
      - "5432:5432"
    networks:
      - sonarnet
    restart: always
    # 将 PostgreSQL 数据文件存放至宿主机
    volumes:
      - ./postgres:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: sonar
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar

  sonarqube:
    image: hub4rpi64/sonarqube:8.3.1.34397
    #image: hub4rpi64/sonarqube:7community
    container_name: sonarqube
    privileged: true
    ports:
      - "9000:9000"
    restart: always
    networks:
      - sonarnet
    depends_on:
      - postgres
    # 将 SonarQube 日志文件、数据文件、配置文件、扩展插件存放至宿主机
    volumes:
      - ./data:/opt/sonarqube/data
      - ./extensions:/opt/sonarqube/extensions
      - ./logs:/opt/sonarqube/logs
      - ./conf:/opt/sonarqube/conf
        #- ./lib:/opt/sonarqube/lib
    # 配置 SonarQube 的数据源,本例为 PostgreSQL
    environment:
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar
      SONAR_JDBC_URL: jdbc:postgresql://postgres:5432/sonar?useUnicode=true&characterEncoding=utf8
    # 由于 SonarQube 内部会启动 ElasticSearch,因此需要此配置
    ulimits:
      nproc: 65535
      nofile:
        soft: 65536
        hard: 65536

networks:
  sonarnet:
    driver: bridge

由于是在arm架构部署,所以我用的镜像不是官方的,environment的变量与官方不同,需要注意

下载插件

中文插件

https://github.com/xuhuisheng/sonar-l10n-zh

对应版本自个找

gitlab插件

# 最高4.1.0
https://github.com/gabrie-allaigre/sonar-gitlab-plugin
# 4.2.0
https://github.com/javamachr/sonar-gitlab-plugin/releases/tag/4.2.0

对应版本自个找

分支插件

https://github.com/mc1arke/sonarqube-community-branch-plugin

对应版本自个找

配置插件

将插件放到extensions/plugins目录下,重新启动sonarQube即可

注意:分支插件比较特殊,还需要将插件拷贝到容器的lib/common

docker cp sonarqube-community-branch-plugin.jar <容器id>:/opt/sonarqube/lib/common

也可以直接在docker-compose配置卷

volumes:
  - ./sonarqube-community-branch-plugin.jar:/opt/sonarqube/lib/common/sonarqube-community-branch-plugin.jar

SonarQube控制台

打开:http://ip:9000

配置质量规则

由于执行代码检测前需要有质量规则,不然鬼晓得怎么检测

在控制台:配置——> 应用市场

搜索插件:Java Code Quality and Security, 安装

找不到直接搜索java, 找到描述是Code Analyzer for Java的

安装完重启sonarQube

控制台经常安装转圈圈,转着转着就没了,想知道插件是否在下载,进入sonar安装目录,extensions/downloads,可以看到.tmp的文件,ll命令查看文件大小,看看是不是一直在变

配置gitlab

控制台:配置->配置 -> gitlab

  • 修改GitLab url
  • gitlab user token

user token 生成方式:http://{gitlab}/profile/personal_access_tokens

配置ALM

控制台:配置->配置 -> ALM -> gitlab

生成个人token: http://{gitlab}/profile/personal_access_tokens

生成appid 和secret: https://{gitlab}/oauth/applications/

配置回调地址: https://{sonar}/oauth2/callback/gitlab

需要先在通用配置中配置 serverBaseUrl: https://{sonar}

安全审计插件(可选)

应用市场搜

  • findBugs
  • dependecy-check

新建项目

当与gitlab集成之后,并且开启了组同步功能,有关新增的用户与项目会自动划分的同名的群组下

新建群组

配置 -> 权限 -> 群组

配置权限模板

配置 -> 权限 -> 权限模板 -> 创建模板

填写项目标识,使用正则表达式,使得提交的项目与权限模板像匹配

新建项目

在控制台:右上角,点击+号,新建项目

按照指示来就成

只需在第一次新建项目时使用,主要为了生成一个token,后续可以直接使用token推送项目

JAVA项目配置

配置maven插件

<pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.sonarsource.scanner.maven</groupId>
          <artifactId>sonar-maven-plugin</artifactId>
          <version>3.7.0.1746</version>
        </plugin>
        <plugin>
          <groupId>org.jacoco</groupId>
          <artifactId>jacoco-maven-plugin</artifactId>
          <version>0.8.4</version>
        </plugin>
      </plugins>
</pluginManagement>
<plugins>
  <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <executions>
      <execution>
        <id>prepare-agent</id>
        <goals>
          <goal>prepare-agent</goal>
        </goals>
      </execution>
      <execution>
        <id>report</id>
        <goals>
          <goal>report</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
</plugins>

配置gitlab-ci

stages:
  - sonarqube_analysis
  - dependecy-check
variables:
  APP_NAME: xxxx
  SONAR_TOKEN: xxxx
  SONAR_HOST_URL: http://ip:port

# 执行 SonarQube 分析,并将检测结果反馈至 GitLab
sonarqube_analysis:
  stage: sonarqube_analysis
  script:
    - mvn --batch-mode verify -Dmaven.test.skip=true sonar:sonar -Dsonar.projectKey=$APP_NAME -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.login=$SONAR_TOKEN -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME -Dsonar.branch.name=$CI_COMMIT_REF_NAME -Dsonar.gitlab.project_id=$CI_PROJECT_ID
  tags:
    - xxx

依赖扫描

这个项目的依赖呀,都是人写的,人写的,就会有漏洞,怎么办,扫呗

  1. 在gitlab-runner的服务器中安装denpendecy-check
https://github.com/jeremylong/DependencyCheck/

下个release,装就完啦,比如我下好解压在/opt/sonar目录下

  1. 配置runner的映射

由于我的ci是docker跑得,所以要有映射

打开runner配置文件:vim /etc/gitlab-runner/config.toml

在volumes项加个映射:/opt/sonar:/opt/sonar

配置ci

stages:
  - dependecy-check

# 依赖扫描
dependecy-check:
  stage: dependecy-check
  script:
    - mvn clean package -Dmaven.test.skip=true
    - /opt/sonar/dependency-check/bin/dependency-check.sh -s xx.jar -f HTML -o ./java-sec-code-report.html
    - mvn --batch-mode verify sonar:sonar -Dsonar.projectKey=$APP_NAME -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.login=$SONAR_TOKEN -Dsonar.dependencyCheck.htmlReportPath=java-sec-code-report.html
  when: manual
  tags:
    - xxx

依赖扫描需要装dependecy-check插件

现在,提交代码,跑个ci看看吧~