----- 测试篇 -----
一、使用 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
- 修改 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
- 重启服务
systemctl daemon-reload
systemctl restart docker
- 在 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
- 重启 jenkins
cd /data/docker/jenkins_docker/
docker-compose restart
- 在 jenkins 里运行 docker 命令进行验证
docker exec -it jenkins bash
docker version
(二)添加构建步骤
注意:这里是在原任务基础上进行修改,供参考。
- 去掉原构建后操作内容
在任务配置中,移除之前的构建后操作步骤,重新构建流程。
- 在代码质量检测后追加一个 “执行 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
(二)在任务配置中添加构建后的操作
注意:这里在原有任务的基础上进行修改,供参考。
- 追加两个文本参数
在任务配置的参数化构建部分,添加 host_port 和 container_port 两个参数。
- 修改构建后的操作内容
将构建后操作修改为:
sh /data/myProjects/demo1_deploy.sh 192.168.1.111:80 repo demo1 $tag $host_port $container_port
(三)构建任务并确认
- 构建任务
点击构建按钮,启动任务构建。
- 确认目标服务器已成功拉取并启动指定服务
登录目标服务器,查看服务是否已成功启动,可通过 docker ps 命令查看容器运行状态。
- 浏览器访问确认服务是否正常
在浏览器输入服务对应的地址,查看页面是否正常显示。
十一、创建流水线任务
(一)流水线初认识
- 流水线创建
在 jenkins 平台创建一个流水线任务,选择流水线项目类型。
- 流水线脚本语法
以下是一个简单的流水线脚本示例:
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:成功'
}
}
}
}
- 任务构建后的效果
构建流水线任务,查看控制台输出,了解每个阶段的执行情况。
(二)通过 Jenkinsfile 维护流水线脚本
- 在 gitlab 仓库中创建名为 Jenkinsfile 的文件
在项目的 gitlab 仓库根目录创建 Jenkinsfile。
- 把脚本内容放到 Jenkinsfile 文件中
将上述流水线脚本复制到 Jenkinsfile 中,并根据实际情况进行调整。
- 修改流水线任务配置
在 jenkins 流水线任务配置中,选择 “Pipeline script from SCM”,指定 gitlab 仓库地址和 Jenkinsfile 的路径。
- 重新构建流水线任务,确认配置是否生效
再次构建流水线任务,查看是否按照 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 做代码质量检测
- 确认 jenkins 的任务结果
构建流水线任务后,查看 jenkins 控制台输出,确保 SonarQube 扫描任务执行无报错,若有错误,根据提示排查 SonarQube Scanner 配置、网络连接以及项目代码路径等问题。
- 确认 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 制作自定义镜像
- 确认 jenkins 的任务结果
构建流水线任务后,查看 jenkins 控制台输出,确保 Docker 构建命令执行无报错,关注镜像构建过程中的日志信息,若出现错误,排查 Dockerfile 编写是否正确、依赖的基础镜像是否可拉取等问题。
- 确认 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 文件中的脚本内容
- 添加需要的全局变量
在 Jenkinsfile 开头的 environment 块中添加:
environment {
harborAddr = '192.168.1.111:80'
harborUser = 'admin'
harborPass = 'Harbor12345'
harborRepo = 'repo'
projectName = 'demo1'
}
- 更新流程中的脚本内容
在 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 镜像仓库
- 确认 jenkins 的任务结果
构建后查看控制台输出,确保登录 Harbor、镜像打标签以及推送操作都顺利执行,若出现认证失败、网络连接问题等,检查相关配置和网络环境。
- 确认 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)])
}
}
(四)构建流水线任务,确认目标服务器是否已成功部署项目
- 确认 jenkins 的任务结果
构建后查看控制台输出,确保通过 SSH 执行部署脚本无报错,若出现连接失败、权限不足等问题,排查目标服务器的 SSH 配置、用户名密码是否正确。
- 确认目标服务器项目部署情况
登录目标服务器,通过 docker ps 等命令查看容器是否成功启动,服务是否正常运行。
- 浏览器访问确认是否正常
在浏览器输入目标服务对应的地址,查看页面是否能正常访问,验证服务功能是否完整。
十八、将任务构建结果以钉钉方式通知给管理员
(一)在 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 的任务
- 从已有流水线任务中复制一个做测试
为了快速搭建自动化 CI 任务,复制一个已有的功能相近的流水线任务,并进行后续修改。
- 修改配置,去掉现有的 “参数化构建过程”
根据自动化部署的需求,去除不必要的参数化构建设置,简化任务配置。
- 更新 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
- 打开 “允许来自 webhooks 和集成电路对本地网络的请求”
在 Gitlab 项目设置中,找到网络相关配置,开启允许本地网络请求的选项,确保 Gitlab 能向 jenkins 发送 webhook 请求。
- 添加前面获取到的 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
(八)更改任务中目标服务器需要执行的内容
- 获取新的流水线脚本内容
在 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)])
- 更新 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)])
}
}
(九)推送新版项目代码,检查部署效果
- 更新代码并推送到 gitlab
在本地代码仓库进行代码更新,提交并推送至 Gitlab。
- 在 jenkins 上确认任务构建状态
登录 jenkins,查看自动化 CI 任务是否被触发,构建过程是否顺利,有无报错。
- 在目标服务器确认服务启动状态
登录目标服务器,通过 docker ps、kubectl get pods 等命令查看容器和 pod 的运行状态,确认服务已成功启动。
- 页面访问确认效果
在浏览器输入服务对应的地址,查看页面是否正常显示,功能是否正常,验证整个自动化部署流程的有效性。
【附】
【腾讯文档】基于k8s+docker+jenkins的云原生DevOps
https://docs.qq.com/doc/DWFpYeXBuZnh2TXlP
【结语】
至此,我们已经完成了一整套 DevOps 环境的搭建,涵盖代码仓库、持续集成、代码质量检测、镜像仓库以及 k8s 集群等关键部分。通过这些工具的协同运作,能够极大地提升软件开发与部署的效率,助力团队快速迭代产品。在后续的使用过程中,大家可以根据实际项目需求,进一步深入探索各个工具的高级功能,充分发挥 DevOps 的优势。若在搭建或使用过程中遇到问题,欢迎随时交流探讨,祝大家搭建顺利!