当前位置: 首页 > news >正文

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

相关文章:

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

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

第2章 C语言基础知识

第2章 C语言基础知识 1.printf()函数 在控制台输出数据,需要使用输出函数,C语言常用的输出函数为printf()。 printf()函数为格式化输出函数,其功能是按照用户指定的格式将数据输出到屏幕上。 printf(“格式控制字符串”,[输出列表]); 格式控…...

鹭鹰优化算法SBOA优化RBF神经网络的扩散速度实现多数入多输出数据预测,可以更改数据集(MATLAB代码)

一、鹭鹰优化算法介绍 鹭鹰优化算法(Secretary Bird Optimization Algorithm, SBOA)是一种新型的元启发式算法,它于2024年4月由Youfa Fu等人提出,并发表在SCI人工智能二区顶刊《Artificial Intelligence Review》上。该算法的灵感…...

MySQL基础练习题48-连续出现的数字

目录 题目 准备数据 分析数据 题目 找出所有至少连续出现三次的数字。 准备数据 ## 创建库 create database db; use db;## 创建表 Create table If Not Exists Logs (id int, num int)## 向表中插入数据 Truncate table Logs insert into Logs (id, num) values (1, 1) i…...

webrtc学习笔记2

音视频采集和播放 打开摄像头并将画面显示到页面 1. 初始化button、video控件 2. 绑定“打开摄像头”响应事件onOpenCamera 3. 如果要打开摄像头则点击 “打开摄像头”按钮,以触发onOpenCamera事件的调用 4. 当触发onOpenCamera调用时 a. 设置约束条件&#xff0c…...

Simple RPC - 06 从零开始设计一个服务端(上)_注册中心的实现

文章目录 Pre核心内容服务端结构概述注册中心的实现1. 注册中心的架构2. 面向接口编程的设计3. 注册中心的接口设计4. SPI机制的应用 小结 Pre Simple RPC - 01 框架原理及总体架构初探 Simple RPC - 02 通用高性能序列化和反序列化设计与实现 Simple RPC - 03 借助Netty实现…...

【深度学习】基于Transformers的大模型推理框架

本文旨在介绍基于transformers的decoder-only语言模型的推理框架。与开源推理框架不同的是: 本框架没有利用额外的开源推理仓库,仅基于huggingface,transformers,pytorch等原生工具进行推理,适合新手学习大模型推理流…...

电脑监控怎样看回放视频?一键解锁电脑监控回放,守护安全不留死角!高效员工电脑监控,回放视频随时查!

你是否曾好奇那些键盘敲击背后的秘密?电脑监控不仅是守护企业安全的隐形盾牌,更是揭秘高效与合规的魔法镜!一键解锁安企神监控回放,就像打开时间宝盒,让过去的工作瞬间跃然眼前。无论是精彩瞬间还是潜在风险&#xff0…...

【一起学Rust | 框架篇 | Tauri2.0框架】tauri中rust和前端的相互调用(rust调用前端)

文章目录 前言1. rust中调用前端2. 如何向前端发送事件3. 前端监听事件4. 执行js代码 前言 近期Tauri 2.0 rc版本发布,2.0版本迎来第一个稳定版本,同时官方文档也进行了更新。Tauri是一个使用Rust构建的框架,可以让你使用前端技术来构建桌面…...

deque容器

deque容器的基本概念 deque 是 C 标准库中的双端队列(double-ended queue)容器,提供了在两端进行插入和删除操作的功能。 deque与vector区别: vector对于头部的插入删除效率低,数据量越大效率越低。deque相对而言&am…...

Redis远程字典服务器(9)—— 类型补充

类型查询传送门:Understand Redis data types | Docs 一,stream类型 官方文档对于这个类型的解释是:streams是一个数据结构,它表现得像一个 “append-only log”,就是只能往后面添加,底层是字符串&#x…...

VMware虚拟机nat无法联通主机

VMware在nat模式下主机无法ping通虚拟机 原因: 虚拟机和对应的网卡不在一个网段 虚拟机开启了防火墙 解决方法: 首先判断虚拟机的网络ip是否和网卡在一个网段上 判断虚拟机使用的网卡 nat模式在VMware虚拟机中一般只有一个对应的网卡 如图笔者的nat网卡为VM…...

「字符串」详解AC自动机并实现对应的功能 / 手撕数据结构(C++)

目录 前置知识 概述 核心概念:fail指针 作用 构建 图示 Code 成员变量 创建销毁 添加词库 文本扫描 复杂度 Code 前置知识 在此前,你应该首先了解trie树(字典树)的概念: 「字符串」详解Trie&#xff0…...

freecad遭遇网络不同无法安装插件Addon Manager: Unexpected 0 response from server

16:31:18 Addon Manager: Unexpected 0 response from server 16:31:18 Failed to connect to GitHub. Check your connection and proxy settings. 打开freecad的插件管理器时候,有些地方,比如我在家里就不行,在公司就ok。 于是找到了解…...

Ruby模板引擎:构建动态视图的艺术

标题:Ruby模板引擎:构建动态视图的艺术 在Ruby on Rails的世界里,模板引擎是构建动态网页的基石。它们允许开发者将服务器端的逻辑嵌入到HTML中,实现数据的动态展示。本文将深入探讨Ruby中几种常用的模板引擎,包括ERB…...

HarmonyOS NEXT星河版零基础入门(3)

目录 1. 系统弹出框 2.interface转成class类 3.vp/fp 4. 写一个正方形 设置它的宽度 但不设定高度 不论屏幕怎么变实现他的宽高比 5.State 6.图片和资源 7.淘宝镜像 7.1windows 脚本禁用(操作策略 允许npm包的命令可执行) 8. es6&ArkTS中…...

第二十讲 python中的异常结构-try except-else-finally

目录 1.try... except 结构 2. try... 多个except结构 3. try...except...else结构 4. try...except...finally结构 5. return语句和异常处理问题 5.1 异常处理前的 return 5.2异常处理后的 return 5.3 finally 块中的 return 6.常见的异常 1.try... except 结构 try except 是…...

springer 投稿系统中返修注意点

初次提交 初次提交时, manuscript 提交的是 pdf 文件 返修后提交 在经过返修之后需要提交的是注意一下几点: 此时提交的Blined manuscript ,虽然名字没变,但不能再提交pdf 文件, 而需要提交的是可编辑的源文件 .te…...

CSS:display和visiblity

隐藏元素- display:none和visibility:hidden display 属性设置一个元素应如何显示,visibility 属性指定一个元素应可见还是隐藏。 隐藏一个元素可以通过吧display属性设置为“none”,或者把visibility属性设置为“hidden”。但是这两种会产生不同的结果…...

43.x86游戏实战-XXX寻找吸怪坐标

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

Go语言多线程问题

打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...