文章目录
DevOps进阶
代码审计
SonarQube 是一个开源的代码质量管理平台,用于自动化检测代码中的质量问题和安全漏洞,帮助团队 持续提升代码质量。

官方地址: https://www.sonarsource.com/products/sonarqube/downloads/
核心功能
-
静态代码分析
- 自动识别代码缺陷(如空指针异常)、安全漏洞(如SQL注入)和代码异味(不良设计),支 持30+编程语言(Java、C#、Python等)。
- 集成PMD、FindBugs、Checkstyle等插件增强检测能力,提供深度规则定制。
-
多维质量指标
- 分析代码重复率、复杂度(圈复杂度)、注释覆盖率及单元测试覆盖率(需集成JaCoCo等工 具)。
- 量化技术债务,生成修复优先级建议。
-
开发流程集成
- 无缝对接CI/CD工具(Jenkins、GitLab CI、GitHub Actions),提交代码后自动触发扫描。
- 通过IDE插件(SonarLint)实时反馈问题,支持开发阶段即时修复。
-
质量门禁(Quality Gate)
- 定义质量阈值(如漏洞数量上限),未达标代码自动阻断合并或部署。
部署
在Jenkins服务器上,拉取postgres数据库和代码审计sonarqube镜像
bash
[root@jenkins ~]# docker pull postgres:12.6
[root@jenkins ~]# docker pull sonarqube:8.9.6-community
创建代码审计容器创建脚本
bash
[root@jenkins ~]# cd /usr/local/docker/
[root@jenkins docker]# mkdir sonarqube_docker
[root@jenkins docker]# ls
jenkins_docker sonarqube_docker
[root@jenkins docker]# cd sonarqube_docker/
[root@jenkins sonarqube_docker]# vim docker-compose.yml
[root@jenkins sonarqube_docker]# cat docker-compose.yml
version: '3.1'
services:
db:
image: postgres:12.6
container_name: db
ports:
- 5432:5432
networks:
- sonarnet
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
POSTGRES_DB: sonar
sonarqube:
image: sonarqube:8.9.6-community
container_name: sonarqube
depends_on:
- db
ports:
- 9000:9000
environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar
networks:
- sonarnet
networks:
sonarnet:
driver: bridge
启动脚本
bash
[root@jenkins sonarqube_docker]# docker-compose up -d
Creating network "sonarqube_docker_sonarnet" with driver "bridge" #出现错误没有启动成功
Creating db ... done
Creating sonarqube ... done
查看日志
bash
[root@jenkins sonarqube_docker]# docker logs sonarqube
。。。。
bootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
。。。。#最大虚拟内存空间太低了,至少需要262144
解决问题:虚拟内存太小,max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144],需要扩容
bash
[root@jenkins sonarqube_docker]# vim /etc/sysctl.conf
[root@jenkins sonarqube_docker]# tail -n 1 /etc/sysctl.conf
vm.max_map_count=262144
#激活
[root@jenkins sonarqube_docker]# sysctl -p
重新创建
bash
[root@jenkins sonarqube_docker]# docker-compose up -d
db is up-to-date
Starting sonarqube ... done
访问地址: http://192.168.18.154:9000/

更新密码

登录到sonarqube首页界面

下载并安装中文插件

下载并安装

出现报错
v
问题解决:
修正docker-compose.yml文件:
bash
[root@jenkins sonarqube_docker]# vim docker-compose.yml
[root@jenkins sonarqube_docker]# cat docker-compose.yml
version: '3.1'
services:
db:
image: postgres:12.6
container_name: db
ports:
- 5432:5432
networks:
- sonarnet
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
POSTGRES_DB: sonar
sonarqube:
image: sonarqube:8.9.6-community
container_name: sonarqube
depends_on:
- db
ports:
- 9000:9000
volumes:
- ./plugins/:/opt/sonarqube/extensions/plugins #添加创建仓库数据卷
environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar
networks:
- sonarnet
networks:
sonarnet:
driver: bridge
本地中文插件sonar-l10n-zh-plugin-8.9.jar放入,并服务重启
bash
[root@jenkins sonarqube_docker]# docker-compose stop
Stopping sonarqube ... done
Stopping db ... done
[root@jenkins sonarqube_docker]# docker-compose up -d
Starting db ... done
Recreating sonarqube ... done
[root@jenkins sonarqube_docker]# ls
docker-compose.yml plugins
#本地上传sonar-l10n-zh-plugin-8.9.jar
[root@jenkins sonarqube_docker]# cd plugins/
[root@jenkins plugins]# ls
sonar-l10n-zh-plugin-8.9.jar
[root@jenkins plugins]# docker-compose restart
Restarting sonarqube ... done
Restarting db ... done
#注意:如果出现sonar无法正常启动,需要把原来启动的sonarqube和postgre容器删除掉,再重新使用docker-compose拉起来
首页显示为中文

代码测试
回到Windows系统的idea上
sonarqube会支持两种方式测试代码:
maven方式
1:maven方式,sonarqube对maven有支持,可以使用maven命令对代码测试。
修改maven目录下的settings.xml文件

指定位置插入如下内容:sonarqube的用户名、密码和Jenkins主机节点

bash
#代码
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<sonar.login>admin</sonar.login>
<sonar.password>dcr@1111</sonar.password> <sonar.host.url>http://192.168.18.154:9000</sonar.host.url>
</properties>
</profile>
设置maven环境变量








在idea当前终端命令行进行输入:

执行
bash
mvn sonar:sonar
报错

版本报错
原因:sonar-maven-plugin:4.0.0.4121默认支持jdk11,而项目中使用的是jdk8,导致版本出错
解决问题:
可以采用下载对应的sonar-maven-plugin:3.11.0.3922版本来解决
在pom.xml中插入以下内容:
bash
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.11.0.3922</version>
</plugin>

重新执行mvn sonar:sonar,进行加载
打开sonarqube网页,完成项目代码审计

查看检测结果




sonar-scanner方式
官方插件下载地址: https://docs.sonarsource.com/sonarqube-server/latest/analyzing-source-code/scanners/sonarscanner/
在Jenkins服务器上操作,把压缩包sonar-scanner-cli-4.6.0.2311-linux.zip解压到Jenkins的data目录中
bash
#本地上传sonar-scanner-cli-4.6.0.2311-linux.zip
[root@jenkins ~]# unzip sonar-scanner-cli-4.6.0.2311-linux.zip
[root@jenkins ~]# mv sonar-scanner-4.6.0.2311-linux/ sonar-scanner
[root@jenkins ~]# mv sonar-scanner /usr/local/docker/jenkins_docker/data/
修改配置
bash
[root@jenkins ~]# cd /usr/local/docker/jenkins_docker/data/sonar-scanner/
[root@jenkins sonar-scanner]# ls
bin conf jre lib
[root@jenkins sonar-scanner]# cd conf
[root@jenkins conf]# ls
sonar-scanner.properties
[root@jenkins conf]# vim sonar-scanner.properties
[root@jenkins conf]# cat sonar-scanner.properties
#Configure here general information about the environment, such as SonarQube server connection details for example
#No information about specific project should appear here
#----- Default SonarQube server
sonar.host.url=http://192.168.18.154:9000 #去掉注释,修改为Jenkins的地址
#----- Default source code encoding
sonar.sourceEncoding=UTF-8 #去注释
进行项目代码测试
bash
[root@jenkins conf]# cd /usr/local/docker/jenkins_docker/data/workspace/mytest
[root@jenkins mytest]# /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=linux-test
。。。。
ERROR: Error during SonarScanner execution
ERROR: Not authorized. Analyzing this project requires authentication. Please provide a user token in sonar.login or other credentials in sonar.login and sonar.password.
ERROR:
ERROR: Re-run SonarScanner using the -X switch to enable full debug logging.
#需要使用token进行身份认证
需要使用token令牌进行身份验证
点击右上角,用户-我的账号


添加参数,再次执行,需要添加编译过后内容的位置
bash
[root@jenkins mytest]# /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=linux-test -Dsonar.login=e253a0b8e35b9527885207c3508479c8843073ea -Dsonar.projectKey=linux-test
.....
ERROR: Error during SonarScanner execution
org.sonar.java.AnalysisException: Your project contains .java files, please provide compiled classes with sonar.java.binaries property, or exclude them from the analysis with sonar.exclusions property.
....#没有java
继续添加参数,则测试成功(注意:这个密钥后面整合Jenkins要用到)
bash
[root@jenkins mytest]# /usr/local/docker/jenkins_docker/data/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=linux-test -Dsonar.login=e253a0b8e35b9527885207c3508479c8843073ea -Dsonar.projectKey=linux-test -Dsonar.java.binaries=./target/
回到sonarqube网页中查看

代码审计整合Jenkins
使用插件导入sonar.hpi




搜索已安装插件




注意:先应用再保存后,再回到系统配置中



应用凭据

Jenkins中调用sonar-scanner工具
系统管理-全局工具配置



添加名称和容器内部路径

在项目中进行配置




bash
sonar.projectname=${JOB_NAME}
sonar.projectKey=${JOB_NAME}
sonar.source=./
sonar.java.binaries=target
进行构建

构建报错:


解决问题:因为之前在Jenkins服务器上使用命令进行了构建,产生过隐藏文件.scannerwork夹需要删除
bash
[root@jenkins mytest]# ls -a
. demo_web.iml .git .gitignore .idea .scannerwork target
.. docker .gitattributes HELP.md pom.xml src
[root@jenkins mytest]# rm -rf .scannerwork/
[root@jenkins mytest]# ls -a
. .. demo_web.iml docker .git .gitattributes .gitignore HELP.md .idea pom.xml src target
再次构建
过程中调用了sonarqube


查看sonarqube网页,观察到代码测试结果

harbor镜像仓库

部署
在Jenkins服务器上把harbor压缩包进行解压缩,进行设置后,启动安装
bash
[root@jenkins ~]# tar -xzvf harbor-offline-installer-v2.8.2.tgz -C /usr/local/
[root@jenkins ~]# cd /usr//local/harbor/
[root@jenkins harbor]# ls
common.sh harbor.v2.8.2.tar.gz harbor.yml.tmpl install.sh LICENSE prepare
[root@jenkins harbor]# cp -p harbor.yml.tmpl harbor.yml
[root@jenkins harbor]# vim harbor.yml
hostname: 192.168.18.154
# https related config
#https:
# https port for harbor, default is 443
# port: 443
# The path of cert and key files for nginx
#certificate: /your/certificate/path
#private_key: /your/private/key/path
harbor_admin_password: harbor123
[root@jenkins harbor]# ./install.sh
打开harbor镜像仓库地址网页,默认端口80
输入用户名:admin
密码:harbor123

登录成功进入页面

创建项目

修改docker配置文件,添加仓库地址
bash
[root@jenkins docker]# vim /etc/docker/daemon.json
[root@jenkins docker]# cat /etc/docker/daemon.json
{
"insecure-registries": ["192.168.18.154:80"],#添加harbor仓库地址
"registry-mirrors": [
"https://3aa741e7c6bf42ae924a3c0143f0e841.mirror.swr.myhuaweicloud.com",
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://registry.docker-cn.com",
"https://hub-mirror.c.163.com",
"https://hub.uuuadc.top",
"https://docker.anyhub.us.kg",
"https://dockerhub.jobcher.com",
"https://dockerhub.icu",
"https://docker.ckyl.me",
"https://docker.awsl9527.cn",
"https://mirror.baidubce.com",
"https://docker.1panel.live"
]
}
bash
[root@jenkins docker]# systemctl restart docker
#重启docker后需要重启harbor,jenkins,sonarqube容器
#重启harbor
[root@jenkins docker]# cd /usr/local/harbor/
[root@jenkins harbor]# docker-compose restart
Restarting nginx ... done
Restarting harbor-jobservice ... done
Restarting harbor-core ... done
Restarting harbor-portal ... done
Restarting registryctl ... done
Restarting redis ... done
Restarting harbor-db ... done
Restarting registry ... done
Restarting harbor-log ... done
#重启jenkins
[root@jenkins harbor]# cd /usr/local/docker/jenkins_docker/data/
[root@jenkins data]# docker-compose restart
Restarting jenkins ... done
#重启sonarqube
[root@jenkins data]# cd /usr/local/docker/sonarqube_docker/
[root@jenkins sonarqube_docker]# docker-compose restart
Restarting sonarqube ... done
Restarting db ... done
推送镜像
Jenkins服务器本地登录harbor
bash
[root@jenkins sonarqube_docker]# docker login -u admin -p harbor123 192.168.18.154:80
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
下载测试镜像nginx
bash
[root@jenkins sonarqube_docker]# docker pull nginx
推送镜像到harbor
bash
#修改标签
[root@jenkins sonarqube_docker]# docker tag nginx:latest 192.168.18.154:80/repo/nginx/test
[root@jenkins sonarqube_docker]# docker push 192.168.18.154:80/repo/nginx/test
查看harbor的repo中已经有了nginx:test镜像

拉取镜像
在本地Jenkins服务器中测试拉取,在拉取前先删除原有镜像
bash
#先将本地有的镜像删除
[root@jenkins sonarqube_docker]# docker rmi 192.168.18.154:80/repo/nginx/test
[root@jenkins sonarqube_docker]# docker pull 192.168.18.154:80/repo/nginx/test
[root@jenkins sonarqube_docker]# docker images | grep 192.168.18.154:80
192.168.18.154:80/repo/nginx/test latest 4af177a024eb 2 weeks ago 161MB
Jenkins服务中使用docker
Jenkins需要把镜像制作并推送到harbor中,就需要具备docker环境
让Jenkins容器使用宿主机中docker环镜
修改docker.sock的权限
bash
[root@jenkins run]# cd /var/run/
[root@jenkins run]# ll docker.sock
srw-rw---- 1 root docker 0 Jan 30 09:18 docker.sock
[root@jenkins run]# chown root.root docker.sock
[root@jenkins run]# chmod o+rw docker.sock
[root@jenkins run]# ll docker.sock
srw-rw-rw- 1 root root 0 Jan 30 09:18 docker.sock
修改Jenkins脚本配置文件
bash
[root@jenkins run]# cd /usr/local/docker/jenkins_docker/
[root@jenkins jenkins_docker]# vim docker-compose.yml
[root@jenkins jenkins_docker]# cat docker-compose.yml
version: "3.1"
services:
jenkins:
image: jenkins/jenkins:2.346.3-lts-jdk8
container_name: jenkins
ports:
- 8080:8080
- 50000:50000
volumes:
- ./data/:/var/jenkins_home/
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
- /etc/docker/daemon.json:/etc/docker/daemon.json
启动Jenkins服务
bash
[root@jenkins jenkins_docker]# docker-compose up -d
Recreating jenkins ... done
验证:进入Jenkins容器内部执行docker命令
bash
[root@jenkins jenkins_docker]# docker exec -it jenkins bash
jenkins@488e9af58c84:/$ docker version
Client: Docker Engine - Community
Version: 26.1.4
API version: 1.45
Go version: go1.21.11
Git commit: 5650f9b
Built: Wed Jun 5 11:32:04 2024
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 26.1.4
API version: 1.45 (minimum version 1.24)
Go version: go1.21.11
Git commit: de5c9cf
Built: Wed Jun 5 11:31:02 2024
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.33
GitCommit: d2d58213f83a351ca8f528a95fbd145f5654e957
runc:
Version: 1.1.12
GitCommit: v1.1.12-0-g51d5e94
docker-init:
Version: 0.19.0
GitCommit: de40ad0
Jenkins服务中构建镜像推送到harbor仓库
到Windows系统的idea中,删除docker-compose文件

修改一下内容3.0重新提交





添加3.0标签





项目-配置-构建后操作




bash
mv target/*.jar docker/
docker build -t mytest:$tag docker/
选择对应的标签进行构建


在Jenkins服务器中查看镜像
bash
[root@jenkins jenkins_docker]# docker images | grep mytest
mytest v3.0 c514ecef480c About a minute ago 543MB
推送到harbor配置
项目-配置-构建后操作

编辑内容如下:(登录harbor-定义镜像标签-推送harbor)
bash
docker login -u admin -p harbor123 192.168.18.154:80
docker tag mytest:$tag 192.168.18.154:80/repo/mytest:$tag
docker push 192.168.18.154:80/repo/mytest:$tag
再次进行构建3.0项目

去harbor上查看

完善
bash
[root@jenkins jenkins_docker]# docker images | grep none
<none> <none> c514ecef480c 6 minutes ago 543MB
[root@jenkins jenkins_docker]# docker image prune -f
[root@jenkins jenkins_docker]# docker images | grep none

再次构建

检验
bash
[root@jenkins jenkins_docker]# docker images | grep none
镜像部署目标web服务器
1:告知目标服务器拉取哪个镜像。告知内容(harbor地址;harbor仓库名;镜像名;镜像版本;容器 运行端口号)
2:判断当前服务器是否正在运行该容器,如果正在运行则需要删除。
3:如果目标服务器已经存在当前镜像,则需要删除该镜像。
4:目标服务器拉取harbor上的镜像。
5:将拉取的镜像运行为容器
在Jenkins服务器中,编写脚本
bash
[root@jenkins ~]# vim deploy.sh
[root@jenkins ~]# mv deploy.sh /usr/local/docker/jenkins_docker/data/workspace/mytest
[root@jenkins mytest]# cat deploy.sh
#! /bin/bash
harbor_ip=$1
harbor_repo=$2
project=$3
version=$4
container_port=$5
host_port=$6
imageName=$harbor_ip/$harbor_repo/$project:$version
echo $imageName
#如果当前容器正在运行,则删除
container_id=`docker ps -a | grep ${project} | awk '{print $1}'`
echo $container_id
if [ "$container_id" != "" ]
then
docker stop $container_id
docker rm $container_id
fi
#如果当前镜像已存在,则删除
tag=`docker images | grep ${project} | awk '{print $2}'`
echo $tag
if [[ "$tag" =~ "$version" ]]
then
docker rmi $imageName
fi
#非本地登录镜像仓库
cp /lib/systemd/system/docker.service /lib/systemd/system/docker.service.bak
sed -i 's|ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock|ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.18.154 --containerd=/run/containerd/containerd.sock|g' /lib/systemd/system/docker.service
systemctl daemon-reload && systemctl restart docker && docker login -u admin -pharbor123 $harbor_ip
#拉取镜像
docker pull $imageName
#运行容器
docker run -d -p $host_port:$container_port --name $project $imageName
echo "SUCCESS"
打开项目-配置-General
添加字符参数,容器启动时,主机端口






bash
mv /usr/local/test/deploy.sh /usr/bin/
chmod +x /usr/bin/deploy.sh
deploy.sh 192.168.18.154 repo ${JOB_NAME} $tag $container_port $host_port
进行构建

查看构建结果

在目标web服务器中查看镜像
bash
[root@web docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.18.154/repo/mytest v3.0 2e3c52668c1b About a minute ago 543MB
mytest v2.0 3cb3fcdea642 5 hours ago 543MB
mytest v1.0 223b4d285ff2 26 hours ago 543MB
openjdk 8 b273004037cc 3 years ago 526MB
查看容器
bash
[root@web docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
59c225799342 192.168.18.154/repo/mytest:v3.0 "/bin/sh -c 'java -j..." About a minute ago Up About a minute 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp mytest
查看网页
http://192.168.18.155:8080/test
