jenkins离线插件地址:
http://updates.jenkins-ci.org/download/plugins
https://updates.jenkins.io/download/plugins
https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins 国内
linux 安装jdk11 文档:
https://blog.51cto.com/u_16175449/6648723
https://www.sonarsource.com/products/sonarqube/deployment/ 最新版镜像下载地址
注意这个是内置数据库的,内嵌数据库只能用于测试场景,内嵌数据库无法扩展,也无法升级到新版本的SonarQube,并且不能支持将你的数据迁移至其他数据库引擎
其中Community Edition (社区版) 免费的
我是在docker官方镜像找的lts镜像下载的lts版:
https://www.sonarsource.com/products/sonarqube/downloads/ 其他版本下载地址
目前只支持Helm v3
此链接对应这k8s支持的版本号:
https://artifacthub.io/packages/helm/sonarqube/sonarqube-dce/10.0.0+521
官方部署文档参考,目前社区版不支持集群的方式:
https://docs.sonarsource.com/sonarqube/latest/setup-and-upgrade/deploy-on-kubernetes/deploy-sonarqube-on-kubernetes/
helm repo add sonarqube https://SonarSource.github.io/helm-chart-sonarqube
helm repo update
kubectl create namespace sonarqube
helm upgrade --install -n sonarqube sonarqube sonarqube/sonarqube
1.新版本7.9之后已经不再支持myql数据库,所以我们换成PostgreSQL
2.需要在k8s中准备一个strageclss(后端可以是nfs、ceph、juicefs、clusterfs)
[root@k8s-master01 ~]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
juicefs-sc (default) csi.juicefs.com Delete Immediate false 7d4h
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres-sonar
labels:
app: postgres-sonar
spec:
replicas: 1
selector:
matchLabels:
app: postgres-sonar
template:
metadata:
labels:
app: postgres-sonar
spec:
containers:
- name: postgres-sonar
image: postgres:11.4
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5432
env: #变量代入
- name: POSTGRES_DB
value: "sonarDB" #库名
- name: POSTGRES_USER
value: "sonarUser" #账号
- name: POSTGRES_PASSWORD
value: "123456" #密码
resources:
limits:
cpu: 1000m
memory: 2048Mi
requests:
cpu: 500m
memory: 1024Mi
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data #挂载路径
volumes:
- name: data
persistentVolumeClaim:
claimName: postgres-data
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-data
spec:
accessModes:
- ReadWriteMany
storageClassName: "juicefs-sc" #storageClass名称
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
name: postgres-sonar
labels:
app: postgres-sonar
spec:
clusterIP: None #无头服务
ports:
- port: 5432
protocol: TCP
targetPort: 5432
selector:
app: postgres-sonar
上面的yaml中,我们使用的storageClassName: "juicefs-sc"
并且使用了无头服务(仅集群使用),可以改成nodeport(可对外提供服务)
因为安装的是社区版,数据库是内嵌的,所以提示只作用于测试,且不能升级
而社区版只有sonarqube:lts-community 这个版本的镜像是最稳定且外嵌数据库的
下列yml中,nodePort: 30003 需要自行修改为集群中未被占用端口
[root@k8s-master01 sonarkube]# cat sonarkube.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: sonarqube
labels:
app: sonarqube
spec:
replicas: 1
selector:
matchLabels:
app: sonarqube
template:
metadata:
labels:
app: sonarqube
spec:
initContainers:
- name: init-sysctl
image: busybox
imagePullPolicy: IfNotPresent
command: ["sysctl", "-w", "vm.max_map_count=262144"]
securityContext:
privileged: true
containers:
- name: sonarqube
image: sonarqube:lts-community
ports:
- containerPort: 9000
env:
- name: SONARQUBE_JDBC_USERNAME
value: "sonarUser"
- name: SONARQUBE_JDBC_PASSWORD
value: "123456"
- name: SONARQUBE_JDBC_URL
value: "jdbc:postgresql://postgres-sonar:5432/sonarDB" #链接上面的pg,用无头服务的方式
livenessProbe:
httpGet:
path: /sessions/new
port: 9000
initialDelaySeconds: 60
periodSeconds: 30
readinessProbe:
httpGet:
path: /sessions/new
port: 9000
initialDelaySeconds: 60
periodSeconds: 30
failureThreshold: 6
resources:
limits:
cpu: 2000m
memory: 2048Mi
requests:
cpu: 1000m
memory: 1024Mi
volumeMounts:
- mountPath: /opt/sonarqube/conf
name: data
subPath: conf
- mountPath: /opt/sonarqube/data
name: data
subPath: data
- mountPath: /opt/sonarqube/extensions
name: data
subPath: extensions
volumes:
- name: data
persistentVolumeClaim:
claimName: sonarqube-data
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: sonarqube-data
spec:
accessModes:
- ReadWriteMany
storageClassName: "juicefs-sc"
resources:
requests:
storage: 20Gi
---
apiVersion: v1
kind: Service
metadata:
name: sonarqube
labels:
app: sonarqube
spec:
type: NodePort
ports:
- name: sonarqube
port: 9000
targetPort: 9000
nodePort: 30003
protocol: TCP
selector:
app: sonarqube
存储大小可以在上面的yml中自行调整,我测试给的比较小
[root@k8s-master01 sonarkube]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
postgres-data Bound pvc-0e3885a1-a4bc-4a8d-aac0-87d1ed62ab56 1Gi RWX juicefs-sc 89m
sonarqube-data Bound pvc-88544679-f7b8-4db4-8545-c012f5d0cfe7 20Gi RWX juicefs-sc 83m
admin/admin 端口30003
这里需要注意,并不是安装最新版,这个版本需要知道你目前安装jenkins时的java版本,我这里用的java11,所以需要去安装java11支持的sonarqube版本,不然会报以下错误
jenkins中sonarqube scanner 对应的jdk版本:
https://docs.sonarsource.com/sonarqube/9.9/analyzing-source-code/scanners/sonarscanner/
# must be unique in a given SonarQube instance
sonar.projectKey=web_demo_freestyle
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=web_demo_freestyle
sonar.projectVersion=1.0
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# This property is optional if sonar.modules is set.
sonar.sources=.
sonar.java.binaries=.
sonar.exclusions=**/test/**,**/target/**
sonar.java.source=11
sonar.java.target=11
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8
常用基础配置解释
sonar.projectKey=gpcore #sonar平台中相对应项目的key
sonar.projectName=gpcore #sonar平台中相对应项目的名字
sonar.sources=. #sonar检测的源文件目录,‘.’表示当前根目录下的所有文件目录;包含主要源文件的目录的逗号分隔路径
sonar.exclusions=**/*_test.go,**/vendor/** #检测中排除的源文件(排除的源文件不参与检测,一般排除单元测试文件、配置文件等)
sonar.tests=. #sonar检测的测试文件目录,‘.’表示当前根目录下的所有文件目录;包含测试源文件的目录的逗号分隔路径。从构建系统中读取Maven,Gradle,MSBuild项目。否则默认为空。
sonar.test.inclusions=**/**_test.go #检测中的测试源文件(指定单元测试文件)
sonar.test.exclusions=**/vendor/** #检测中排除的测试源文件(排除的源文件不参与检测)
sonar.jdbc.username和sonar.jdbc.password表示Sonar的数据库用户名和密码
sonar.host.url表示Sonar的监听地址和端口号,
sonar.sourceEncoding表示Sonar的编码方式,
sonar.jdbc.url表示数据库的链接方式,在这里我们的该项内容来源于Sonar的配置文件。sonar.projectKey为我们自定义的该Sonar Scanner的关键字,
sonar.projectName为该扫描项目的名称,
sonar.projectVersion表示Sonar项目的版本,
sonar.sources表示要扫描的项目目录
Dependency-Check 是 OWASP(Open Web Application Security Project)的一个实用开源程序,用于识别项目依赖项并检查是否存在任何已知的,公开披露的漏洞。
目前,已支持Java、.NET、Ruby、Node.js、Python等语言编写的程序并为C/C++构建系统(autoconf和cmake)提供了有限的支持。
而且该工具还是OWASP Top 10的解决方案的一部分。
Dependency-Check 支持面广(支持多种语言)、可集成性强,作为一款开源工具,在多年来的发展中已经支持和许多主流的软件进行集成
比如:命令行、Ant、Maven、Gradle、Jenkins、Sonar等;具备使用方便,落地简单等优势。
DependencyCheck 实现原理
依赖性检查可用于扫描应用程序(及其依赖库),执行检查时会将 Common Platform Enumeration (CPE)国家漏洞数据库及NPM Public Advisories库下载到本地,再通过核心引擎中的一系列分析器检查项目依赖性,收集有关依赖项的信息。
然后根据收集的依赖项信息与本地的CPE&NPM库数据进行对比,如果检查发现扫描的组件存在已知的易受攻击的漏洞则标识,最后生成报告进行展示。
dependency-check下载地址
https://owasp.org/www-project-dependency-check/
https://jeremylong.github.io/DependencyCheck/ 官方文档地址
https://github.com/jeremylong/DependencyCheck gitlab地址
上传到jenkins所在服务器解压即可
[root@jenkins test01]# cd /data/owasp/
[root@jenkins owasp]# ll
total 30368
drwxrwxrwx. 7 root root 125 Sep 20 14:25 dependency-check
-rwxrwxrwx. 1 root root 31094435 Sep 20 14:22 dependency-check-8.4.0-release.zip
[root@jenkins test01]# chmod 777 -R /data/owasp/
下载插件
配置全局工具
在构建步骤选择增加构建步骤选择Dependency_check
直接构建
进入这个目录,把html下载下来打开直接打开
1.下载dependency-check-sonar-plugin
https://github.com/dependency-check/dependency-check-sonar-plugin
一定要注意dependency-check-sonar-plugin与sonarQube的版本对应关系,我们部署的sonarQube是8.9,对应的dependency-check-sonar-plugin版本为:
2.下载下来之后使用:mvn clean package 生成jar包
将下载的sonar-dependency-check-plugin的jar包插件复制到sonarQube的extensions/plugins目录下,并且重启sonarqube,如果是镜像,需要手动编写Dockerfile,放入后生成新的镜像
3.返回到jenkins页面,在需要扫描的工程中,配置owasp的报告文件路径
sonar.dependencyCheck.htmlReportPath=./dependency-check-report.html
sonar.dependencyCheck.summarize=true
sonar.dependencyCheck.securityHotspot=true
4.注意执行顺序,先执行dependency-check,再执行sonarQube Scanner,因为sonar插件不会进行依赖扫描,需要通过dependency-check扫描完成后,读取配置文件,然后在页面展示的
5.构建完成后,在sonarQube页面,选择刚刚扫描的项目,选择更多,点击Dependency-Check,即可查看报告