jenkins最佳实践(二):Pipeline流水线部署springCloud微服务项目

各位小伙伴们大家好呀,我是小金,本篇文章我们将介绍如何使用Pipeline流水线部署我们自己的微服务项目,之前没怎么搞过部署相关的,以至于构建流水线的过程中中也遇到了很多自己以前没有考虑过的问题,特写此篇,用于个人记录与分享。

一 、基础插件安装

1.1 安装与配置Maven插件
安装Maven 插件。

在这里插入图片描述

搜索 maven,选中 Maven Integration 进行安装。

在这里插入图片描述

配置maven工具

安装完成后,需要配置Maven工具,我们的自动化构建任务是使用 Maven 构建的,需要告知Jenkins Maven的安装位置。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 安装与配置ndoe插件
安装NodeJS插件

在这里插入图片描述

配置NodeJS工具

在这里插入图片描述

1.3 安装与配置ssh插件
安装ssh插件

这个插件的作用就是将 Jenkins 构建的 SpringBoot 项目的 jar 包发布的业务服务器上。

在这里插入图片描述

配置业务服务器

找到系统配置
在这里插入图片描述

拉到最下面找到 Publish over SSH,安装完 SSH 插件才有这个选项。

在这里插入图片描述

Server是可以有多个的,新增一个 SSH Server。
在这里插入图片描述
在这里插入图片描述

在最下面有个测试的按钮,可以测试一下配置有没有问题,没有问题,保存配置。

二 、构建微服务项目流水线

2.1 创建构建任务

在这里插入图片描述

编写流水线脚本,依照需求实现不同的步骤,这里贴出博主的一个配置仅供参考
在这里插入图片描述

2.2 shell脚本

1、jenkins脚本命令,这里博主的服务器和jenkins是在一台服务器上,所以在jar发送阶段直接使用的shell命令,如果不在一台服务器上则使用ssh插件,这里不在赘述

pipeline {agent anytools {maven 'maven3'}stages {stage('拉取代码') {steps {git branch: 'dev', credentialsId: '20250730-853d-40dc-be30-xxxxxxxx', url: 'https://gitee.com/xxx/xxx.git'echo '拉取代码完成!'}}stage('执行构建') {steps {dir('kingoffice-auth') {sh """mvn --versionmvn clean package -DskipTests"""echo '执行构建成功!'}}}stage('执行更新安装包文件进程') {steps {script {def currentTime = new Date().format("yyyyMMddHHmmss")def jarFile = 'kingoffice-auth/target/kingoffice-auth.jar'def targetDir = '/kim/project/auth/'def targetFile = "${targetDir}kingoffice-auth.jar"def dockerFile = 'docker/kim/auth/Dockerfile'def deployScript = 'docker/kim/auth/deploy.sh'// 检查并创建目标目录sh "sudo mkdir -p ${targetDir}"// 检查目标目录是否存在同名 JAR 文件if (fileExists(targetFile)) {// 重命名 JAR 文件def newTargetFile = "${targetDir}kingoffice-auth-${currentTime}.jar"sh "sudo mv ${targetFile} ${newTargetFile}"echo "已重命名文件为: ${newTargetFile}"}// 复制新生成的 JAR 文件sh "sudo cp ${jarFile} ${targetDir}"echo '发送 JAR 文件成功!'// 删除目标目录下的同名 Dockerfile 和 deploy.sh 文件sh "sudo rm -f ${targetDir}Dockerfile"sh "sudo rm -f ${targetDir}deploy.sh"// 复制新的 Dockerfile 和 deploy.sh 文件sh "sudo cp ${dockerFile} ${targetDir}"sh "sudo cp ${deployScript} ${targetDir}"echo '发送 Dockerfile 和 deploy.sh 成功!'}}}stage('构建并启动容器') {steps {script {def targetDir = '/kim/project/auth/'def deployScriptPath = "${targetDir}deploy.sh"// 确保 deploy.sh 脚本具有执行权限sh "sudo chmod +x ${deployScriptPath}"// 执行 deploy.sh 脚本sh "sudo ${deployScriptPath}"echo '执行启动容器完成!'}}}}
}
2.3 部署脚本 deploy.sh

#!/bin/bash# 项目名称
projectName=kingoffice-auth# 年月日时分的时间戳
timestamp=$(date +%Y%m%d%H%M)# 新镜像的名称
newImageName=$projectName:$timestamp# 切换到包含Dockerfile的目录
echo "切换到包含Dockerfile的目录 /kim/project/auth/"
cd /kim/project/auth/ || { echo "切换目录失败,退出脚本"; exit 1; }echo "开始构建新镜像: $newImageName"
# 1.首先使用Dockerfile打镜像
docker build -t $newImageName .
if [ $? -ne 0 ]; then
echo "构建新镜像失败"
exit 1
else
echo "构建新镜像成功"
fiecho "正在停止并删除之前运行的容器..."
# 2.停止并删除之前运行的容器
runningContainerId=$(docker ps | grep "$projectName" | awk '{print $1}')
if [ -n "$runningContainerId" ]; then
docker stop "$runningContainerId" && echo "容器已停止: $runningContainerId"
docker rm "$runningContainerId" && echo "容器已删除: $runningContainerId"
fiecho "正在删除旧镜像..."
# 删除除最新外的所有旧镜像
oldImageTags=$(docker images | grep "$projectName" | awk '{print $2}' | grep -v "$timestamp" | sort | uniq)
for tag in $oldImageTags; dodocker rmi "${projectName}:${tag}" && echo "旧镜像已删除: ${projectName}:${tag}";
doneecho "创建日志目录..."
# 在宿主机上创建logs目录,用于容器挂载,这样查看日志可以直接在宿主机查看,比较方便
mkdir -p ~/kim/project/auth/logsecho "正在运行新的镜像..."
# 3.运行新的镜像
docker run -d -p 9200:9200 --restart=always -v ~/kim/project/auth/logs:/kim/logs $newImageNameif [ $? -eq 0 ]; then
echo "新容器运行成功"
else
echo "新容器运行失败"
exit 1
fi
2.4 使用沙盒生成命令

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
在这里插入图片描述

上述配置完毕后,点击生成流水线脚本,即生成对应的脚本语言,复制到脚本文件中即可。

在这里插入图片描述

流水线创建完成后,就可以进行第一次构建尝试了。

三 、部署vue项目

3.1 创建构建任务创建任务

选择构建一个自由风格的软件项目
在这里插入图片描述

3.2 源码管理

与上述添加远程仓库步骤一致。
在这里插入图片描述

3.3构建环境

勾选 Provider Node & npm bin/folder to PATH
在这里插入图片描述

3.4 构建步骤:

执行构建的时候,执行 npm 命令进行构建就可以了,所以在 Build Step 选择执行 shell:
在这里插入图片描述

3.5 shell命令
# 安装依赖
npm install --registry=https://registry.npmmirror.com
# 构建项目
npm run build:prod
# 将构建结果打包
zip -r dist.zip dist
echo "打包成功"
# 检查/kim/nginx/html/目录下是否存在dist.zip文件,并进行重命名处理
if [ -f "/kim/nginx/html/dist.zip" ]; thensudo mv /kim/nginx/html/dist.zip "/kim/nginx/html/dist_$(date +%Y%m%d%H%M%S).zip"
fi
# 将dist.zip文件移动到/kim/nginx/html/目录下
sudo mv dist.zip /kim/nginx/html/
# 删除/kim/nginx/html/目录下的dist文件夹
sudo rm -rf /kim/nginx/html/dist
# 解压dist.zip至/kim/nginx/html/目录,完成部署
sudo unzip /kim/nginx/html/dist.zip -d /kim/nginx/html/
echo "部署成功"

四 、问题总结

4.1 构建时间 相差八个小时

系统管理->脚本命令行->运行下面代码

在这里插入图片描述

System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone','Asia/Shanghai')
4.2 构建过程报错 找不到maven

查看构建脚本 是否有此命令,此命令是告知jenkins使用哪个maven进行构建,博主使用的版本,不输此命令,会报mvn找不到的错误。

 tools {maven 'maven3'}
4.3 微服务私有jar找不到

博主最初maven使用的是阿里云的公开镜像,但是在微服务中有些依赖使我们项目生成的关系依赖jar,这在公共平台是不可能找到的,博主想到的办法是搭建个人私服仓库,但是这个成本过大,于是就使用了阿里云免费提供的私人云效仓库。创建过程不再赘述,这里只讲重点遇到的问题。
1、maven配置文件,直接使用阿里settings文件即可,或者按需配置。

在这里插入图片描述

2、第一次推送成功,第二次推送取失败
1、私有jar上传前改一下版本号
2、开启允许覆盖指令。

在这里插入图片描述

4.4 执行shell命令脚本权限不够

jenkins使用的用户一般默认是jenkins,有两种解决方案
1、将jenkins改成root 一般配置文件是在这个目录下 /etc/sysconfig/jenkins
2、赋予jenkins用户权限
编辑 /etc/sudoers 文件,在文件最下为 Jenkins 用户赋予无密码执行 sudo 的权限
jenkins ALL=(ALL) NOPASSWD:ALL

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/404578.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Redis】数据类型详解及其应用场景

目录 Redis 常⻅数据类型预备知识基本全局命令小结 数据结构和内部编码单线程架构引出单线程模型为什么单线程还能这么快 Redis 常⻅数据类型 Redis 提供了 5 种数据结构,理解每种数据结构的特点对于 Redis 开发运维⾮常重要,同时掌握每种数据结构的常⻅…

Postman接口测试项目实战

第 1 章 什么是接口测试 1.1、为什么要进行接口测试 目前除了特别Low的公司外,开发都是前后端分离的,就是说前端有前端的工程师进行编码,后端有后端的工程师进行编码,前后端进行数据基本都是通过接口进行交互的。 1.2、接口测…

zookeeper源码分析之事务请求处理

一.参考 zookeeper启动和选举的源码分析参考之前的帖子. 二.源码 1.职责链模式. 每次经过的processor都是异步处理,加入当前processor的队列,然后新的线程从队列里面取出数据处理. PrepRequestProcessor 检查ACL权限,创建ChangeRecord. SyncRequest…

ArcGIS空间自相关Moran‘s I——探究人口空间格局的20年变迁

先了解什么是莫兰指数? 莫兰指数(Morans I)是一种用于衡量空间自相关性的统计量,即它可以帮助我们了解一个地理区域内的观测值是否彼此相关以及这种相关性的强度和方向。 莫兰指数分类: 全局莫兰指数 (Global Moran…

聊聊如何利用ingress-nginx实现应用层容灾

前言 容灾是一种主动的风险管理策略,旨在通过构建和维护异地的冗余系统,确保在面临灾难性事件时,关键业务能够持续运作,数据能够得到保护,从而最大限度地减少对组织运营的影响和潜在经济损失。因此容灾的重要性不言而…

zabbix实战-磁盘空间告警

1.创建监控项 选择&#xff1a;键值&#xff1a;vfs.fs.size[fs,<mode>] 。 直接写 vfs.fs.size[fs,<mode>]是不出数据的。我们要写具体的值 &#xff1a;vfs.fs.size[/,free] &#xff0c;这个表示查看根的剩余空间。 2.创建图形 为磁盘剩余空间监控项创建图形&am…

redis 遍渐进式历

1.scan cursor [match pattern] [coutn] [type]:以渐进式的方式进行建的遍历 cursor:是光标 指向当前遍历的位置 设置成0表示当前从0开始获取 math parttern &#xff1a;和keys命令一样的 keys * count: 限制一次遍历能够获取到多少个 元素默认是10 type :这次遍历只想获取…

[Python学习日记-10] Python中的流程控制(if...else...)

[Python学习日记-10] Python中的流程控制&#xff08;if...else...&#xff09; 简介 缩进 单分支 双分支 多分支 练习 简介 假如把写程序比做走路&#xff0c;那我们到现在为止&#xff0c;一直走的都是直路&#xff0c;还没遇到过分叉口&#xff0c;想象现实中&#x…

【python】Python实现XGBoost算法的详细理论讲解与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Python编码系列—Python数据可视化:Matplotlib与Seaborn的实战应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

Ps:首选项 - 单位与标尺

Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K Photoshop 首选项中的“单位与标尺” Units & Rulers选项卡允许用户根据工作需求定制 Photoshop 的测量单位和标尺显示方式。这对于保持工作的一致性和精确性&#xff0c;尤其是在跨设备或跨平台…

专题--自底向上的计算机网络(物理层)

目录 计算机网络概述 物理层 数据链路层 网络层 运输层 应用层 网络安全 详细见http://t.csdnimg.cn/MY5aI http://t.csdnimg.cn/8Ipa4 http://t.csdnimg.cn/uvMxS 信道复用技术不仅在物理层有运用&#xff0c;在数据链路层也确实需要信道复用技术。‌ 数据链路层是…

第N8周:使用Word2vec实现文本分类

本文为365天深度学习训练营 中的学习记录博客原作者&#xff1a;K同学啊 一、数据预处理 任务说明: 本次将加入Word2vec使用PyTorch实现中文文本分类&#xff0c;Word2Vec 则是其中的一种词嵌入方法&#xff0c;是一种用于生成词向量的浅层神经网络模型&#xff0c;由Tomas M…

隐语隐私计算实训营「数据分析」第 5 课:隐语PSI介绍及开发实践

深入理解隐语(SecretFlow)中的PSI技术 隐私集合求交(Private Set Intersection, PSI)是隐私计算中的一个重要技术,它允许多方在不泄露自己数据的前提下找出共同的数据交集。在本文中,我们将深入探讨SecretFlow(隐语)中PSI的实现和应用。 PSI的基本概念 PSI是一种特殊的安全多…

鸿蒙内核源码分析(时钟任务篇)

时钟概念 时间是非常重要的概念&#xff0c;我们整个学生阶段有个东西很重要,就是校园铃声. 它控制着上课,下课,吃饭,睡觉的节奏.没有它学校的管理就乱套了,老师拖课想拖多久就多久,那可不行,下课铃声一响就是在告诉老师时间到了,该停止了让学生HAPPY去了. 操作系统也一样&…

php源码编译与初始化

1 php源码编译 解压 yum install -y bzip2 # 安装解压工具 tar -xf php-7.4.12.tar.bz2 # 解压文件./condigure ./configure --prefix/usr/local/php --with-config-file-path/usr/local/php/etc --enable-fpm --with-fpm-usernginx --with-fpm-groupnginx --with-curl --wi…

线程面试题

1.JDK自带的线程池有哪些&#xff1f; 2.线程池中核心线程数与最大线程数与缓冲任务队列的关系&#xff1f; 先使用核心线程执行任务。 当核心线程不足时&#xff0c;新任务入队列等待。 当队列满且线程数未达最大值时&#xff0c;增加非核心线程执行任务。 当队列满且线程…

Leetcode每日刷题之209.长度最小的子数组(C++)

1.题目解析 根据题目我们知道所给的数组均是正整数&#xff0c;我们需要找到的是该数组的子数组&#xff0c;使其子数组内所有元素之和大于或等于给出的目标数字target&#xff0c;然后返回其长度&#xff0c;最终找出所以满足条件的子数组&#xff0c;并且要返回长度最小的子数…

网络硬盘录像机NVR程序源码海思3520D NVR 安防监控智能升级运用方案

随着安防技术的不断发展&#xff0c;传统的监控系统正逐步向智能化方向转变。海思Hi3520D作为一款高性能的网络视频处理芯片&#xff0c;在NVR&#xff08;网络视频录像机&#xff09;领域有着广泛的应用。本方案旨在探讨如何利用海思Hi3520D芯片的强大功能对现有的NVR系统进行…

vue2使用天地图

需求&#xff1a;用vue2使用天地图展示对应点位数据以及开发中出现的问题等&#xff0c;其实天地图的写法和百度地图差不多 注意&#xff01;&#xff01;&#xff01;天地图的接口不稳定&#xff0c;时常报错418&#xff0c;官网也是一样的情况&#xff0c;推荐还是使用百度或…