Ubuntu+ Docker + Gitlab-CI + Sonarqube + Sonar-Scanner 实现代码审查

577 阅读3分钟
  1. docker-compose 安装sonarqube和postgres数据库,挂载的目录需提前创建好
version: '3.6'
    postgres:
        image: postgres:latest
        container_name: postgres
        restart: always
        ports:
            - 5432:5432
        environment:
            - POSTGRES_USER=sonar
            - POSTGRES_PASSWORD=Sonar12#$
            - POSTGRES_DB=sonarqube
        volumes:
            - ./postgres/postgresql:/var/lib/postgresql
            - ./postgres/postgresql_data:/var/lib/postgresql/data


    sonarqube:
        image: sonarqube:latest
        container_name: sonarqube
        restart: always
        ports:
            - 9000:9000
        depends_on:
            - postgres
        environment:
            - SONARQUBE_JDBC_USERNAME=sonar
            - SONARQUBE_JDBC_PASSWORD=Sonar12#$
            - SONARQUBE_JDBC_URL=jdbc:postgresql://postgres:5432/sonarqube
        volumes:
            - ./sonarqube/conf:/opt/sonarqube/conf
            - ./sonarqube/data:/opt/sonarqube/data
            - ./sonarqube/extensions:/opt/sonarqube/extensions

networks:
    gitlab:
        external: true

  1. 进入snoarqube页面,初始账号/密码是admin/admin,需要自己修改。重点是sonarqube community版本不支持多分支扫描,这里需要安装插件,并配置sonarqube。

    插件下载地址:github.com/mc1arke/son…

    下载sonarqube-community-branch-plugin-1.22.0.jar,下载后拷贝到服务器的/sonarqube/extensions/plugins/的目录下,有必要chmod 777 刚刚考入的文件。

    重点,配置sonarqube的配置文件,在/sonarqube/conf/目录中创建配置文件,sonar.properties,并配置如下,记得改版本号

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

配置好后,重启容器,或者在web界面点击重启

docker restart sonarqube

然后讲讲为什么要做这个配置?

如果不做sonar.properties的配置,后续在sonar-scanner生成报告后upload上传报告的时候会出现错误{"errors":[{"msg":"Current edition does not support branch feature"}]},也就是不支持多分分支,提交失败,所以这步必须配置使插件生效

重启后,安装好的插件,在sonarqueb页面的插件,已安装中可以看到

image.png

  1. 在Ubuntu中安装Sonar-Scanner

    Sonar-Scanner下载地址:binaries.sonarsource.com/?prefix=Dis…

    下载:sonar-scanner-cli-6.2.1.4610-linux-x64.zip,解压拷贝到opt目录

wget https://binaries.sonarsource.com/?prefix=Distribution/sonar-scanner-cli/sonar-scanner-cli-6.2.1.4610-linux-x64.zip

unzip sonar-scanner-cli-6.2.1.4610-linux-x64.zip

sudo mv sonar-scanner-cli-6.2.1.4610-linux-x64 /opt/sonar-scanner

设置环境变量

# 查看是否有这个文件
ls -a ~ | grep .bashrc
# 没有则创建一个
touch ~/.bashrc
# 写入配置
sudo nano ~/.bashrc

配置内容如下:

export SONAR_SCANNER_HOME=/opt/sonar-scanner
export PATH=$PATH:$SONAR_SCANNER_HOME/bin

保存后,执行以下命令使配置生效,并添加软链接否则sonar-scanner指令将执行失败

source ~/.bashrc
# 将 sonar-scanner链接到 /usr/local/bin
sudo ln -s /opt/sonar-scanner/bin/sonar-scanner /usr/local/bin/sonar-scanner

  1. Gitlab中配置

创建账号SonarQube账号,用于给sonarqube拉代码,访问权限设为普通即可,这里你那个项目组需要执行代码分析的就吧SonarQube添加的群组或者项目中即可,之后再sonarqube页面便可导入

image.png 登录SonarQube账号,创建 GitLab OAuth app(将GitLab用作OAuth提供程序的应用程序)

image.png 创建应用后要记住这两个参数

image.png

分配令牌,一会用于配置sonarqube,创建令牌后一定要记住分配的令牌

image.png

  1. 配置Sonarqueb

在配置-ALM集成中,配置好后可以检查配置是否正确

image.png

image.png 从Gitlab导入项目

image.png 选择需要导入的项目,导入后在项目页即可看到该项目

image.png 创建令牌,这个令牌是给Gitlab提交报告用的,要记住

image.png

  1. 在Gitlab中的项目CI/CD中创建变量SONARQUBE_TOKEN,记住:不要设置为受保护的变量,否则CI的时候拿不到变量

image.png

  1. 配置Gitlab-ci.yaml

这里在CI的时候我暂时设置为手动触发,方便调试,调好后根据自己的需要来实现质量门限之类的

在你的项目中创建sonar-project.properties文件,内容如下

sonar.projectKey=<你自己的projectKey>
sonar.qualitygate.wait=false
# Ensure no branch-related properties are set
sonar.branch.name=
sonar.branch.target=

projectKey在哪里?导入项目的时候这个页面

image.png

在gitlab-ci中,我打印了SONARQUBE_TOKEN变量、配置了SCANNER_HOME,GIT_DEPTH: "1"是main分支,0是所有分支

stages:
  - sonar
  - build
  - deploy

sonar-job:
  stage: sonar
  image:
    name: sonarsource/sonar-scanner-cli:latest
  variables:
    SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # 定义分析任务缓存位置
    GIT_DEPTH: "1"  # 告诉git获取项目所有分支,这是分析任务所必须的
    SCANNER_HOME: "/opt/sonar-scanner"
  script:
    - echo "SONARQUBE_TOKEN is $SONARQUBE_TOKEN"
    - ls -la /opt/sonar-scanner
    - ls -la /usr/local/bin
    - which sonar-scanner
    - sonar-scanner -Dsonar.projectKey=<你的projectKey> -Dsonar.host.url=http://192.168.1.11:9000 -Dsonar.login=$SONARQUBE_TOKEN
  allow_failure: true
  only:
    - main  # 或者主分支
  when: manual # 增加手动触发流水线设置

8. 提交代码,作业中执行sonar-job

执行过程如下,upload了报告,就分析完成了

image.png

在sonarqube这个项目的页面可以看到详细的分析报告

image.png

  1. 至此已完成,请小伙伴多多支持,谢谢