SonarQube结合GitLab CI/CD自动检测Push和Merge Request的增量代码质量
Docker运行Gitlab-runner并关联SonarQube自动检测Merge Request中代码的质量
·
SonarQube结合GitLab CI/CD自动检测Push和Merge Request的增量代码质量
本文搭建过程绝大部分都是参考这位大佬岚天start的这篇文章 :
SonarQube结合GitLab CI/CD自动检测代码【图文详述】
大家可以先全文阅读并按照其操作,本文仅仅是列出一些不同和更新的地方
实验环境
1)Linux版本:CentOS Linux release 7.8.2003
2)GItLab版本:GitLab Community Edition 15.3.3
3)SonarQube版本:Community Edition 版本 9.6
Docker部署SonarQube
- 如果是小规模使用,可以直接参考原文,使用docker-compose启动。
- 如果是为了数据库性能和持久化考虑,就不建议用容器启动的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管理页面的配置截图
用docker运行gitlab-runner并对于不同编译环境分别挂载不同的卷
这个部分是我折腾了很久的部分,上文参考链接中也没有详细的介绍
- 这里一定要用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证书文件挂载进去
- 命令行,支持其他编程语言 (比如 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
- .NET构建技术,C#编程语言。由于SonarQube推荐的镜像是
mcr.microsoft.com/dotnet/core/sdk:latest
,是不符合我们自己编译时候的运行时,另外我为了节约每次扫描时间,于是我自己基于下面的Dockerfile创建了一个镜像,并push到自己内部的harbor里面了。
注意
- 注册的脚本中特地挂载了外部的nuget地址,让容器运行的时候,不用每次都重新下载nuget包
- 新的
.gitlab-ci.yml
参考下文,删除了apt-get update
,apt-get install --yes openjdk-11-jre
和dotnet tool install --global dotnet-sonarscanner
三行脚本- 编译的脚本会指向到对应的项目地址,而不是直接用dotnet build
- allow_failure如果为false,则扫描不通过,merge request就无法合入
- 由于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
- 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
更多推荐
已为社区贡献1条内容
所有评论(0)