DevOps二 CD、CI持续集成与持续交付 以及 集成Sonar Qube
本文介绍了基于Jenkins实现SpringBoot项目的持续集成(CI)和持续部署(CD)流程。在持续集成部分,通过添加Dockerfile和docker-compose.yml文件配置容器化部署,并在Jenkins中设置构建后操作脚本实现自动化构建和部署。持续部署部分则通过Git Parameter插件实现基于Git标签的版本控制,可选择性构建指定版本的代码并部署到生产环境。整个流程实现了从代
一 CD、CI 入门操作
基于Jenkins拉取GitLab的SpringBoot代码进行构建发布到测试环境实现持续集成
基于Jenkins拉取GitLab指定发行版本的SpringBoot代码进行构建发布到生产环境实现CD实现持续部署
1.1 持续集成
为了让程序代码可以推送到测试环境基于Docker服务运行,需要添加Docker配置和脚本文件让程序可以在集成到主干的同时运行起来。
-
添加Dockerfile文件
构建自定义镜像 
FROM openjdk:11
COPY jenkinsproject-1.0.jar /usr/local/
WORKDIR /usr/local/
CMD java -jar jenkinsproject-1.0.jar
-
添加docker-compose.yml文件
加载自定义镜像启动容器 
version: '3.1'
services:
jenkinsproject:
build: ./
image: jenkinsproject-1.0.jar:v1.0.0
container_name: jenkinsproject
ports:
- 8888:8080
-
追加Jenkins构建后操作脚本命令
构建后发布并执行脚本命令 
cp -f /usr/package/docker/* /usr/package/target
cd /usr/package/target
docker-compose down
docker-compose up -d --build
docker image prune -f
上边命令解释
# 复制docker文件夹里所有内容到target目录下,文件有同名的话进行替换
cp -f /usr/package/docker/* /usr/package/target
# 进入到target文件夹里
cd /usr/package/target
# 停止并删除运行中的Compose应用。它会删除容器和网络,但是不会删除卷和镜像。
docker-compose down
# 启动已定义在docker-compose.yml文件中的服务容器,并以守护进程的方式在后台运行。
docker-compose up -d --build
# 用于删除所有悬空的镜像(即不再有任何标签指向它们)。-f 或 --force 参数用于强制删除,不会进行确认提示
docker image prune -f
因为我们在SpringBoot项目里新建了docker文件夹,需要把这个文件夹也传到目标服务器里(之前只传了jar包过去)

target/*.jar docker/**
这里默认超时时间是120000,即两分钟。我们改成300000,即五分钟。
开始构建

找到目标服务器,查看是否有镜像以及容器是否启动

浏览器访问项目

此时,我们修改代码,把上边的hello word改为hello word2,然后提交代码

再次编译

稍等片刻后,访问浏览器,可以看到生效了

查看目标服务器里的镜像与容器,发现也是刚新生成的

1.2 持续交付、部署
程序代码在经过多次集成操作到达最终可以交付,持续交付整体流程和持续集成类似,不过需要选取指定的发行版本
-
下载Git Parameter插件
下载Git Parameter 

-
设置项目参数化构建
基于Git标签构建 
选择git参数


千万记得改下边这里,不然每次拉取的都试最新的代码,而不是指定tag版本的代码(release就是上边的标识,二者一致)

-
给项目添加tag版本
添加tag版本 
填写信息

-
任务构建时,采用Shell方式构建,拉取指定tag版本代码
切换指定标签并构建项目 

#!/bin/bash
cd /var/lib/jenkins/workspace/task2/
git checkout $release
/usr/local/maven/bin/mvn package
-
基于Parameter构建任务,任务发布到目标服务器(点击左侧“Build with Parameters”)
构建任务 
注意,需要选中上边对应的版本号。不选的话,编译的是最新的代码,之后点击上边的Build,开始构建

我们在gitlab里给不同的版本代码打tag标签,并且下边这里选择 “分支或标签”

此时,编译时就可以选择分支或tag标签来进行部署打包了

上边不选分支或者tag的话,部署的就是master分支最新版本代码。
二 集成Sonar Qube
2.1 Sonar Qube介绍
Sonar Qube是一个开源的代码分析平台,支持Java、Python、PHP、JavaScript、CSS等25种以上的语言,可以检测出重复代码、代码漏洞、代码规范和安全性漏洞的问题。
Sonar Qube可以与多种软件整合进行代码扫描,比如Maven,Gradle,Git,Jenkins等,并且会将代码检测结果推送回Sonar Qube并且在系统提供的UI界面上显示出来
| Sonar Qube的UI界面 |
|---|
![]() |
2.2 Sonar Qube环境搭建
2.2.1 Sonar Qube安装
由于国内拉取最新版本Sonar Qube镜像一直失败,导致只能安装较低版本,所以大家可以尝试在centos里安装最新版本的Sonar Qube,步骤如下:centos7.9安装SonarQube10.5.1
Sonar Qube在7.9版本中已经放弃了对MySQL的支持,并且建议在商业环境中采用PostgreSQL,那么安装Sonar Qube时需要依赖PostgreSQL。
并且这里会安装Sonar Qube的最新版
- 拉取镜像
docker pull postgres:latest
# 实测发现,sonarqube:latest实际拉取的是低版本的,这里可以指定具体版本,如:docker pull sonarqube:10.6-community
docker pull sonarqube:latest
-
编写docker-compose.yml
version: "3.1" services: db: image: postgres container_name: db ports: - 5432:5432 networks: - sonarnet environment: POSTGRES_USER: sonar POSTGRES_PASSWORD: sonar sonarqube: image: sonarqube:latest container_name: sonarqube depends_on: - db ports: - "9000:9000" networks: - sonarnet environment: SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar SONAR_JDBC_USERNAME: sonar SONAR_JDBC_PASSWORD: sonar networks: sonarnet: driver: bridge -
需要设置sysctl.conf文件信息,vm.max_map_count ,否则启动时报错如下

设置sysctl.conf:
vim /etc/sysctl.conf
# 添加一行内容
vm.max_map_count=262144
并执行命令刷新
sysctl -p
-
启动容器
docker-compose up -d -
启动需要一定时间启动,可以可以查看容器日志,看到如下内容代表启动成功
容器日志 
-
访问Sonar Qube首页:192.168.119.132:9000
登录 
-
还需要重新设置一次密码
重新设置密码 
-
Sonar Qube首页
Sonar Qube首页 
|
2.2.2 安装中文插件
| 安装中文插件 |
|---|
![]() |
安装成功后需要重启,安装失败重新点击install重装即可。
安装成功后,会查看到重启按钮,点击即可
| 重启按钮 |
|---|
![]() |
重启后查看效果
| 首页效果 |
|---|
![]() |
2.3 Sonar Qube基本使用
Sonar Qube的使用方式很多,Maven可以整合,也可以采用sonar-scanner的方式,再查看Sonar Qube的检测效果
2.3.1 Maven实现代码检测
-
本地项目,修改Maven的settings.xml文件配置Sonar Qube信息
<profile> <id>sonar</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <sonar.login>admin</sonar.login> <sonar.password>123456789</sonar.password> <sonar.host.url>http://192.168.119.132:9000</sonar.host.url> </properties> </profile>
注意:Sonar Qube使用的jdk版本,与本地项目使用的jdk版本要一致,而且不能太低,我这里部署的Sonar Qube是10.5.1,使用的jdk是17
-
在代码位置执行命令(cd /var/lib/jenkins/workspace/task2/target):mvn sonar:sonar
执行代码检测 
或者idea里直接执行
最后:最下边的报错不用管,是日志问题,感兴趣的同学可以尝试解决一下
-
查看Sonar Qube界面检测结果
Sonar Qube检测结果 
2.3.2 Sonar-scanner实现代码检测
-
下载Sonar-scanner:https://binaries.sonarsource.com/?prefix=Distribution/sonar-scanner-cli/
下载要求Linux版本,这里下载6.0版本

如果是centos安装的jenkins的话(非docker安装),就把Sonar-scanner上传到与jenkins同一台服务器上
-
解压并配置sonar服务端信息
-
由于是zip压缩包,需要安装unzip解压插件
yum -y install unzip -
解压压缩包
-
unzip sonar-scanner-cli-6.0.2311-linux.zip
# 改下名字
mv sonar-scanner-6.0.0.4432-linux sonar-scanner-cli
-
配置sonarQube服务端地址,修改conf下的sonar-scanner.properties
配置服务端信息 
cd /root/sonar-scanner-cli/conf
vim sonar-scanner.properties
# 添加如下内容
sonar.host.url=http://192.168.119.132:9000
sonar.sourceEncoding=UTF-8
- 执行命令检测代码
# 在项目所在目录执行以下命令
cd /var/lib/jenkins/workspace/task2
# 注意,后边的 -D"sonar.login=admin" -D"sonar.password=123456",里边的admin和123456是你自己sonar服务器的登录用户名和密码
~/sonar-scanner-cli/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=jenkinsproject-1.0 -Dsonar.projectKey=java -Dsonar.java.binaries=target/ -D"sonar.login=admin" -D"sonar.password=123456"
一直报错找不到node环境

那我们安装node环境
| 查看日志信息 |
|---|
![]() |
报错如下:ERROR Re-run SonarScanner CLI using the -X switch to enable full debug logging

curl --insecure -v https://192.168.119.132:9000/api/v2/analysis/version
-
查看SonarQube界面检测结果
检测结果 
2.4 Jenkins集成Sonar Qube
Jenkins继承Sonar Qube实现代码扫描需要先下载整合插件
2.4.1 Jenkins安装插件
| 下载Sonar Qube插件 |
|---|
![]() |
![]() |
![]() |
2.4.2 Jenkins配置Sonar Qube
-
开启Sonar Qube权限验证
开启Sonar Qube权限校验 
-
获取Sonar Qube的令牌
获取令牌 
-
配置Jenkins的Sonar Qube信息



2.4.3 配置Sonar-scanner
-
将Sonar-scaner添加到Jenkins数据卷中并配置全局配置
配置Sonar-scanner 
-
配置任务的Sonar-scanner
配置任务的Sonar-scanner 
2.4.4 构建任务
| 构建任务 |
|---|
![]() |
![]() |
更多推荐










所有评论(0)