百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

超详细!基于k8s+docker+jenkins的一站式 DevOps 环境搭建教程-下

liuian 2025-01-16 20:10 28 浏览

----- 测试篇 -----

一、使用 IDEA 工具上传代码

(一)下载并安装 IDEA


https://www.jetbrains.com/zh-cn/idea/download/?section=windows 下载安装包进行安装,旗舰版激活工具可从
https://wwdj.lanzout.com/itnj42fyuzyb 获取。

(二)创建 Spring 项目

按照 IDEA 的项目创建向导,新建一个 Spring 项目。

(三)在 src/main/java/com/example/demo 下创建一个 java 类

package com.example.demo.controller;

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

@RestController
public class DemoController {
    @GetMapping("/")
    public String hello() {
        return "Hello World! V1.0.0";
    }
}

(四)运行并测试验证

启动项目,在浏览器输入 http://localhost:8080,查看是否能正常显示 “Hello World! V1.0.0”。

二、上传代码到 gitlab 仓库

(一)登录 gitlab 平台,创建一个新项目,记录项目地址

(二)在代码本地安装 git 客户端


https://git-scm.com/downloads 或
https://mirrors.huaweicloud.com/home 下载并安装 git 客户端。

(三)在本地代码目录下,执行以下命令配置用户名和邮箱

git config --global usr.name "Administrator"
git config --global user.email "admin@example.com"

(四)打开 IDEA,在设置中找到 Git 配置项,指定本地安装的 git 路径

(五)将本地项目关联到之前在 gitlab 创建的项目仓库

(六)使用 IDEA 的版本控制工具,将代码提交到本地仓库

(七)将本地代码推送到 gitlab 仓库

(八)登录 gitlab,进入对应的项目,查看代码是否已成功推送

三、通过 jenkins 拉取 gitlab 上的代码

(一)在 jenkins 平台创建一个新任务

任务类型根据实际需求选择,如自由风格项目。

(二)配置 gitlab 仓库信息

在任务配置的源码管理部分,填写 gitlab 仓库的 URL、认证信息(如果需要)等,指定要拉取的分支。

(三)构建任务,确认效果

点击构建按钮,查看 jenkins 控制台输出,确认代码是否成功拉取到指定目录。

四、将 jenkins 拉取到的代码交给 maven 进行构建

(一)配置 maven 信息

在任务配置中添加构建步骤,选择调用 maven 构建,执行 clean package -DskipTests 命令。

(二)立即构建并查看状态

点击构建并关注控制台输出,注意第一次构建时会下载大量的依赖。

(三)确认构建后的结果

构建完成后,查看构建目录下是否生成了预期的目标文件,如 jar 包等。

五、jenkins 上将构建后的文件推送到目标服务器

(一)在系统配置中添加目标服务器信息

在 jenkins 系统管理的系统配置部分,配置目标服务器的连接信息,如 SSH 主机、端口、用户名、密码等,用于后续远程操作。

(二)在任务中配置目标机器信息

在任务配置的构建后操作部分,选择通过 SSH 发送构建产物到目标服务器,指定要发送的文件和目标服务器上的接收目录。

(三)构建任务并确认效果

再次构建任务,登录目标服务器,查看指定目录下是否收到了推送过来的文件。

六、推送到目标机器的文件自动通过 docker 运行起来

(一)在代码中添加 Dockerfile 信息

在项目根目录创建 Dockerfile,内容如下:

FROM openjdk:17
COPY dome1.jar /usr/local/
WORKDIR /usr/local
CMD java -jar dome1.jar

同时,在 pom.xml 文件的 <build> 中指定 jar 包名称:

<build>
    <finalName>demo1</finalName>
</build>

(二)创建 docker-compose.yml 文件

希望通过 docker-compose 将服务运行起来。

version: '3.1'
services:
  demo1:
    build:
      context:./
      dockerfile: Dockerfile
    image: demo1:v1.0.0
    container_name: demo1
    ports:
      - 8080:8080

(三)将代码推送到 gitlab 代码仓库

将包含 Dockerfile 和 docker-compose.yml 的代码推送到 gitlab 仓库。

(四)更新任务中构建后的信息

在 jenkins 任务配置的构建后操作部分,添加需要目标服务器执行的命令:

cd /data/myProjects/docker/
cp../target/demo1.jar./
docker-compose down
docker-compose up -d --build
docker image prune -f

(五)立即构建任务并确认服务是否正常启动

构建任务后,通过访问服务对应的端口,查看服务是否正常运行。

七、参数化构建

(一)添加参数

在 jenkins 任务配置中,添加参数化构建过程,如字符串参数、选项参数等,例如添加一个版本号参数 tag。

(二)添加构建步骤,通过 tag 拉取代码

修改源码管理部分的配置,使分支名称引用参数 $tag,这样就可以根据传入的参数拉取不同版本的代码。

(三)修改 IDEA 中代码的版本信息并上传到 gitlab

在 IDEA 中修改代码的版本相关信息,如版本号注释等,然后提交并推送代码到 gitlab。

(四)在 gitlab 中,给刚上传的代码添加对应的标签

登录 gitlab,在项目页面为指定的提交添加标签,如 v2.0.0 等。

(五)上传代码并通过 tag 来构建任务

在 jenkins 构建任务时,传入相应的 tag 参数,查看是否能正确拉取对应版本的代码进行构建。

八、在 jenkins 中整合 sonarqube

(一)安装 SonarQube Scanner 插件

在 jenkins 插件管理页面,搜索并安装 SonarQube Scanner 插件。

(二)在 sonarqube 页面创建令牌

登录 sonarqube 平台,在用户设置或项目设置中创建一个用于 jenkins 访问的令牌。

(三)在 jenkins 系统配置中添加 sonarqube 的凭据

在 jenkins 系统管理的凭据配置部分,添加 sonarqube 的访问凭据,类型选择对应的令牌,填入创建的令牌值。

(四)在 jenkins 系统配置中添加 sonarqube 信息

在系统配置的 SonarQube servers 部分,填写 sonarqube 的服务器地址,如 http://192.168.1.112:9000。

(五)在 jenkins 全局配置中添加 sonarqube 信息

在全局工具配置中,指定 SonarQube Scanner 的安装路径。

(六)在任务配置中追加 sonarqube 的内容

在任务配置的构建步骤中,添加执行 SonarQube 扫描的步骤,设置相关参数:

sonar.sources=./
sonar.projectname=${JOB_NAME}
sonar.login=squ_de2616c40fa44d278da96de19836d8a4c1761bbb
sonar.projectKey=${JOB_NAME}
sonar.java.binaries=./target/

(七)在 sonarqube 中确认是否有代码质量检测的内容

构建任务后,登录 sonarqube 平台,查看对应项目的代码质量检测结果。

九、通过 jenkins 制作自定义镜像并推到 harbor

(一)在 jenkins 容器内部使用宿主机的 docker

  1. 修改 jenkins 宿主机中 docker.sock 权限

编辑
/lib/systemd/system/docker.service 文件,在 ExecStart 前添加以下内容:

ExecStartPre=/bin/chown root:root /var/run/docker.sock
ExecStartPre=/bin/chmod 666 /var/run/docker.sock
  1. 重启服务
systemctl daemon-reload
systemctl restart docker
  1. 在 jenkins 配置中追加数据卷信息

进入 jenkins 容器对应的目录,如
/data/docker/jenkins_docker/,编辑 docker-compose.yml 文件,添加:

- /var/run/docker.sock:/var/run/docker.sock
- /etc/docker/daemon.json:/etc/docker/daemon.json
- /usr/bin/docker:/usr/bin/docker
  1. 重启 jenkins
cd /data/docker/jenkins_docker/
docker-compose restart
  1. 在 jenkins 里运行 docker 命令进行验证
docker exec -it jenkins bash
docker version

(二)添加构建步骤

注意:这里是在原任务基础上进行修改,供参考。

  1. 去掉原构建后操作内容

在任务配置中,移除之前的构建后操作步骤,重新构建流程。

  1. 在代码质量检测后追加一个 “执行 shell” 的构建步骤

添加以下命令:

cp target/demo1.jar docker/
docker build -t demo1:$tag docker/
docker login -u admin -p Harbor12345 192.168.1.111:80
docker tag demo1:$tag 192.168.1.111:80/repo/demo1:$tag
docker push 192.168.1.111:80/repo/demo1:$tag

(三)构建任务并确认镜像是否成功推送到 harbor 上

构建任务后,登录 harbor 平台,查看指定项目的镜像是否已成功推送。

十、jenkins 通知目标服务器部署项目

(一)在目标服务器上准备好要启动服务的脚本

在目标服务器上创建
/data/myProjects/demo1_deploy.sh
脚本,内容如下:

#!/bin/bash
# 用法:
# sh./demo1_deploy.sh 192.168.1.111:80 repo demo1 v1.0.0 8081 8080

# 接收的参数
harbor_addr=$1
harbor_repo=$2
project=$3
version=$4
host_port=$5
container_port=$6

# 脚本执行记录的日志
log=/data/myProjects/demo1_deploy.log

# 镜像地址
image=$harbor_addr/$harbor_repo/$project
imageAddr=$image:$version

# 获取指定镜像地址的容器信息
containerId=`docker ps -a | grep -w $project | awk '{print $1}'`

# 获取指定服务的镜像信息
imageId=`docker images | grep -w $image | grep $version | awk '{print $3}'`

echo "---------------开始时间: `date`---------------" &>> $log

# 判定指定服务是否正在运行,有则停止
if [ "$containerId"!= "" ]; then
  docker stop $containerId
  docker rm $containerId
  echo "成功停止 $project 服务的容器: $containerId" &>> $log
fi

# 判定指定镜像是否存在,有则删除
if [ "$imageId"!= "" ]; then
  docker rmi -f $imageId
  echo "成功删除 $imageAddr 的镜像: $imageId" &>> $log
fi

# 登录镜像仓库
#docker login -u admin -p Harbor12345 $harbor_addr

# 拉取镜像
echo "拉取镜像中..." &>> $log
docker pull $imageAddr &>> $log

# 启动服务
echo "启动服务中..." &>> $log
docker run -d -p $host_port:$container_port --name $project $imageAddr &>> $log

# 判定服务是否启动正常
if [ $? == 0 ]; then
  echo "服务 $project:$version 启动正常!" &>> $log
else
  echo "服务 $project:$version 启动失败!" &>> $log
fi

echo "---------------结束时间: `date`---------------" &>> $log

(二)在任务配置中添加构建后的操作

注意:这里在原有任务的基础上进行修改,供参考。

  1. 追加两个文本参数

在任务配置的参数化构建部分,添加 host_port 和 container_port 两个参数。

  1. 修改构建后的操作内容

将构建后操作修改为:

sh /data/myProjects/demo1_deploy.sh 192.168.1.111:80 repo demo1 $tag $host_port $container_port

(三)构建任务并确认

  1. 构建任务

点击构建按钮,启动任务构建。

  1. 确认目标服务器已成功拉取并启动指定服务

登录目标服务器,查看服务是否已成功启动,可通过 docker ps 命令查看容器运行状态。

  1. 浏览器访问确认服务是否正常

在浏览器输入服务对应的地址,查看页面是否正常显示。

十一、创建流水线任务

(一)流水线初认识

  1. 流水线创建

在 jenkins 平台创建一个流水线任务,选择流水线项目类型。

  1. 流水线脚本语法

以下是一个简单的流水线脚本示例:

pipeline {
    // 指定任务在哪个 jenkins 集群节点中执行
    agent any

    // 声明全局变量,方便后面使用
    environment {
        key1 = 'value1'
    }

    // 具体任务流程
    stages {
        stage('流程1:拉取 gitlab 代码') {
            steps {
                echo '流程1:成功'
            }
        }
        stage('流程2:通过 maven 构建项目') {
            steps {
                echo '流程2:成功'
            }
        }
        stage('流程3:通过 SonarQube 做代码质量检测') {
            steps {
                echo '流程3:成功'
            }
        }
        stage('流程4:通过 Docker 制作自定义镜像') {
            steps {
                echo '流程4:成功'
            }
        }
        stage('流程5:将自定义镜像推送到 Harbor 镜像仓库') {
            steps {
                echo '流程5:成功'
            }
        }
        stage('流程6:通知目标服务器拉取并启动服务') {
            steps {
                echo '流程6:成功'
            }
        }
    }
}
  1. 任务构建后的效果

构建流水线任务,查看控制台输出,了解每个阶段的执行情况。

(二)通过 Jenkinsfile 维护流水线脚本

  1. 在 gitlab 仓库中创建名为 Jenkinsfile 的文件

在项目的 gitlab 仓库根目录创建 Jenkinsfile。

  1. 把脚本内容放到 Jenkinsfile 文件中

将上述流水线脚本复制到 Jenkinsfile 中,并根据实际情况进行调整。

  1. 修改流水线任务配置

在 jenkins 流水线任务配置中,选择 “Pipeline script from SCM”,指定 gitlab 仓库地址和 Jenkinsfile 的路径。

  1. 重新构建流水线任务,确认配置是否生效

再次构建流水线任务,查看是否按照 Jenkinsfile 中的配置执行任务。

十二、流水线任务:拉取 gitlab 代码

(一)在任务中添加 git 参数

在流水线任务配置的参数化构建部分,添加需要的 git 参数,如分支名称参数等。

(二)通过版本控制示例生成拉取 git 代码的流水线脚本

在 jenkins 流水线语法生成器中,选择 “checkout: Check out from version control” 示例类型,生成如下流水线脚本:

checkout scmGit(branches: [[name: '$tag']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.1.111:8929/root/demo.git']])

(三)更新代码仓库 Jenkinsfile 文件中的脚本内容

在 Jenkinsfile 的 stage('流程1:拉取 gitlab 代码') 部分,更新如下:

stage('流程1:拉取 gitlab 代码') {
    steps {
        checkout scmGit(branches: [[name: '$tag']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.1.111:8929/root/demo.git']])
    }
}

(四)构建流水线任务,确认是否能拉取到指定版本

构建流水线任务后,查看 jenkins 控制台输出,确认是否成功拉取到指定 tag 版本的代码。若出现错误,可根据错误提示排查问题,常见问题如网络连接失败、权限不足、分支名称错误等。

十三、流水线任务:通过 maven 构建项目

(一)通过 shell 脚本示例生成 maven 构建项目的流水线脚本

在 jenkins 流水线语法生成器中,选择 “sh: Shell Script” 示例类型,对于执行 mvn clean package -DskipTests 命令,生成如下流水线脚本:

sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'

(二)更新代码仓库 Jenkinsfile 文件中的脚本内容

在 Jenkinsfile 的 stage('流程2:通过 maven 构建项目') 部分,更新为:

stage('流程2:通过 maven 构建项目') {
    steps {
        sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
    }
}

(三)构建流水线任务,确认是否能正常通过 maven 构建项目

构建流水线任务后,关注 jenkins 控制台输出,查看 maven 构建过程是否顺利。若构建失败,检查 maven 配置是否正确,如本地仓库地址、私服认证信息等,同时留意依赖下载是否出错,可能需要清理本地 maven 缓存重新构建。

十四、流水线任务:通过 SonarQube 做代码质量检测

(一)通过 shell 脚本示例生成 sonarqube 做代码质量检测的流水线脚本

在 jenkins 流水线语法生成器中,选择 “sh: Shell Script” 示例类型,对于执行 SonarQube 扫描的命令:

/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=squ_de2616c40fa44d278da96de19836d8a4c1761bbb

生成如下流水线脚本:

sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=squ_de2616c40fa44d278da96de19836d8a4c1761bbb'

(二)更新代码仓库 Jenkinsfile 文件中的脚本内容

注意projectKey 值不能含中文

在 Jenkinsfile 的 stage('流程3:通过 SonarQube 做代码质量检测') 部分,更新为:

stage('流程3:通过 SonarQube 做代码质量检测') {
    steps {
        sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=demo1 -Dsonar.java.binaries=./target/ -Dsonar.login=squ_de2616c40fa44d278da96de19836d8a4c1761bbb'
    }
}

(三)构建流水线任务,确认是否能正常通过 SonarQube 做代码质量检测

  1. 确认 jenkins 的任务结果

构建流水线任务后,查看 jenkins 控制台输出,确保 SonarQube 扫描任务执行无报错,若有错误,根据提示排查 SonarQube Scanner 配置、网络连接以及项目代码路径等问题。

  1. 确认 sonarqube 的检测结果

登录 SonarQube 平台,查看对应项目的代码质量检测详情,包括代码异味、漏洞、重复代码等方面的分析报告,依据报告针对性地优化代码质量。

十五、流水线任务:通过 Docker 制作自定义镜像

(一)通过 shell 脚本示例生成制作自定义镜像的流水线脚本

在 jenkins 流水线语法生成器中,选择 “sh: Shell Script” 示例类型,对于执行以下操作的命令:

cp target/demo1.jar docker/
docker build -t demo1:$tag docker/

生成如下流水线脚本:

sh '''cp target/demo1.jar docker/
docker build -t demo1:$tag docker/'''

(二)更新代码仓库 Jenkinsfile 文件中的脚本内容

在 Jenkinsfile 的 stage('流程4:通过 Docker 制作自定义镜像') 部分,更新为:

stage('流程4:通过 Docker 制作自定义镜像') {
    steps {
        sh '''cp target/demo1.jar docker/
docker build -t demo1:$tag docker/'''
    }
}

(三)构建流水线任务,确认是否能正常通过 Docker 制作自定义镜像

  1. 确认 jenkins 的任务结果

构建流水线任务后,查看 jenkins 控制台输出,确保 Docker 构建命令执行无报错,关注镜像构建过程中的日志信息,若出现错误,排查 Dockerfile 编写是否正确、依赖的基础镜像是否可拉取等问题。

  1. 确认 jenkins 服务器中是否存在新制作的镜像

可以在 jenkins 服务器所在的宿主机上,通过 docker images 命令查看是否成功生成了指定的 demo1:$tag 镜像。

(十六)流水线任务:将自定义镜像推送到 Harbor 镜像仓库

(一)通过 shell 脚本示例推送自定义镜像的流水线脚本

同样在 “sh: Shell Script” 示例类型下,对于推送镜像到 Harbor 的操作:

docker login -u admin -p Harbor12345 192.168.1.111:80
docker tag demo1:$tag 192.168.1.111:80/repo/demo1:$tag
docker push 192.168.1.111:80/repo/demo1:$tag

生成的流水线脚本为:

sh '''docker login -u admin -p Harbor12345 192.168.1.111:80
docker tag demo1:$tag 192.168.1.111:80/repo/demo1:$tag
docker push 192.168.1.111:80/repo/demo1:$tag'''

(二)更新代码仓库 Jenkinsfile 文件中的脚本内容

  1. 添加需要的全局变量

在 Jenkinsfile 开头的 environment 块中添加:

environment {
    harborAddr = '192.168.1.111:80'
    harborUser = 'admin'
    harborPass = 'Harbor12345'
    harborRepo = 'repo'
    projectName = 'demo1'
}
  1. 更新流程中的脚本内容

在 stage('流程5:将自定义镜像推送到 Harbor 镜像仓库') 部分,更新为:

stage('流程5:将自定义镜像推送到 Harbor 镜像仓库') {
    steps {
        sh '''docker login -u ${harborUser} -p ${harborPass} ${harborAddr}
docker tag ${projectName}:${tag} ${harborAddr}/${harborRepo}/${projectName}:${tag}
docker push ${harborAddr}/${harbarRepo}/${projectName}:${tag}'''
    }
}

(三)构建流水线任务,确认是否能正常将自定义镜像推送到 harbor 镜像仓库

  1. 确认 jenkins 的任务结果

构建后查看控制台输出,确保登录 Harbor、镜像打标签以及推送操作都顺利执行,若出现认证失败、网络连接问题等,检查相关配置和网络环境。

  1. 确认 harbor 的镜像信息

登录 Harbor 平台,查看指定项目下是否成功推送了 demo1:$tag 镜像,镜像版本、标签等信息是否正确。

十七、流水线任务:通知目标服务器拉取镜像部署项目

(一)在流水线任务配置中添加两个字符参数

在流水线任务的参数化构建配置中,添加 host_port 和 container_port 两个字符参数,用于后续指定目标服务器部署服务的端口映射。

(二)通过 sshPublisher 示例生成通知目标服务器部署项目的流水线脚本

在 jenkins 流水线语法生成器中,选择 “sshPublisher: Send build artifacts over SSH” 示例类型,对于执行部署脚本的命令:

sh /data/myProjects/demo1_deploy.sh 192.168.1.111:80 repo demo1 $tag $host_port $container_port

生成如下流水线脚本:

sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s-master', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'sh /data/myProjects/demo1_deploy.sh 192.168.1.111:80 repo demo1 $tag $host_port $container_port', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])

(三)更新代码仓库 Jenkinsfile 文件中的脚本内容

在 Jenkinsfile 的 stage('流程6:通知目标服务器部署项目') 部分,更新为:

stage('流程6:通知目标服务器部署项目') {
    steps {
        sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s-master', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "sh /data/myProjects/demo1_deploy.sh $harborAddr $harborRepo $projectName $tag $host_port $container_port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
    }
}

(四)构建流水线任务,确认目标服务器是否已成功部署项目

  1. 确认 jenkins 的任务结果

构建后查看控制台输出,确保通过 SSH 执行部署脚本无报错,若出现连接失败、权限不足等问题,排查目标服务器的 SSH 配置、用户名密码是否正确。

  1. 确认目标服务器项目部署情况

登录目标服务器,通过 docker ps 等命令查看容器是否成功启动,服务是否正常运行。

  1. 浏览器访问确认是否正常

在浏览器输入目标服务对应的地址,查看页面是否能正常访问,验证服务功能是否完整。

十八、将任务构建结果以钉钉方式通知给管理员

(一)在 jenkins 插件管理中安装 DingTalk 插件

打开 jenkins 插件管理页面,搜索并安装 DingTalk 插件。

(二)创建一个个人用的企业 / 团队

根据钉钉的使用流程,创建一个用于接收通知的个人企业或团队。

(三)添加一个自定义类型的群机器人

在创建的团队或企业中,添加一个自定义群机器人,并获取其 Webhook 地址,例如:

https://oapi.dingtalk.com/robot/send?access_token=8c3c66f11343e23b8ebb3eee08294098be2c5bb167e2786ec53f855f51e526e9

(四)在 jenkins 系统管理中找到钉钉的配置入口

进入 jenkins 系统管理页面,找到与 DingTalk 相关的配置项。

(五)修改钉钉全局配置

在配置页面填写群机器人的 Webhook 等信息,完成钉钉通知的全局配置。

(六)在代码仓库 Jenkinsfile 文件中追加钉钉通知的内容

在 Jenkinsfile 的适当位置,添加触发钉钉通知的代码,例如在任务成功或失败的阶段发送通知,告知构建结果。

post {
    success {
        dingtalk(
            robot: 'Jenkins-DingDing',
            type: 'MARKDOWN',
            title: "success: ${JOB_NAME}",
            text: ["- 构建成功: ${JOB_NAME}\n- 版本: ${tag}\n- 持续时间: ${currentBuild.durationString}"]
        )
    }
    failure {
        dingtalk(
            robot: 'Jenkins-DingDing',
            type: 'MARKDOWN',
            title: "success: ${JOB_NAME}",
            text: ["- 构建失败: ${JOB_NAME}\n- 版本: ${tag}\n- 持续时间: ${currentBuild.durationString}"]
        )
    }
}

(七)构建流水线任务,确认钉钉群是否能正常收到通知

构建流水线任务后,查看钉钉群是否及时收到构建结果通知,若未收到,检查插件配置、网络连接以及通知代码逻辑。

十九、自动化 CI 操作:代码上传后自动部署最新版项目

(一)安装 Gitlab 插件

在 jenkins 插件管理页面,搜索并安装 Gitlab 插件,用于实现与 Gitlab 的集成。

(二)创建一个自动化 CI 的任务

  1. 从已有流水线任务中复制一个做测试

为了快速搭建自动化 CI 任务,复制一个已有的功能相近的流水线任务,并进行后续修改。

  1. 修改配置,去掉现有的 “参数化构建过程”

根据自动化部署的需求,去除不必要的参数化构建设置,简化任务配置。

  1. 更新 Jenkinsfile 文件中 tag 的值

在 Jenkinsfile 中,将涉及版本控制的 tag 变量值修改为 latest,以便每次代码上传都拉取并部署最新版本。

(三)打开任务的构建触发器,获取指向 jenkins 的 gitlab webhook 地址

在自动化 CI 任务的配置页面,找到构建触发器部分,开启并获取指向 jenkins 的 GitLab webhook URL,例如:

http://192.168.1.112:8080/project/%E6%B5%81%E6%B0%B4%E7%BA%BF%E4%BB%BB%E5%8A%A1-%E6%B5%8B%E8%AF%95

(四)在 gitlab 中添加 jenkins 的 Webhooks

  1. 打开 “允许来自 webhooks 和集成电路对本地网络的请求”

在 Gitlab 项目设置中,找到网络相关配置,开启允许本地网络请求的选项,确保 Gitlab 能向 jenkins 发送 webhook 请求。

  1. 添加前面获取到的 Webhook 信息

在 Gitlab 的 Webhooks 配置页面,添加之前在 jenkins 中获取到的 Webhook 地址,完成两者的集成配置。

(五)在 jenkins 系统配置中关闭 “Enable authentication for '/project' end-point”

注意:这里不关闭,gitlab 中测试 jenkins 的 Webhook 时会报如下图的错误。进入 jenkins 系统配置页面,找到对应的认证选项并关闭,避免因认证问题导致 Webhook 测试失败。

(六)在 gitlab 中测试 jenkins 的 Webhook 地址

在 Gitlab 项目页面,触发 Webhook 测试,此时会发现 jenkins 中有个构建任务被触发了,验证了两者集成的有效性。

(七)准备部署项目的 yml 文件

在代码仓库中创建一个 demo1-deploy.yml 文件,内容如下:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: demo
  name: demo1
  labels:
    app: demo1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo1
  template:
    metadata:
      labels:
        app: demo1
    spec:
      containers:
        - name: demo1
          image: 192.168.1.111:80/repo/demo1:latest
          imagePullPolicy: Always
          ports:
            - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  namespace: demo
  labels:
    app: demo1
  name: demo1
spec:
  selector:
    app: demo1
  ports:
  - port: 8080
    targetPort: 8080
  type: NodePort
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: demo
  name: demo1
spec:
  ingressClassName: ingress
  rules:
  - host: demo1.yoson.test
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: demo1
            port:
              number: 8080

注意:需要提前创建好名为 demo 的命名空间。

kubectl create ns demo

(八)更改任务中目标服务器需要执行的内容

  1. 获取新的流水线脚本内容

在 jenkins 流水线语法生成器中,选择 “sshPublisher: Send build artifacts over SSH” 示例类型,对于部署 demo1-deploy.yml 文件的操作:

kubectl apply -f /data/myProjects/demo1-deploy.yml
kubectl rollout restart deployment demo1 -n demo

生成如下流水线脚本:

sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s-master', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''kubectl apply -f /data/myProjects/demo1-deploy.yml
kubectl rollout restart deployment demo1 -n demo''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'demo1-deploy.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
  1. 更新 Jenkinsfile 中部署项目时的脚本内容

在 Jenkinsfile 的 stage('流程6:通知目标服务器部署项目') 部分,更新为:

stage('流程6:通知目标服务器部署项目') {
    steps {
        sshPublisher(publishers: [sshPublisherDesc(configName: 'k80_master', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''kubectl apply -f /data/myProjects/${projectName}-deploy.yml
        kubectl rollout restart deployment ${projectName} -n demo''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'demo1-deploy.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
    }
}

(九)推送新版项目代码,检查部署效果

  1. 更新代码并推送到 gitlab

在本地代码仓库进行代码更新,提交并推送至 Gitlab。

  1. 在 jenkins 上确认任务构建状态

登录 jenkins,查看自动化 CI 任务是否被触发,构建过程是否顺利,有无报错。

  1. 在目标服务器确认服务启动状态

登录目标服务器,通过 docker ps、kubectl get pods 等命令查看容器和 pod 的运行状态,确认服务已成功启动。

  1. 页面访问确认效果

在浏览器输入服务对应的地址,查看页面是否正常显示,功能是否正常,验证整个自动化部署流程的有效性。

【附】

【腾讯文档】基于k8s+docker+jenkins的云原生DevOps

https://docs.qq.com/doc/DWFpYeXBuZnh2TXlP


【结语】

至此,我们已经完成了一整套 DevOps 环境的搭建,涵盖代码仓库、持续集成、代码质量检测、镜像仓库以及 k8s 集群等关键部分。通过这些工具的协同运作,能够极大地提升软件开发与部署的效率,助力团队快速迭代产品。在后续的使用过程中,大家可以根据实际项目需求,进一步深入探索各个工具的高级功能,充分发挥 DevOps 的优势。若在搭建或使用过程中遇到问题,欢迎随时交流探讨,祝大家搭建顺利!

相关推荐

GANs为何引爆机器学习?这篇基于TensorFlow的实例教程为你解惑!

「机器人圈导览」:生成对抗网络无疑是机器学习领域近三年来最火爆的研究领域,相关论文层出不求,各种领域的应用层出不穷。那么,GAN到底如何实践?本文编译自Medium,该文作者以一朵玫瑰花为例,详细阐...

高丽大学等机构联合发布StarGAN:可自定义表情和面部特征

原文来源:arXiv、GitHub作者:YunjeyChoi、MinjeChoi、MunyoungKim、Jung-WooHa、SungKim、JaegulChoo「雷克世界」编译:嗯~...

TensorFlow和PyTorch相继发布最新版,有何变化

原文来源:GitHub「机器人圈」编译:嗯~阿童木呀、多啦A亮Tensorflow主要特征和改进在Tensorflow库中添加封装评估量。所添加的评估量列表如下:1.深度神经网络分类器(DNNCl...

「2022 年」崔庆才 Python3 爬虫教程 - 深度学习识别滑动验证码缺口

上一节我们使用OpenCV识别了图形验证码躯壳欧。这时候就有朋友可能会说了,现在深度学习不是对图像识别很准吗?那深度学习可以用在识别滑动验证码缺口位置吗?当然也是可以的,本节我们就来了解下使用深度...

20K star!搞定 LLM 微调的开源利器

LLM(大语言模型)微调一直都是老大难问题,不仅因为微调需要大量的计算资源,而且微调的方法也很多,要去尝试每种方法的效果,需要安装大量的第三方库和依赖,甚至要接入一些框架,可能在还没开始微调就已经因为...

大模型DeepSeek本地部署后如何进行自定义调整?

1.理解模型架构a)查看深度求索官方文档或提供的源代码文件,了解模型的结构、输入输出格式以及支持的功能。模型是否为预训练权重?如果是,可以在预训练的基础上进行微调(Fine-tuning)。是否需要...

因配置不当,约5000个AI模型与数据集在公网暴露

除了可访问机器学习模型外,暴露的数据还可能包括训练数据集、超参数,甚至是用于构建模型的原始数据。前情回顾·人工智能安全动态向ChatGPT植入恶意“长期记忆”,持续窃取用户输入数据多模态大语言模型的致...

基于pytorch的深度学习人员重识别

基于pytorch的深度学习人员重识别Torchreid是一个库。基于pytorch的深度学习人员重识别。特点:支持多GPU训练支持图像的人员重识别与视频的人员重识别端到端的训练与评估简单的re...

DeepSeek本地部署:轻松训练你的AI模型

引言:为什么选择本地部署?在AI技术飞速发展的今天,越来越多的企业和个人希望将AI技术应用于实际场景中。然而,对于一些对数据隐私和计算资源有特殊需求的用户来说,云端部署可能并不是最佳选择。此时,本地部...

谷歌今天又开源了,这次是Sketch-RNN

前不久,谷歌公布了一项最新技术,可以教机器画画。今天,谷歌开源了代码。在我们研究其代码之前,首先先按要求设置Magenta环境。(https://github.com/tensorflow/magen...

Tensorflow 使用预训练模型训练的完整流程

前面已经介绍了深度学习框架Tensorflow的图像的标注和训练数据的准备工作,本文介绍一下使用预训练模型完成训练并导出训练的模型。1.选择预训练模型1.1下载预训练模型首先需要在Tensorf...

30天大模型调优学习计划(30分钟训练大模型)

30天大模型调优学习计划,结合Unsloth和Lora进行大模型微调,掌握大模型基础知识和调优方法,熟练应用。第1周:基础入门目标:了解大模型基础并熟悉Unsloth等工具的基本使用。Day1:大模...

python爬取喜马拉雅音频,json参数解析

一.抓包分析json,获取加密方式1.抓包获取音频界面f12打开抓包工具,播放一个(非vip)视频,点击“媒体”单击打开可以复制URL,发现就是我们要的音频。复制“CKwRIJEEXn-cABa0Tg...

五、JSONPath使用(Python)(json数据python)

1.安装方法pipinstalljsonpath2.jsonpath与Xpath下面表格是jsonpath语法与Xpath的完整概述和比较。Xpathjsonpath概述/$根节点.@当前节点...

Python网络爬虫的时候json=就是让你少写个json.dumps()

大家好,我是皮皮。一、前言前几天在Python白银交流群【空翼】问了一个Python网络爬虫的问题,提问截图如下:登录请求地址是这个:二、实现过程这里【甯同学】给了一个提示,如下所示:估计很多小伙伴和...