跳转至

DevOps部署2

一. CI/CD入门操作

基于Jenkins拉取GitLab的SpringBoot代码进行构建并发布到测试环境实现持续集成

基于Jenkins拉取GitLab指定发行版本的SpringBoot代码进行构建发布到生产环境实现CD持续部署

1. 持续集成

为了让程序代码可以自动推送到测试环境基于Docker服务运行,需要添加DOkcer配置和脚本文件让程序可以在集成到主干的同时运行起来

在1上:

1) 添加Dockerfile文件

mkdir /root/mytest-hello程序代码/mytest-hello/docker
cd /root/mytest-hello程序代码/mytest-hello/docker
vi Dockerfile
FROM daocloud.io/library/java:8u40-jdk
# 指定基础镜像,可以到国内镜像源hub.daocloud.io搜索一个java镜像
COPY demo.jar /usr/local/
WORKDIR /usr/local
CMD java -jar demo.jar
vi docker-compose.yaml
version: "3.1"
services:
  demo:
    build:
      context: ./
      dockerfile: Dockerfile
    image: demo:v1.0.0
    container_name: demo
    ports:
    - 8888:8080
vi pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
    </parent>


    <groupId>com.bdqn</groupId>
    <artifactId>mytest</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <finalName>demo</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

我们在这个 pom.xml 文件中加入的部分是 <build></build> 块,其中最重要的部分是 <finalName>demo</finalName> 。添加这一块,可以指定jar包。

2) 推动到gitlab上

git add .
git commit -m "添加Dockerfile和docker-compose并修改pom打包名"
git push -u origin main

此时我们就可以在gitlab上查看了

顺便如果镜像拉取不下来,可以从本地的镜像文件中拷贝过去

scp /root/DevOps/2026_08_24_GitOps/daocloud_library_java_jdk8u40.tar root@192.168.100.101:/root/
ssh root@192.168.100.101 "docker load -i /root/daocloud_library_java_jdk8u40.tar"

alt text

3) 追加Jenkins构建后操作脚本命令

alt text

4) 发布到GitLab后由Jenkins立即构建并推送到目标服务器

配置好后单击"立即构建",然后等待构建完毕

alt text

5) 测试部署到目标服务器程序

在3上

[root@K8s3 test]# ls /usr/local/test/docker
demo.jar  docker-compose.yaml  Dockerfile
[root@K8s3 docker]# docker ps
CONTAINER ID   IMAGE         COMMAND                   CREATED          STATUS          PORTS                                         NAMES
322ad859b883   demo:v1.0.0   "/bin/sh -c 'java -j…"   38 seconds ago   Up 37 seconds   0.0.0.0:8888->8080/tcp, [::]:8888->8000/tcp   demo

alt text

2. 持续交付,部署

程序代码在经历多次集成操作达到最终可以交付,持续交付整体流程和持续集成类似。不过需要选取指定发行版本

1) 下载Git Parameter插件

alt text

2) 设置项目参数化构建

alt textalt text

3) 给项目打上tag版本

alt textalt text

4) 再次构建任务的时候,设置采用shell方式,拉取指定tag版本代码

alt text

5) 更新java项目内容

a. 修改文件

vi /root/mytest-hello程序代码/mytest-hello/src/main/java/com/bdqn/controller/HelloController.java
vi /root/mytest-hello程序代码/mytest-hello/docker/docker-compose.yaml
package com.bdqn.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Administrator
 * @version 1.0
 * @description TODO
 * @date 2023/11/17 11:27
 */
@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String sayHello(){
        return "hello jenkins --v2.0.0"; 
/* 把hello jenkins改成hello jenkins --v2.0.0 */
    }
version: "3.1"
services:
  demo:
    build:
      context: ./
      dockerfile: Dockerfile
    image: demo:v2.0.0
    container_name: demo
    ports:
    - 8888:8080
~                  

b. 推送到gitlab

git add .
git commit -m "版本更新至v2.0.0"
git push -u origin main

c. 在gitlab上查看验证,并新增新的tag

alt textalt textalt textalt text

6) 基于Parameter构建任务并将任务发布到目标服务器

alt textalt text

二. 集成Sonar Qube

1. Sonar Qube介绍

开发工程师开发代码一般都会自测,那么有时候也需要借助一些工具来辅助我们检测代码的健壮性,即代码质量。其中 Sonar Qube 这个软件很多公司都在使用,集成到自动构建的流水线中,下面我来介绍这款软件的基本使用

Sonar Qube 简称 Sonar ,是一个开源代码分析平台,支持 Java、Python、PHP、JavaScript、CSS 等17种语言,可以检测出重复的代码、代码漏洞、代码规范和安全性漏洞问题

Sonar Qube 可以与多种软件整合代码扫描,比如Maven、Gradle、Git、Jenkins等,并且会将代码检测的结果推送回 Sonar Cube 并且在系统提供的UI界面上显示出来

2. Sonar Qube 环境搭建

1) Sonar Qube 安装

Sonar Qube 在7.9版本种已经放弃了对MySQL的支持,并且建议在商业环境中采用PostgreSQL,那么安装 Sonar Qube 时需要依赖 PostgreSQL

Sonar Qube 官网地址: (https://www.sonarsource.com/products/sonarqube/)

a. 在2上拉取镜像

docker pull postgres
docker pull sonarqube:8.9.8-community

或者导入本地镜像

[root@K8s2 ~]#  docker load -i /root/sonarqube.tar
Loaded image: sonarqube:8.9.8-community
[root@K8s2 ~]# docker load -i /root/postgres.tar 
Loaded image: postgres:latest

2) 在 sonarqube_docker 目录中编写 docker-compose.yaml

先创建目录

mkdir -p /usr/local/docker/sonarqube_docker
vi /usr/local/docker/sonarqube_docker/docker-compose.yaml
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:8.9.8-community
      container_name: sonarqube
      depends_on:
        - db
      ports:
        - "9000:9000"
      networks:
        - sonarnet
      environment:
        SONARQUBE_JDBC_URL: jdbc:postgresql://db:5432/sonar
        SONARQUBE_JDBC_USERNAME: sonar
        SONARQUBE_JDBC_PASSWORD: sonar
networks:
  sonarnet:
    driver: bridge

3) 启动容器

[root@K8s2 ~]# docker compose -f /usr/local/docker/sonarqube_docker/docker-compose.yaml up -d
WARN[0000] /usr/local/docker/sonarqube_docker/docker-compose.yaml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion 
[+] up 3/3
 ✔ Network sonarqube_docker_sonarnet Created                     0.1s
 ✔ Container db                      Started                     0.7s
 ✔ Container sonarqube               Started                     1.0s

4) 如果启动失败,则需要设置 sysctl.conf 文件信息

a. 查看容器日志

[root@K8s2 ~]# cd /usr/local/docker/sonarqube_docker
[root@K8s2 sonarqube_docker]# docker compose logs -f sonarqube
WARN[0000] /usr/local/docker/sonarqube_docker/docker-compose.yaml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion 
...
sonarqube  | ERROR: [1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch.
sonarqube  | bootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
sonarqube  | ERROR: Elasticsearch did not exit normally - check the logs at /opt/sonarqube/logs/sonarqube.log
sonarqube  | 2026.08.31 02:24:02 INFO  es[][o.e.n.Node] stopping ...
sonarqube  | 2026.08.31 02:24:02 INFO  es[][o.e.n.Node] stopped
sonarqube  | 2026.08.31 02:24:02 INFO  es[][o.e.n.Node] closing ...
sonarqube  | 2026.08.31 02:24:02 INFO  es[][o.e.n.Node] closed
sonarqube  | 2026.08.31 02:24:02 WARN  app[][o.s.a.p.AbstractManagedProcess] Process exited with exit value [es]: 78
sonarqube  | 2026.08.31 02:24:02 INFO  app[][o.s.a.SchedulerImpl] Process[es] is stopped
sonarqube  | 2026.08.31 02:24:02 INFO  app[][o.s.a.SchedulerImpl] SonarQube is stopped

b. 修改susctl.conf文件信息

cat << 'EOF' | tee -a /etc/sysctl.conf
vm.max_map_count=262144
EOF
sysctl -p

然后重启

[root@K8s2 sonarqube_docker]# docker compose -f /usr/local/docker/sonarqube_docker/docker-compose.yaml up -d
WARN[0000] /usr/local/docker/sonarqube_docker/docker-compose.yaml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion 
[+] up 2/2
 ✔ Container db        Running                                   0.0s
 ✔ Container sonarqube Started                                   0.3s

5) 配置 Sonar Qube 中文

a. 成功启动后,在浏览器中输入http://192.168.100.100:9000访问 Sonar Qube 首页

alt text

b. 输入密码后我们需要重新设置密码

alt text

c. 重新设置密码后我们就可以进入 Sonar Qube 首页了

alt text

d. 先在插件市场安装插件中文包

alt text

先点击明白风险,然后右侧出现安装按钮开始安装

或者如果安装失败可以从本地导入

# 在宿主机建一个插件目录,把 jar 放进去:
mkdir -p /usr/local/docker/sonarqube_docker/plugins
cp /root/sonar-l10n-zh-plugin-8.9.jar /usr/local/docker/sonarqube_docker/plugins/
# 然后修改docker-compose.yaml,给 sonarqube 服务加一个 volumes 挂载:
vi /usr/local/docker/sonarqube_docker/docker-compose.yaml
# 修改文件后重建容器让挂载生效
docker compose -f /usr/local/docker/sonarqube_docker/docker-compose.yaml up -d
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:8.9.8-community
    container_name: sonarqube
    depends_on:
      - db
    ports:
      - "9000:9000"
    networks:
      - sonarnet
    volumes:
      - ./plugins:/opt/sonarqube/extensions/plugins   # 挂载插件目录
    environment:
      SONARQUBE_JDBC_URL: jdbc:postgresql://db:5432/sonar
      SONARQUBE_JDBC_USERNAME: sonar
      SONARQUBE_JDBC_PASSWORD: sonar
networks:
  sonarnet:
    driver: bridge

重新登录后就会发现有中文了

alt text

3. Sonar Qube 基本使用

Sonar Qube的使用方法很多。Maven可以整合,也可以使用 sonar-scanner 的方式,再查看 Sonar Qube 的检测效果

1) Maven实现代码检测

vi /usr/local/docker/jenkins_docker/data/apache-maven-3.8.5/conf/settings.xml

找到<id>sonar</id>的块,并替换为如下

<profile>
    <id>sonar</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <sonar.login>admin</sonar.login>
        <sonar.password>2016.Com</sonar.password>
        <sonar.host.url>http://192.168.100.100:9000</sonar.host.url>
    </properties>
<profile>

2) Sonar-scanner实现代码检测

a. 在Jenkins中下载Sonar-scanner插件,或者从网上下载然后导入

这里我们采用第二种方法,github上地址为: 下载Sonar-scanner:https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-8.0.1.6346-linux-x64.zip

wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-8.0.1.6346-linux-x64.zip

b. 解压并移动

unzip sonar-scanner-cli-8.0.1.6346-linux-x64.zip
mv sonar-scanner-8.0.1.6346-linux-x64 /usr/local/docker/jenkins_docker/data/sonar-scanner

c. 修改配置文件

vi /usr/local/docker/jenkins_docker/data/sonar-scanner/conf/sonar-scanner.properties 

将以下这段加进去

sonar.host.url=https://192.168.100.100:9000
sonar.sourceEncoding=UTF-8'

d. 修改Jenkis

Jenkins中把构建步骤中改成clean package -DskipTests sonar:sonar

alt text

e. Jenkins配置 Sonar Qube