本文搭建过程绝大部分都是参考这位大佬岚天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
可以在/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
网上搜索的部分文档中,写的是配置项目级别的环境变量,但是这个仅仅对当前项目有效,为了方便,建议是配置全局的环境变量,类似SonarQube配置页面推荐的一样
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证书文件挂载进去
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
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
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