SonarQube结合GitLab CI/CD自动检测Push和Merge Request的增量代码质量

  • 实验环境
  • Docker部署SonarQube
  • GitLab上添加全局环境变量
  • 用docker运行gitlab-runner并对于不同编译环境分别挂载不同的卷

大家可以先全文阅读并按照其操作,本文仅仅是列出一些不同和更新的地方

实验环境

1)Linux版本:CentOS Linux release 7.8.2003

2)GItLab版本:GitLab Community Edition 15.3.3

3)SonarQube版本:Community Edition 版本 9.6

Docker部署SonarQube

  1. 如果是小规模使用,可以直接参考原文,使用docker-compose启动。
  2. 如果是为了数据库性能和持久化考虑,就不建议用容器启动的postgres数据库,而使用Linux服务运行的postgres实例

可以在/data/sonarqube/conf中配置好数据库链接后,直接用如下docker run命令即可:

docker run -d --name sonarqube -p 9000:9000 --privileged=true --restart always -v /data/sonarqube/logs:/opt/sonarqube/logs -v /data/sonarqube/conf:/opt/sonarqube/conf -v /data/sonarqube/data:/opt/sonarqube/data -v /data/sonarqube/extensions:/opt/sonarqube/extensions sonarqube:9.6.0-community

GitLab上添加全局环境变量

网上搜索的部分文档中,写的是配置项目级别的环境变量,但是这个仅仅对当前项目有效,为了方便,建议是配置全局的环境变量,类似SonarQube配置页面推荐的一样

在gitlab上怎样把自己的分支合并到master_git


Gitlab管理页面的配置截图

在gitlab上怎样把自己的分支合并到master_ci_02

用docker运行gitlab-runner并对于不同编译环境分别挂载不同的卷

这个部分是我折腾了很久的部分,上文参考链接中也没有详细的介绍

  1. 这里一定要用root启动,并挂载/var/run/docker.sock,要不然runner无法在容器中再操作docker在宿主机上去启动新的容器,add-host是为了加上我自己设置的gitlab内部域名的解析
docker run -d --add-host gitlab.XXXX.com:10.112.12.100 --name gitlab-runner --restart always -v /data/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest

注意 请修改为自己的token!!!这里一定要记住token,可以在同一个gitlab-runner容器上注册多个不同类型的runner,还可以在gitlab设置里面打上不同的tag跑不同的代码检查。如果配置了https访问,请把自己的https证书文件挂载进去

  1. 命令行,支持其他编程语言 (比如 JS, TS, Go, Python, PHP, …)
docker exec -it gitlab-runner gitlab-runner register -n  \
--url https://gitlab.XXXX.com/ \
--registration-token BaRn3d4xSvfmHX4kiBEd \
--executor docker \
--description "SonarQube CLI Runner" \
--docker-image "sonarsource/sonar-scanner-cli:latest" \
--docker-volumes /var/run/docker.sock:/var/run/docker.sock \
--docker-volumes /data/gitlab-runner/cacerts:/tmp/cacerts
  1. .NET构建技术,C#编程语言。由于SonarQube推荐的镜像是mcr.microsoft.com/dotnet/core/sdk:latest,是不符合我们自己编译时候的运行时,另外我为了节约每次扫描时间,于是我自己基于下面的Dockerfile创建了一个镜像,并push到自己内部的harbor里面了。

注意

  1. 注册的脚本中特地挂载了外部的nuget地址,让容器运行的时候,不用每次都重新下载nuget包
  2. 新的.gitlab-ci.yml参考下文,删除了apt-get update,apt-get install --yes openjdk-11-jredotnet tool install --global dotnet-sonarscanner三行脚本
  3. 编译的脚本会指向到对应的项目地址,而不是直接用dotnet build
  4. allow_failure如果为false,则扫描不通过,merge request就无法合入
  5. 由于gitlab的runner比较多,不同的runner被打上了不同的tag,不同的语言就用不同的runner来扫描,比如sonar-dotnet的runner专门扫描C#,sonar-java的runner专门扫描Java,sonar-cli的runner专门扫描其他语言
docker exec -it gitlab-runner gitlab-runner register -n  \
--url https://gitlab.XXXX.com/ \
--registration-token BaRn3d4xSvfmHX4kiBEd \
--executor docker \
--description "SonarQube C# Runner" \
--docker-image "harbor.XXXX.com/baseimage/sonar-dotnet-scanner:6.0.101-focal" \
--docker-volumes /var/run/docker.sock:/var/run/docker.sock \
--docker-volumes /data/gitlab-runner/cacerts:/tmp/cacerts \
--docker-volumes /root/.nuget:/root/.nuget
##给SonarQube的dotnet扫描使用的镜像,减少每次用官网镜像要做apt-get等网络操作的耗时

##harbor.XXXX.com/baseimage/sonar-dotnet-scanner:6.0.101-focal
FROM mcr.microsoft.com/dotnet/sdk:6.0.101-focal
RUN apt-get update && \
    apt-get install --yes openjdk-11-jre && \
    dotnet tool install --global dotnet-sonarscanner
sonarqube-check:
  image: harbor.XXXX.com/baseimage/sonar-dotnet-scanner:6.0.101-focal
  variables:
    SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar"  # Defines the location of the analysis task cache
    GIT_DEPTH: "0"  # Tells git to fetch all the branches of the project, required by the analysis task
  cache:
    key: "${CI_JOB_NAME}"
    paths:
      - .sonar/cache
  script:
    - "export PATH=\"$PATH:$HOME/.dotnet/tools\""
    - "dotnet sonarscanner begin /k:\"YOUR_PROJECT_NAME_AYNATTDciF7-Iv8yf3wF\" /d:sonar.login=\"$SONAR_TOKEN\" /d:\"sonar.host.url=$SONAR_HOST_URL\" "
    - "dotnet publish ${CI_PROJECT_DIR}/src/aspnet-core/src/XXXX.XXXX.Web.Host/XXXX.XXXX.Web.Host.csproj -c Release -r linux-x64 -o api --self-contained"
    - "dotnet sonarscanner end /d:sonar.login=\"$SONAR_TOKEN\""
  allow_failure: true
  only:
    - merge_requests
    - develop
  tags:
    - sonar-dotnet
  1. Maven构建技术,Java编程语言。这里挂载了外部依赖的lib包,和.m2目录
docker exec -it gitlab-runner gitlab-runner register -n  \
--url https://gitlab.XXXX.com/ \
--registration-token BaRn3d4xSvfmHX4kiBEd \
--executor docker \
--description "SonarQube Java Runner" \
--docker-image "maven:3.8.5-ibm-semeru-17-focal" \
--docker-volumes /var/run/docker.sock:/var/run/docker.sock \
--docker-volumes /data/gitlab-runner/cacerts:/tmp/cacerts \
--docker-volumes /data/gitlab-runner/java-casp-lib:/root/lib \
--docker-volumes /data/gitlab-runner/.m2:/root/.m2