本文所要达到的效果: 在push时自动触发GitLab CI/CD pipeline job, 自动扫描所提交的代码, 并将结果上报到sonarqube
名词解释:
SonarQube® - 是一个检测bug, 漏洞及代码异味的自动化工具. 它可以整合到现有的工作流中去启用持续的代码审查在项目的多分支及PR中.
SonarScanner for Maven - 通过常规的Maven命令执行SonarQube分析的工具.
GitLab CI/CD 是一个内置在GitLab中的工具,用于通过持续方法进行软件开发:
- Continuous Integration (CI) 持续集成
- Continuous Delivery (CD) 持续交付
- Continuous Deployment (CD) 持续部署
持续集成的工作原理是将小的代码块推送到Git仓库中托管的应用程序代码库中,并且每次推送时,都要运行一系列脚本来构建、测试和验证代码更改,然后再将其合并到主分支中。
持续交付和部署相当于更进一步的CI,可以在每次推送到仓库默认分支的同时将应用程序部署到生产环境。
这些方法使得可以在开发周期的早期发现bugs和errors,从而确保部署到生产环境的所有代码都符合为应用程序建立的代码标准。
GitLab CI/CD 由一个名为 .gitlab-ci.yml 的文件进行配置,改文件位于仓库的根目录下。文件中指定的脚本由GitLab Runner执行。
软件版本:
SonarQube: 8.9.2 lts-community
SonarScanner for Maven: 3.9
GitLab Runner: gitlab/gitlab-runner:alpine
Docker安装SonarQube
docker-compose.yml
version: "3"
services:
sonarqube:
image: sonarqube:lts-community #8.9.2社区长期支持版
depends_on:
- db
environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar
volumes:
- sonarqube_data:/opt/sonarqube/data
- sonarqube_extensions:/opt/sonarqube/extensions
- sonarqube_logs:/opt/sonarqube/logs
ports:
- "9000:9000" #暴露端口9000
db:
image: postgres:12
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
volumes:
- postgresql:/var/lib/postgresql
- postgresql_data:/var/lib/postgresql/data
volumes:
sonarqube_data:
sonarqube_extensions:
sonarqube_logs:
postgresql:
postgresql_data:
安装好后设置管理员密码, 在 administration - marketplace中搜索并下载中文插件, 重启
多分支插件
安装步骤:
将下载的jar文件拷贝到sonar安装目录下extensions/plugins/ 及 lib/common下, 并将权限设为775
在sonar安装目录下的config/sonar.properties中添加
sonar.web.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.0.jar=web配置项在sonar安装目录下的config/sonar.properties中添加
sonar.ce.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.0.jar=ce配置项重启SonarQube(在docker容器重启, 如果使用仪表板的重启服务器会导致插件不生效), 然后忽略使用第三方插件的警告
注意一定要将jar包权限设置为775, 并且要同时复制到 lib/common 下
GitLab-Runner 安装及配置
docker安装GitLab-Runner
docker pull gitlab/gitlab-runner
注册一个Runner
以下是安装GitLab Runner完之后的步骤.
以下的步骤描述了启动并注册一个短期gitlab-runner容器. 注册后, 容器的配置会写入你配置挂载的volume(例如/srv/gitlab-runner/config), 并且会被runner载入.
通过Docker注册一个Runner:
-
根据不同的挂载类型运行相应的注册命令:
挂在到本地文件系统:
docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register如果你在安装期间配置了其他位置的volume, 替换/srv/gitlab-runner/config成你配置的volume.
挂载到docker volume:
docker run --rm -it -v gitlab-runner-config:/etc/gitlab-runner gitlab/gitlab-runner:latest register 输入GitLab地址.
输入从GitLab获取的token.
输入这个Runner的详情描述. 你可以到GitLab的用户界面修改该详情.
输入 runner所关联的tag, 多个tag用逗号隔开. 你可以在GitLab的用户界面修改该值.
runner需要的 执行器. 对于大多数情形来说, 输入docker. 执行器选取可以参考Executors | GitLab.
如果你使用docker作为执行器, 需要提供默认的运行镜像, 假如 .gitlab-ci.yml`文件没有指定的话会在默认镜像中运行.

注册sonar-scanner-maven Runner
-
运行命令
docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner:alpine register 填写所需要的信息, GitLab地址和token可以在 GitLab项目设置 - CI/CD - Runner中找到

- 注册完后, 会在GitLab 项目设置 - CI/CD - Runner中看到注册的Runner

-
因为我们选择了使用docker执行器来运行maven镜像, sonar-scanner-maven扫描器在扫描项目时会下载所需要的所有依赖, 并且有可能会找不到我们自己所打包的依赖, 为了防止扫描器下载时间过长及找不到我们自定义的依赖, 需要将本地依赖仓库放入服务器上, 将仓库目录挂载到runner的volume.
① 将本地依赖拷入到服务器/root/gitlab-runner-temp/maven-repository

② 进入gitlab-runner容器修改config.toml

找到我们刚配置的 runner

在volumes后添加"/root/gitlab-runner-temp/maven-repository:/root/.m2/repository:rw", 将宿主机的/root/gitlab-runner-temp/maven-repository挂载到 runner启动时maven容器中的默认repository位置
扫描分析项目
参考GitLab Integration | SonarQube Docs
设置禁用浅克隆
具体原因为确保扫描器可以访问GitLab执行CI/CD时的所有历史
项目设置 - CI/CD - 流水线通用设置 - Git 浅克隆
设置为0

定义一些公共变量
项目设置 - CI/CD - 变量

变量可以参考https://docs.sonarqube.org/8.9/analysis/analysis-parameters/
其中sonar_login和sonar_token参数可以在sonarqube中 点击右上角头像 - 我的账号 - 安全 - 生成令牌中获取

创建.gitlab-ci.yml文件
创建.gitlab-ci.yml文件到项目根目录, .gitlab-ci.yml配置项可参考Keyword reference for the .gitlab-ci.yml file | GitLab
.gitlab-ci.yml
stages: # 定义gitlab pipeline执行步骤
- sonarqube-check
sonarqube-check:
stage: sonarqube-check
tags: # 指定gitlab runner tag
- sonar-scanner-maven
image: maven:3.6.3-jdk-11 # 指定运行镜像, 如果docker没有会自动pull
variables: # 变量, 有些变量像SONAR_HOST_URL, SONAR_TOKEN, SONAR_LOGIN在gitlab CI/CD 变量中配置过, 所以可以不用重复配置
SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # 声明分析任务缓存文件夹
GIT_DEPTH: "0" # 告诉git获取所有的分支, 分析任务强制要求
cache:
key: "${CI_JOB_NAME}"
paths:
- .sonar/cache
script:
# 此位置配置新的服务 配置参数参考 https://docs.sonarqube.org/8.9/analysis/analysis-parameters/
# 一定要指定sonar.projectKey和sonar.projectName两个参数
- mvn verify sonar:sonar -X -Dmaven.test.skip=true -Dsonar.qualitygate.wait=true -am -Dsonar.projectKey=com.company.project:projectName -Dsonar.projectName=projectName
allow_failure: true
BTW
可以在IDEA中安装sonarlint插件来获取sonarqube配置的规则, 并实时在编码时扫描
plugin:SonarLint - IntelliJ IDEs Plugin | Marketplace (jetbrains.com)
另外需要安装 Node.js
下载安装好后, 切换到sonarlint选项卡, 点击右边的设置

配置连接

点击 + 号



配置好后, 点击Search in list, 会将所有项目列入左边方框, 选中相应项目即可
