仅利用 gitlab + sonar 进行代码检测。

B站视频

笔记

飞书文档地址:

https://j3q80mf3ig.feishu.cn/docx/JyVAdkz9Go2cjwxyUKbctDRhnPe?from=from_copylink

简要笔记

详细笔记建议前往飞书观看。

sonarqube

版本对比

Community Edition

Developer Edition

Enterprise Edition

Data Center Edition

  • 支持5种IDE

  • 支持60+的插件

  • 支持SonarLint

  • 支持Quality Gate

  • 快速确认近期修改代码的问题

  • 支持Pull Request的分支代码分析

  • 安全性的增强:Security Hotspots & Security Vulnerabilities的全面支持

  • 支持SonarLint的智能提示,更好地与IDE进行集成

  • 支持对于Portfolio的管理

  • 提供OWASP / SANS的安全报告

  • 提供可配置的SAST 分析引擎

对于高可用性和横向扩展性有更好的支持。

不支持一个项目多分支的形式

部署 sonarqube

//创建一个网络 用于容器通信
docker network create sonarqube_network
docker pull sonarqube:9.9.3-community / 9.9.3-enterprise
//创建临时容器 如果只是测试,那么直接使用临时容器即可 可跳过后续步骤
docker run -d --name sonarqube9.9.3 --network sonarqube_network -p 9000:9000  sonarqube:9.9.3-community
//需要一个pg库,此处不演示具体的pg相关操作-挂载容器卷等
docker pull postgres:14.10
// docker pull postgres:16.1 / 15 以上 Navicat 连接会报错
docker run -d --name pgsql14.10 --network sonarqube_network -e POSTGRES_PASSWORD=1234 -p 5432:5432 postgres:14.10
// 新建数据库 sonarqube schema sonarqube

//拷贝容器卷进行挂载
docker cp -a sonarqube9.9.3:/opt/sonarqube/conf/ /home/docker/volume/sonarqube9.9.3
docker cp -a sonarqube9.9.3:/opt/sonarqube/data/ /home/docker/volume/sonarqube9.9.3
docker cp -a sonarqube9.9.3:/opt/sonarqube/logs/ /home/docker/volume/sonarqube9.9.3
docker cp -a sonarqube9.9.3:/opt/sonarqube/extensions/ /home/docker/volume/sonarqube9.9.3
// 开放所有权限 用于容器可以对本机文件进行修改
chmod -R 777 /home/docker/volume/
// 删除临时容器 修改 sonar.properties 与数据库连接的相关信息
// 设置官方推荐的值
sysctl -w vm.max_map_count=524288
sysctl -w fs.file-max=131072
ulimit -n 131072
ulimit -u 8192
// 将容器跑起来
docker run -d --name sonarqube9.9.3 --network  sonarqube_network -p 9000:9000 -v /home/docker/volume/sonarqube9.9.3/conf:/opt/sonarqube/conf  -v /home/docker/volume/sonarqube9.9.3/data:/opt/sonarqube/data  -v /home/docker/volume/sonarqube9.9.3/logs:/opt/sonarqube/logs  -v /home/docker/volume/sonarqube9.9.3/extensions:/opt/sonarqube/extensions --privileged=true sonarqube:9.9.3-community
docker ps --format 'table {{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Ports}}'
Pgsql

新建数据库 sonarqube schema sonarqube

修改 sonar.properties 与数据库连接的相关信息

https://blog.csdn.net/ximaiyao1984/article/details/130775496

初始 账号/密码 admin

Pj

https://bbs.kanxue.com/thread-273289.htm


//修改 sonar.properties
#sonar.web.javaOpts=-Xmx1G -Xms128m -XX:+HeapDumpOnOutOfMemoryError
sonar.web.javaOpts=-javaagent:/你的agent目录/SonarQubeAgent-1.2-SNAPSHOT.jar -Xmx1G -Xms128m -XX:+HeapDumpOnOutOfMemoryError
#sonar.ce.javaOpts=-Xmx2G -Xms128m -XX:+HeapDumpOnOutOfMemoryError
sonar.ce.javaOpts=-javaagent:/你的agent目录/SonarQubeAgent-1.2-SNAPSHOT.jar -Xmx2G -Xms128m -XX:+HeapDumpOnOutOfMemoryError
Q29tcGFueT1Vbmtub3duCkRpZ2VzdD1Ob3RSZXF1aXJlZApFZGl0aW9uPUVudGVycHJpc2UKRWRpdGlvbkxhYmVsPUVudGVycHJpc2UKRXhwaXJhdGlvbj0yMDk5LTAxLTAxCk1heExvYz05MjIzMzcyMDM2ODU0Nzc1ODA2ClBsdWdpbnM9YWJhcCxjcHAscGxzcWwsc2VjdXJpdHksc29uYXJhcGV4LHN3aWZ0LHRzcWwsdmJuZXQsY29ib2wscGxpLHJwZyx2YgpGZWF0dXJlcz0qClNlcnZlcklkPSoKU3VwcG9ydD1mYWxzZQpUeXBlPW55MGM=

插件

插件库

https://www.sonarplugins.com/

汉化

导出

https://github.com/cnescatlab/sonar-cnes-report 导出插件

手动安装插件只需要将插件放入 sonar 的 extensions/plugins 目录下。

GIT LAB

https://docs.gitlab.com/ee/install/docker.html

基础操作

利用 docker 进行安装

docker pull gitlab/gitlab-ce:16.6.1-ce.0
// 本次重点 不在 git 所以不挂载容器卷直接启就行
docker run -d -p 10008:80 -p 10009:443 -p 10010:22 --name gitlab --network=sonarqube_network --privileged=true gitlab/gitlab-ce:16.6.1-ce.0

启动成功后修改配置文件 解决相关路径显示为容器id而不是ip问题:(选择操作)

// 编辑配置文件 将宿主机ip进行配置 (端口有变则不推荐!!)
docker exec -it d445b68aec61 bash
vi /etc/gitlab/gitlab.rb
// 重启
docker restart d445b68aec61

密码放在了临时文件里面 /etc/gitlab/initial_root_password 用户名:root

docker exec d445b68aec61 cat /etc/gitlab/initial_root_password |grep Password

需要修改密码

创建一个项目,由于做测试,所以直接根据模板来就成,并且把权限设置为公开。

进行项目的拉取推送:此处不做详细描述。

Sonar 与 gitlab 集成

此步骤可略过(ps:可配置与gitlab交互,或者手动创建项目就可)

创建gitlab的访问令牌

填一下名字和过期时间,权限按需给。

结果:

打开 sonar 的配置:

配置 名称 / 路径 / token . 其中需要注意的是 路径 ,此处我们使用 docker部署,因此直接 用 gitlab 而不用固定ip。

在sonar直接通过gitlab进行项目拉取

这时候sonar项目就有一个 gitlab 的项目了。

配置一下项目的key 推荐改的和项目名称一样

Gitlab runner

此处是核心,用于gitlab与sonar 进行交互

docker pull gitlab/gitlab-runner:v16.6.1
// 挂载文件目录
mkdir -p /home/docker/volume/gitlab-runner/config
// 授权
chmod 777 /home/docker/volume/gitlab-runner/config
docker run -d --name gitlab-runner --network sonarqube_network -v /home/docker/volume/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock --privileged=true gitlab/gitlab-runner:v16.6.1

配置 sonar-scanner

Sonar-scanner 是用于将代码扫描和sonarQube进行交互

下载 sonar-scanner

https://docs.sonarsource.com/sonarqube/9.9/analyzing-source-code/scanners/sonarscanner/

配置 sonar-scanner

//先将 下载的文件拷贝进 runner 容器
docker cp /home/huge/sonar-scanner-cli-5.0.1.3006-linux.zip 2c61b029fb5b:/home/sonar-scanner-cli-5.0.1.3006-linux.zip
// 或者直接下载 wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-5.0.1.3006-linux.zip
//进入容器
docker exec -it 2c61b029fb5b bash
// 更新包列表 因为容器没有 unzip
apt-get update
apt update
// 安装 unzip
apt-get -y install unzip
apt -y install unzip
// 安装 vim
apt-get -y install vim
apt -y install vim
// 解压
unzip sonar-scanner-cli-5.0.1.3006-linux.zip
// 修改 sonar-scanner.properties 配置文件
vim /home/sonar-scanner-5.0.1.3006-linux/conf/sonar-scanner.properties
//配置环境变量。编辑全局配置文件
//在文件末尾追加内容:
#sonar-scanner
echo 'export PATH=$PATH:/home/sonar-scanner-5.0.1.3006-linux/bin' >> /etc/profile
echo 'export PATH=$PATH:/home/sonar-scanner-5.0.1.3006-linux/bin' >> /root/.bashrc
// 使配置生效
source /root/.bashrc
source /etc/profile
// 查看是否配置成功。
sonar-scanner -v

DockerFile

FROM gitlab/gitlab-runner:v16.6.1
ENV SONAR_NAME sonarqube9.9.3
ENV SONAR_SCANNER_ZIP sonar-scanner-cli-5.0.1.3006-linux
ENV SONAR_SCANNER_FILE sonar-scanner-5.0.1.3006-linux
WORKDIR /home
RUN sed -i 's/htt[p|ps]:\/\/archive.ubuntu.com\/ubuntu\//mirror:\/\/mirrors.ubuntu.com\/mirrors.txt/g' /etc/apt/sources.list
RUN wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/$SONAR_SCANNER_ZIP.zip \
    && apt-get update \
    && apt update \
    && apt-get install -y locales \
    && locale-gen "en_US.UTF-8" \
    && update-locale LC_ALL="en_US.UTF-8" \
    && export LANG="en_US.UTF-8" \
    && apt-get -y install unzip \
    && apt -y install unzip \
    && unzip $SONAR_SCANNER_ZIP.zip && echo "export PATH=\$PATH:/home/$SONAR_SCANNER_FILE/bin" >> /etc/profile \
    && echo "export PATH=\$PATH:/home/$SONAR_SCANNER_FILE/bin" >> /root/.bashrc \
    && . /etc/profile \
    && . /root/.bashrc \
    && sed -i "s/#sonar.host.url=http:\/\/localhost:9000/sonar.host.url=http:\/\/$SONAR_NAME:9000/g" /home/$SONAR_SCANNER_FILE/conf/sonar-scanner.properties \
    && rm -f /home/$SONAR_SCANNER_ZIP.zip
// 在 DockerFile 的目录下执行命令构建镜像
docker build -t gitlab-runner-sonar-scanner:v1.0.0 .
docker run -d --name gitlab-runner-scan --network sonarqube_network -v /home/docker/volume/gitlab-runner/config-scan:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock --privileged=true gitlab-runner-sonar-scanner:v1.0.0

sonar-scanner.properties

注册 runner

创建 gitlab 的 token

注册

// 开始注册 无需进入容器 宿主机执行
docker exec gitlab-runner-scan gitlab-runner register \
    --non-interactive \
    --url "http://gitlab/" \
    --registration-token "glrt-Hs1yz42BWLV5NjGPTCju" \
    --executor "shell" \
    --description "java description" \
    --tag-list "java-scan" \
    --run-untagged="false" \
    --locked="false" \
    --access-level="not_protected"

步骤:

  1. 输入命令:gitlab-runner register

  2. 输入地址: http://gitlab (由于此次使用docker部署,所有用容器名称就行)

  3. 输入token

  4. 输入名称(自定义)

  5. 输入执行类型 此处选 shell 。(可选其它,比如docker等)

这时候,就创建了一个全局的runner,我们可以在任何项目中看到他。

如果有需要,可以只创建属于自己项目的runner。

此时在挂载的配置文件里面就有相关的配置信息。

runner 注册完成后会在容器的 /etc/gitlab-runner 目录下生成一个 config.toml 的文件。

这个就是 runner 的配置文件。

因为在安装 runner 的时候我们已经将配置文件的目录通过挂载的形式映射到了宿主机目录:/config 下,所以后续如果需要更新 runner 配置文件可以直接在宿主机上进行修改。并且在宿主机上进行修改 runner 配置文件不需要重启 runner。它会每5分钟检查一次文件自动获取所有更改。包括该 [[runners]] 部分中定义的任何参数以及全局部分中的大多数参数(除外)listen_address。

集成

好了,到此为止,前置步骤,该搭的服务也搭了,该配置的也配置了,接下来就是此次的核心。

暂时无法在飞书文档外展示此内容

创建群主(用于给予开发人员的权限)ps 仅测试可忽略

配置项目的权限

根据项目创建 sonar 的 token (可以创建全局 但是不推荐)

配置扫描文件。在项目中添加一个 .gitlab-ci.yml 文件。

stages:
  #阶段,配置需要执行的阶段 可以配置多个
  - sonarqube_scan
sonarqube-check:
  #阶段,取自开始的stages
  stage: sonarqube_scan
  # sonar-scanner 相当于直接在容器中执行 sonar-scanner 命令
  script:
    - sonar-scanner -Dsonar.projectName=$CI_PROJECT_NAME -Dsonar.projectKey=$CI_PROJECT_NAME -Dsonar.sourceEncoding=UTF-8 -Dsonar.projectVersion=1.0 -Dsonar.language=java -Dsonar.sources=src -Dsonar.java.binaries=.  -Dsonar.login=sqp_58007566cef6780a36aa2f489cd4fb5d85338b66 -Dsonar.qualitygate.wait=true
  allow_failure: false
  #标签 找 runner
  tags:
    - sonar
  # 只允许 master 分支触发 并且只有合并到 master 时才会触发
  only:
    - master
    - merge_requests

提交代码到master分支 触发扫描

提交一份有问题的代码,到一个新的分支,会发现并没有再触发检测。

当我们将分支合并到 指定的分支(master),就会触发检测

由于我们提交了一份有问题的代码,所以会检测失败

可以取sonar查看具体的错误信息

设置 只有当检查合并通过后才能合并

当我们修改完错误再提交。

可以合并了