在 Gitlab CI 中调用 Sonarqube 进行代码扫描
时间:2022-06-26
本文章向大家介绍在 Gitlab CI 中调用 Sonarqube 进行代码扫描,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Gitlab 提供了基于 Code Climate
的代码质量评估功能,这一功能是通过 dind(Docker in Docker)方式运行的,在 Kubernetes 环境中、尤其是托管集群中,这种方式不太合适,还好还有一个替代方案:Sonarqube,通过在 .gitlab-ci.yml
中的设置,可以使用 Sonarqube 对代码进行扫描,接收到 Commit 之后,Sonarqube 会生成针对提交的代码质量提示,如图所示:
过程也并不复杂,简单的部署一个 Sonarqube 服务,并在 Gitlab CI 中调用即可。
配置 Gitlab
这个步骤很简单,只要打开页面 profile/personal_access_tokens
,新建 Token 备用即可。
启动 Sonarqube
在 Kubernetes 环境中启用一个简单的 Sonarqube 服务器是很方便的,具体说明可以参看官方 Docker 镜像的说明,这里有几个重点:
- 数据:该镜像内置 H2 存储,在生产环境中使用自然是不合适的,可以通过环境变量,使用外部的 MySQL 或者 PostgreSQL 服务器。
- 持久化:该镜像的数据目录为
/opt/sonarqube/
,下面的data
、logs
、conf
和extensions
,都是需要接入 PVC 进行持久化存储的。(就算只是测试,因为安装插件需要重启,因此也需要提供持久化支持) - 权限:该镜像主进程是使用 999 的组 ID 运行的,因此需要进行配置。
- 后续内容所用插件目前还无法支持 Sonarqube 7.7,因此此处使用的是 7.6 版本。
总结以上几点,列出代码中需要注意的内容:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: sonarqube
labels:
app: sonarqube
spec:
...
template:
metadata:
...
spec:
securityContext:
fsGroup: 999
containers:
- name: sonarqube
image: "sonarqube:7.6-community"
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 9000
volumeMounts:
- name: sonar-ext
mountPath: /opt/sonarqube/extensions
- name: sonar-data
mountPath: /opt/sonarqube/data
- name: sonar-log
mountPath: /opt/sonarqube/logs
- name: sonar-conf
mountPath: /opt/sonarqube/conf
...
配置 Sonarqube
Sonarqube 启动之后,使用缺省用户名和密码(admin
/admin
)登录之后,首先安装 Java 语言插件:
- 在
/account/security/
修改密码。 - 前往
/admin/marketplace
安装SonarJava
插件。 - 打开路径
/admin/system
,重启服务。
接下来是手工安装 Gitlab 插件:
- 使用
kubectl exec -it
进入 Sonarqube 的 Pod 中。 - 进入
/opt/sonarqube/extensions/plugins
路径,下载插件 - 重启 Sonarqube。
插件安装完成之后,/projects/create
创建新项目,选择 java
-> maven
,最终会出现如下提示:
其中包含了后续步骤所需要的 Token。
配置 Gitlab 插件
- 打开
admin/settings?category=gitlab
。 - 填写
GitLab url
以及GitLab User Token
。 - 保存。
配置项目 CI
这部分相当简单的一行 Maven 命令,例如
stages:
- test
- scan
...
Sonar:
stage: scan
tags:
- maven
script:
- mvn --batch-mode verify sonar:sonar -Dsonar.host.url=https://sonar.microservice.xyz -Dsonar.login=cd387c80d1d40b24c1000b9982778ecef572795c -Dsonar.projectKey=sam -Dsonar.gitlab.project_id=$CI_PROJECT_ID -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME
这里的关键参数:
- sonar.host.url:Sonarqube 的地址。
- sonar.login:Sonarqube 配置新项目时生成的 Token
- sonar.projectKey:Sonarqube 新项目生成的 ID。
完成上述修改之后,就可以提交你的 Java 代码,看看 Sonarqube 在 Commit 下使用评论方式发表的代码分析结果。
附录
- 插件项目地址:https://github.com/gabrie-allaigre/sonar-gitlab-plugin/
- 洛谷P1722 矩阵 II
- 洛谷P1976 鸡蛋饼
- 洛谷P1420 最长连号
- 各种读入方式速度比较
- 美团NLP实习面试总结一 基本知识4 数据结构二 NLP相关技术1 LSTM2 介绍实体链接与实体映射3 解释随机游走的原理及作用4 命名实体识别
- 【下载】苹果发布Turi Create机器学习框架,5行代码开发图像识别
- codevs 4163 hzwer与逆序对
- ASP.NET Core提供模块化Middleware组件
- CSS预处理器的对比 — sass、less和stylus
- Gensim实现Word2Vec的Skip-Gram模型简介快速上手对语料进行分词使用gensim的word2vec训练模型
- React第三方组件4(状态管理之Reflux的使用②TodoList上)
- 机器学习(六)Sigmoid函数和Softmax函数1 Sigmoid函数2 Softmax函数
- React第三方组件4(状态管理之Reflux的使用①简单使用)
- React第三方组件3(状态管理之Flux的使用⑤异步操作)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一天一大 leet(两个数组的交集 II)难度:简单-Day20200713
- 2020年研一末找实习总结(面经)
- 一天一大 leet(三角形最小路径和)难度:中等-Day20200714
- 一天一大 leet(判断二分图)难度:中等-Day20200716
- 一天一大 lee(被围绕的区域)难度:中等-Day20200811
- 一天一大 leet(搜索插入位置)难度:简单-Day20200717
- 一天一大 leet(两数之和 II - 输入有序数组)难度:简单-Day20200720
- 一天一大 leet(分割数组的最大值)难度:困难-Day20200725
- 一天一大 leet(矩阵中的最长递增路径)难度:困难-Day20200726
- 一天一大 lee(克隆图)难度:中等-Day20200812
- 一天一大 lee(有效的括号)难度:简单-Day20200814
- 一天一大 leet(判断子序列)难度:简单-Day20200727
- 一天一大 leet(寻宝)难度:困难-Day20200729
- LeetCode刷题记录(easy难度21-40题)
- 一天一大 lee(移除盒子)难度:困难-Day20200815